拉格朗日插值 C++ 和 Matlab实现

拉格朗日插值 C++ 和 Matlab实现

拉格朗日插值法

概述

利用 n 个变量 x i x_i xi 与函数值 y i y_i yi 构造插值函数Ln的方法
构造关键
构造多项式 l k l_k lk
x k − 1 x_k-1 xk1
l k ( x ) = ( x − x k − 1 ) ( x − x k + 1 ) ( x k − x k − 1 ) ( x k − x k + 1 ) l_k(x) =\frac{(x - x_{k-1})(x-x_{k+1})}{(x_k - x_{k-1})(x_k - x_{k+1})} lk(x)=(xkxk1)(xkxk+1)(xxk1)(xxk+1)
l k l_k lk 满足 $ l_k(x_k) = 1 , l_k(x_i) = 0 , i = 1,…,n ,i !=k$
解出 l n ( x ) = y i × ∑ k = 0 n l x ( x i ) , i = 1 , . . . , n l_n(x) = y_i \times \sum_{k = 0}^{n} l_x(x_i),i = 1,...,n ln(x)=yi×k=0nlx(xi),i=1,...,n
注 : 上述公式是我用mathjax写的,如有错误请联系我修正
敬请指正

详解

点此查看百科 拉格朗日插值法

代码

C++实现

结果输入格式注释

/*
/
                              结果 
/
输入需要插值的数目 : 6
Xi : 0.4 0.55 0.65 0.8 0.9 1.05
Yi : 0.41075 0.57815 0.69675 0.88811 1.02652 1.25382
输入需要插值的x :
0.596
y : 0.631917
/
tips : 运行环境 DevC++ 5.9.2
/
*/ 
#include<iostream> 
#include<iomanip>
#include<cstring>

#define maxn 100

int n;
double x[maxn];
double y[maxn];
double ln[maxn];

using namespace std;

int main()
{
	double xi,res;
	res = 0;
	memset(x,0,sizeof(x));
	memset(y,0,sizeof(y));
	cout << "输入需要插值的数目 : " ; 
	cin >> n;
	if(n > maxn)
	{
		cout << "超出上限" <<endl; 
		cout << "请修改 maxn 再运行" <<endl;
		return 0; 
	}
	cout << "Xi : ";
	for(int i = 0;i < n;i++)
		cin >> x[i];
	cout << "Yi : ";
	for(int i = 0;i < n;i++)
		cin >> y[i];
	cout << "输入需要插值的x : " << endl;
	cin >> xi;
	for(int i = 0;i < n;i++)
	{
		ln[i] = 1;
		for(int j = 0;j < n;j++)
		{
			if(i == j)
				continue;
			ln[i] *= ((xi - x[j]) / (x[i] - x[j]));
		}
		res += (y[i] * ln[i]);
	}
	cout << "y : " << res << endl;
}

Matlab 实现

将该函数存为m文件

function res= Lagrange(x,y,xi)
    xl = length(x);
    yl = length(y);
    if(xl ~= yl)
        disp('向量长度不等')
        return
    end
    res = 0;
    for i = 1:xl
        ln = 1;
        for j = 1:yl
            if i == j
                continue;
            end
            ln = ln * ((xi - x(j))/(x(i) - x(j)));
        end
        res = res + (y(i) * ln);
    end
end

调用下面语句测试函数

x = [0.4,0.55,0.65,0.8,0.9,1.05]
y = [0.41075,0.57815,0.69675,0.88811,1.02652,1.25382]
xi = 0.596
Lagrange(x,y,xi)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值