牛頓插值法

C++代碼

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double x[100];
double y[100];
double f[100];
double A[100];
int main()
{
    int n;
    double a;//所要求的x值
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>x[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>y[i];
    }
    cin>>a;
    f[0]=y[0];
    A[0]=y[0];//0到0的差商就是y[0]
    for(int i=1;i<n;i++)
    {
        f[i]=y[i];//將每一個數值賦值給f
        //每一層代表求0到i的差商
        for(int j=i-1;j>=0;j--)
        {
            f[j]=(f[j+1]-f[j])/(x[i]-x[j]);
            cout<<"f["<<j<<"]"<<"=(f["<<j+1<<"]-f["<<j<<"])/(x["<<i<<"]-x["<<j<<"])"<<endl;
        }
        A[i]=f[0];//A[i]代表i階差商,即0到i的差商
    }
    double res;
    //=A[n-1]*(a-x[]);
    res=A[n-1];
    for(int i=n-2;i>=0;i--)
    {
        res=res*(a-x[i])+A[i];
    }
    cout<<res<<endl;
    /*for(int i=1;i<n;i++)
    {
        f[i]=(f[i]-f[i-1])/(x[i]-x[i-1]);
    }*/
    return 0;
}

Matlab代碼

function P=Newton_interpolation(n,z,x,y)
% 牛頓插值法
% n爲x,y的個數
% z爲所要求x的值
t(1)=y(1); 
A(1)=y(1);
for k=2:n 
    t(k)=y(k);
    for j=k-1:-1:1 
        t(j)=(t(j+1)-t(j))/(x(k)-x(j));
    end
    A(k)=t(1);
end
P=A(n);
for i=n-1:-1:1
    P=P*(z-x(i))+A(i);
end 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章