精华内容
下载资源
问答
  • 拉格朗日插值算法C++实现,简单demo
  • 拉格朗日插值法C++

    2009-11-10 13:37:08
    是源代码0真的不错。自己写的,大家来借鉴吧
  • 在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面...
  • 拉格朗日插值法

    2012-06-04 19:16:01
    这是数值计算第三章的第一个程序----拉格朗日插值法
  • 拉格朗日插值法C++程序实现

    千次阅读 2020-09-19 22:25:26
    使用C++编写拉格朗日插值法程序 程序如下:在这里#include<cstdio> #include<iostream> using namespace std; double function(int num,double x[],double y[],double a){ double fund[num]; for (int ...

    使用C++编写拉格朗日插值法程序

    #include<cstdio>
    #include<iostream>
    using namespace std;
    double function(int num,double x[],double y[],double a){
    	double fund[num];
       for (int i=0;i<num;i++){
         	double sum1=1,sum2=1;
         	for (int j=0;j<num;j++){
    		     if(i!=j){
    		     	sum1=sum1*(x[i]-x[j]);
    		     	sum2=sum2*(a-x[j]);
    			 }
    			 }
    	    fund[i]=sum2/sum1;
    	 } 
    	 double p=0;
    	 for (int i=0;i<num;i++){
    	   p=p+y[i]*fund[i];
    	 } 	   	
    	 printf("%f",p);
    }
    int main(){
      cout<<"输入节点的个数"; 
        int num;
        cin>>num;
        double x[num],y[num];
        for (int i=0;i<num;i++){
        	cout<<"输入第"<<i+1<<"个x的值"; 
    	    cin>>x[i];
    		cout<<"输入第"<<i+1<<"个y的值";
    		cin>>y[i];
    	}
    	cout<<"输入需要求解的值";
    	double aa;
    	cin>>aa;
        function(num,x,y,aa); 
    return 0;
    }
    
    展开全文
  • 这是一个基于计算方法拉格朗日插值法实现的C语言版本的小程序,可以计算不同节点分割下的估计值及其误差值
  • 概要:拉格朗日插值法是数值分析中最重要的方法之一。给定n+1对数组,分别记为(x1,y1),(x2,y2),……,(xn+1,yn+1),通过对这n+1对数组的拟合,可以得到一个n+1次的多项式Pn+1(x),从而将x值代入即可推测y值。当min(x1,...

    学习笔记:拉格朗日插值法的推导以及C++程序的实现

    概要:拉格朗日插值法是数值分析中最重要的方法之一。给定n+1对数组,分别记为(x1,y1),(x2,y2),……,(xn+1,yn+1),通过对这n+1对数组的拟合,可以得到一个n+1次的多项式Pn+1(x),从而将x值代入即可推测y值。当min(x1,x2,……,xn+1)<x<max(x1,x2,x3,……,xn+1)时称为内插,当x<min(x1,x2,……,xn+1)或x>max(x1,x2,……,xn+1)称为外插。一般来说,内插的精度会比外插好。

    一、二个数组的线性拟合

    现在我们有两对数组(x1,y1),(x2,y2),我们要做的是根据这两组数据的变化规律,推测一个任意值x对应的y值是多少。
    预测的方法很多,一个简单的方法是将这两对数组对应的点用直线连起来,然后找出横坐标为x的在这条直线上的点对应的y值是多少。
    例如,我们已知两组数据(2.47,8.64)和(4.33,9.82),现在我们想通过一种方法预测x=3.82时y的值。
    一种简单的方法是将两个点用直线相连,然后取x=3.82时在直线上y的值
    用数学表示这一过程:
    在这里插入图片描述

    其中x1=2.47,y1=8.64,x2=4.33,y2=9.82。x在这个情景中是3.82,y即是我们要求的值。变形一下得:
    在这里插入图片描述

    这个式子具有一定的对称性。

    二、三个数组的拟合

    现在考虑稍微复杂一点的情景。我们有三对这样的数组(x1,y1),(x2,y2),(x3,y3)。若这三点不在同一条直线上,则它们可以确定一条抛物线
    在这里插入图片描述

    所以满足三个线性方程
    在这里插入图片描述

    我们要求的是a,b,c的值,已知的是其中的x1,x2,x3,y1,y2,y3的值。所以我们把a,b,c看作是未知量,写成以下的形式:
    在这里插入图片描述

    所以为了求解a,b,c,等号两边同乘一个矩阵的逆矩阵
    在这里插入图片描述

    其中D是
    在这里插入图片描述

    所以对于满足任意的x值,它的拟合值y为
    在这里插入图片描述

    先把左边的向量和矩阵相乘,记为L,得:
    在这里插入图片描述
    L是一个有一行三列的横向量。此时不妨将L化为更对称的形式。注意到L的每一个元素都含有类似(xi-xj)的因子。将其分别提出来:
    在这里插入图片描述

    注意到提出因子后第二项正好是类似(x-xi)(x-xj)的形式,所以:
    在这里插入图片描述

    所以可见,L具有很好的旋转对称性。
    因此:
    在这里插入图片描述
    在这里插入图片描述
    而D应当是什么形式?注意到当x=x1时y=y1,且把x=x1代入上式时第二和第三项都是0,仅剩第一项。所以第一项的值需要等于y1
    在这里插入图片描述
    解得
    在这里插入图片描述
    很容易验证
    在这里插入图片描述

    又因为(x2-x3)(x-x2)(x-x3)、(x3-x1)(x-x1)(x-x3)和(x1-x2)(x-x1)(x-x2)上总有D的某个因子,因此可以分子分母约分,得:
    在这里插入图片描述

    其中在约分的时候可能出现一些正负号的问题。如第二项约分时(x1-x3)与(x3-x1)差个符号,这时可以调整分母的(x1-x2)变为(x2-x1),保持形式的一致。这就是三个数组的拉格朗日插值公式。

    三、多个数组的拟合

    两个数组拟合:
    在这里插入图片描述

    三个数组拟合
    在这里插入图片描述

    归纳得:
    在这里插入图片描述

    此为n阶拉格朗日插值多项式

    四、用程序实现拉格朗日插值

    接下来利用C++实现拉格朗日插值,主要思路是利用循环结构,计算n阶拉格朗日插值多项式。

    #include <iostream>
    using namespace std;
    double x;
    double a[2][100];
    int main()
    {double pai(int j,int n);
    cout<<"首先输入要处理的二维数据组数n:"<<endl;
    int n,i,j;
    cin>>n;
    cout<<"然后依次输入x1,y1,x2,y2……依次类推,直至xn,yn:"<<endl;
    for(j=0;j<n;j++)
      {for (i=0;i<=1;i++)
         cin>>a[i][j];
      } 
    cout<<"最后输入一个自变量的值x:"<<endl;
    cin>>x;
    double sum=0;
    for(j=0;j<n;j++)
      {sum=sum+pai(j,n)*a[1][j];
      }
    cout<<"离散数据的n次Lagrange插值表达式中f(x)的值为:"<<sum<<endl; 
    return 0;
    }
    
    double pai(int j,int n)
    {int k;
    double s=1;
    for (k=0;k<n;k++)
      {if (k!=j)
         {s=s*(x-a[0][k])/(a[0][j]-a[0][k]);
    	 }
      }
    return (s);
    }
    
    展开全文
  • 拉格朗日插值法: #include <iostream> #include <string> #include <vector> using namespace std; void Lagrange(int N, int N1, vector<double>&X, vector<double>&...

    拉格朗日插值法:

    #include <iostream>  
    #include <string>  
    #include <vector>  
    using namespace std;
     
     
    void Lagrange(int N, int N1, vector<double>&X, vector<double>&Y, vector<double>&xp, vector<double> &result);
    int main()
    {
    	char a = 'n';
    	do{
    	cout << "请输入所需插值点N的值:" << endl;
    	int N;
    	int N1;
    	cin >> N;
    	vector<double>X(N, 0);
    	vector<double>Y(N, 0);
    	cout << "请输入"<<N<<"个插值点对应的值X[i]:" << endl;
    	for (int a = 0; a<N; a++)
    	   {
    		cin >> X[a];
    		if (a >= N)
    		break;
    	   }
    	cout << "请输入" << N << "个插值点对应的函数值Y[i]:" << endl;
    	for (int a = 0; a<N; a++)
    	   {
    		cin >> Y[a];
    		if (a >= N)
    		break;
    	   }
    	cout << "请输入所求xp次数N1的值:" << endl;
    	cin >> N1;
    	vector<double>xp(N1, 0);
    	vector<double> result(N1, 0);
    	cout << "请输入" << N1 << "个所求向量xp[i]的值:" << endl;
    	for (int a = 0; a<N1; a++)
    	  {
    		cin >> xp[a];
    		if (a >= N1)
    		break;
    	  }
    	Lagrange(N, N1, X, Y, xp, result);
    	for (int a = 0; a < N1; a++)
    	  {
    		cout << result[a] << endl;
    	  }
    	cout << "是否要继续?(y/n):";
    	cin >> a;
    	  } while (a == 'y');
    	return 0;
    }
     
     
    void Lagrange(int N, int N1,vector<double>&X, vector<double>&Y, vector<double>&xp, vector<double> &result)
    {
    	double temp1=0;
    	for (int h = 0; h < N1; h++)
    	   {
    		for (int i = 0; i < N; i++)
    		    {
    			double temp = Y[i];
    			for (int j = 0; j < N; j++)
    	                    {
    				if (i != j)
    				 {
    					temp = temp*(xp[h] - X[j]);
    					temp = temp/(X[i] - X[j]);
    				 }
    			     }
    			temp1 += temp;
    		    }
    		result[h] = temp1;
    		temp1 = 0 ;
    	   }
    }

    牛顿插值法:

    #include<iostream>  
    #include<string>  
    #include<vector>  
    using namespace std;
     
    double ChaShang(int n, vector<double>&X, vector<double>&Y);
    void Newton(int n1, vector<double>& xp, vector<double>&X, vector<double>&Y, vector<double> &result);
     
    int main()
    {
    	char a = 'n';
    	do
    	{int n,n1;
    	cout << "请输入插值点的个数" << endl;
    	cin >> n;
    	vector<double>X(n, 0);
    	vector<double>Y(n, 0);
    	
    	cout << "请输入插值点X[i]的值" << endl;
    	for (int i = 0; i<n; i++)
    	{
    		cin >> X[i] ;
    	}
    	cout << "请输入插值点Y[i]的值" << endl;
    	for (int i = 0; i<n; i++)
    	{
    		cin >> Y[i];
    	}
    	cout << "请输入所求点的个数" << endl;
    	cin >> n1;
    	vector<double> xp(n1, 0);
    	vector<double> result(n1, 0);
    	cout << "请输入所求插值点xp[i]的值:" << endl;
    	for (int i = 0; i<n1; i++)
    	{
    		cin >> xp[i];
    	}
    	Newton(n1,xp, X, Y,result);
    	cout << "输出所求插值点的函数值:" << endl;
    	for (int h = 0; h < n1; h++)
    	{
    		cout<< result[h]<<endl;
    	}
    	cout << "是否要继续?(y/n):";
    	cin >> a;
    	} while (a == 'y');
    	return 0;
    }
     
    double ChaShang(int n, vector<double>&X, vector<double>&Y)
    {
    	double f = 0;
    	double temp = 0;
    	for (int i = 0; i<n + 1; i++)
    	{
    		temp = Y[i];
    		for (int j = 0; j<n + 1; j++)
    			if (i != j) temp /= (X[i] - X[j]);
    		f += temp;
    	}
    	return f;
    }
     
    void Newton(int n1, vector<double>& xp, vector<double>&X, vector<double> &Y, vector<double> &result)
    {
    	double temp1 = 0;
    	for (int h = 0; h < n1; h++)
    	{
    		for (int i = 0; i < X.size(); i++)
    		{
    			double temp = 1;
    			double f = ChaShang(i, X, Y);
    			for (int j = 0; j < i; j++)
    			{
    				temp = temp*(xp[h] - X[j]);
    			}
    			temp1 += f*temp;
    		}
    		result[h] = temp1;
    		temp1 = 0;
    	}
    }

    以上代码转自:https://blog.csdn.net/qq_32171677/article/details/60955759

    我的需求,根据已有的速度,预估下一次的速度。预估的个数为1个,一维数据坐标为1,2,3...

    改进:

    /*
     * @Description: 
     * @Version: 2.0
     * @Author: Feng Chao
     * @Date: 2020-10-16 09:18:53
     * @LastEditors: Feng Chao
     * @LastEditTime: 2020-10-16 12:00:45
     */
    
    #include "../common.h"
    
    float fore_cast(vector<float>data);
    
    int main()
    {
        vector<float>data;
        data.push_back(1.1);
        data.push_back(1.3);
        data.push_back(1.6);
        data.push_back(2.0);
    
        printf("result:%f\n",fore_cast(data));
        
    }
    
    float fore_cast(vector<float>data)
    {
        float result = 0;
        for(int i = 0;i<data.size();i++)
        {
            double temp = 1;
            double f = 0;
            double temp2 = 0;
            for (int j = 0; j < i + 1; ++j) 
            {
                temp2 = data[j];
                for(int k = 0; k < i + 1; ++k)
                {
                    if(j != k)
                    {
                        temp2 /= (j - k); 
                    }   
                }
                f += temp2;
            }
            for(int m = 0; m < i;++m)
            {
                temp = temp*(data.size() - m);
            }
            result += f*temp;
        }
       return result;
    }

     

    展开全文
  • #include <bits/stdc++.h> using namespace std; #define MAXSIZE 100 int main(){ double x[MAXSIZE], y[MAXSIZE]; int n; double m; ... "请输入插值节点个数:";... printf("请输入插值节.

    在这里插入图片描述

    #include <bits/stdc++.h>
    using namespace std;
    #define MAXSIZE 100
    int main(){
        double x[MAXSIZE], y[MAXSIZE];
        int n;
        double m;
        cout << "请输入插值节点个数:";
        cin >> n;
        for (int i = 0; i < n; ++i) {
            printf("请输入插值节点x[%d], y[%d]:", i, i);
            cin >> x[i] >> y[i];
        }
        cout << "请输入插值点:";
        cin >> m;
        double result = 0.0;
        for (int i = 0; i < n; i++) {
            double l = 1.0;
            for (int j = 0; j < n; j++) {
                if (j != i){
                    l *= (m-x[j])/(x[i]-x[j]);
                }
            }
            result += l * y[i];
        }
        printf("插值点(x, y)=(%lf, %lf)\n",m, result);
    }
    
    展开全文
  • 数值分析(一)拉格朗日插值法c++实现

    千次阅读 2016-08-02 18:01:49
    #include #include #include using namespace std; typedef struct { int x; float y; } LAGRANG_DATA; typedef vector<LAGRANG_DATA> LAGDATE; void print( LAGDATE &largeng
  • 摘自《c++和面向对象数值计算》,代码简洁明快,采用模板函数,通用性增强,对其中代码稍加改动 #include<iostream> #include <vector> using namespace std; template<class T> T lagrange...
  • 数值计算方法:拉格朗日插值法的伪代码 c/c++ python编程实现。
  • 拉格朗日插值算法

    2018-12-13 14:06:26
    拉格朗日插值算法描述及代码实现,用于实现插值运算。弹道解算模拟。
  • 拉格朗日插值算法(附c++源码)

    万次阅读 多人点赞 2018-05-10 21:49:01
    C++程序实现Lagrange插值公式 La... 对于Lagrange插值算法的基本思想,在这里我只想略提两点,一个是拉格朗日插值公式,一个是拉格朗日插值基函数的求解。因为这两者才是算法需要解决的最根本的问题。 (1)采用插...
  • 拉格朗日插值法和牛顿插值法求数据的近似多项式函数p(x),并用p(x)求给定变量的函数值。分析两种方法的精确性。
  • 拉格朗日插值算法及牛顿插值算法的C++实现

    千次阅读 多人点赞 2017-03-09 10:32:08
    拉格朗日插值及牛顿插值算法
  • 拉格朗日插值算法简介及其C++实现

    千次阅读 2017-08-16 09:50:35
    一、拉格朗日插值法 是以法国十八世纪数学家约瑟夫·路易斯·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量...
  • c++拉格朗日插值法

    2011-06-02 16:04:57
    C++代码来编写相应的拉格朗日插值法,解决拉格朗日插值法的相关问题.
  • 通过拟合得到的拉格朗日多项式为: " endl ;  for (int i=0;i;i++)  {  denominator_coefficient=1;   cout [i]*";  for (int j=0;j;j++)  {  if (i==j)  continue;   cout ("[j])...
  • C程序实现Lagrange插值公式
  • 文章目录拉格朗日插值法简介拉格朗日插值法模板DP 优化思路例题一分析代码例题二分析代码A trick 拉格朗日插值法 简介 众所周知,nnn 个点 (xi,yi)(x_i, y_i)(xi​,yi​)(任意两个点横坐标不相等)可以确定一个 n−...
  • 拉格朗日插值法及代码

    千次阅读 多人点赞 2019-12-24 09:52:35
    在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的 一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函 数都只能通过实验和观测来了解。如对实践中的某个物理...
  • 这篇记录一下我对拉格朗日插值的理解以及代码的实现。 线性插值: 给出了两个点(x0,y0),(x1,y1),假定x1>x0, 现在要估计某个给定x的函数值,其中x∈(x0,x1)。 线性插值的方式即是以为斜率,过(x0,y0...
  • 插值法的思路在于通过构造一个N次多项式P(x),使其通过N+1个点,然后求x处的函数值y。 拉格朗日逼近 例题 【问题描述】考虑[0.0,1.2]内的函数y=f(x)=cos(x)。利用多个(2,3,4等)节点构造拉格朗日插值多项式。 ...
  • 朗格朗日求解矩阵,利用差值计算矩阵的解
  • 拉格朗日插值法小结

    千次阅读 2018-07-12 21:27:23
    插值就是找一个多项式过几个已知...下面介绍拉格朗日插值法。 我们考虑一个多项式函数f(x)f(x)f(x),其中f(xi)=yif(xi)=yif(x_i)=y_i。再考虑一个一个多项式g(x)g(x)g(x),其中g(xi)=zig(xi)=zig(x_i)=z_i。他们的...
  • 代数插值:用C++实现了拉格朗日插值法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 476
精华内容 190
关键字:

拉格朗日插值法c++

c++ 订阅