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

来源:互联网 发布:淘宝客服服务流程图 编辑:程序博客网 时间:2024/05/01 18:47

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

拉格朗日插值法

概述

利用 n 个变量 xi 与函数值 yi 构造插值函数Ln的方法
构造关键
构造多项式 lk
xk1
lk(x)=(xxk1)(xxk+1)(xkxk1)(xkxk+1)
lk 满足 lk(xk)=1,lk(xi)=0,i=1,...,n,i!=k
解出

ln(x)=yi×k=0nlx(xi),i=1,...,n

注 : 上述公式是我用mathjax写的,如有错误请联系我修正
敬请指正

详解

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

代码

C++实现

结果输入格式注释

/*/////////////////////////////////////////////////////////////////                              结果 /////////////////////////////////////////////////////////////////输入需要插值的数目 : 6Xi : 0.4 0.55 0.65 0.8 0.9 1.05Yi : 0.41075 0.57815 0.69675 0.88811 1.02652 1.25382输入需要插值的x :0.596y : 0.631917/////////////////////////////////////////////////////////////////tips : 运行环境 DevC++ 5.9.2                    Copyright 2017 Gy tips : Gy是高玉的标志,可见logo/////////////////////////////////////////////////////////////////*/ #include<iostream> #include<iomanip>#include<cstring>#define maxn 100int 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);    endend

调用下面语句测试函数

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.596Lagrange(x,y,xi)
原创粉丝点击