牛顿插值与正交多项式曲线拟合的Matlab实现

一、相关知识提要

1.Newton插值法​​​​​​​

2. 正交多项式的方法作曲线拟合

二、代码实现

1.Newton插值法​​​​​​​

function [] = Newton_Chazhi(x,X,Fx)
%牛顿插值求解近似值
% x:待求值自变量 X:所有节点构成构成的向量 Fx:节点对应函数值构成的向量

n=length(X); %获取输入节点个数

A=zeros(n,n-1);
M=[Fx,A]; %构建差商表,其中第一列为自变量对应函数值
N=zeros(n,2); %初始化近似值表,第二列为相应精度
for i=1:n-1 %求差商表
    for j=1:n-i
        M(j+i,i+1)=(M(j+i,i)-M(j+i-1,i))/(X(j+i,1)-X(j,1));
    end
end
M
N(1,1)=M(1,1);
for k=1:n-1
    paiX=1;
    for l=1:k
        paiX=(x-X(l))*paiX;%计算连乘
    end
    deltaN=M(k+1,k+1)*paiX;
    N(k+1,2)=abs(deltaN);
    N(k+1,1)=N(k,1)+deltaN;
end
fprintf('近似值:%.8f  精度:\\ \n',N(1,1))
for i=2:n
    fprintf('近似值:%.8f  精度:%.8f\n',N(i,1),N(i,2))
end

2. 正交多项式的方法作曲线拟合

在这里我们采用的是方法二作为的算法

function [] = ZJNH(X,F,n)
% 用正交多项式做曲线拟合
% X:自变量数组 F:函数值数组 n:拟合次数
syms  x  %声明x为自变量
m=length(X); % 获取输入数据组数
P=cell(n+1,1);P{1,1}=0;P{2,1}=1; %初始化Pk(x)
a=zeros(1,n+1); %初始化系数a*
for i=1:n+1
    a_u=0;a_l=0;b_l=0;A_u=0;
    for j=1:m
        x=X(j,1);
        a_u=a_u+X(j,1)*subs(P{i+1,1})*subs(P{i+1,1}); %计算Alpha的分子
        a_l=a_l+subs(P{i+1,1})*subs(P{i+1,1});        %计算Alpha的分母
        A_u=A_u+F(j,1)*subs(P{i+1,1});                %计算系数a*的分子
        b_l=b_l+subs(P{i,1})*subs(P{i,1});            %计算Beta的分母
    end
    Alpha=a_u/a_l;
    a(1,i)=vpa(A_u/a_l);
    if i==1
        Beta=0;
    else
        Beta=a_l/b_l;
    end
    x='x';
    P{i+2,1}=(x-Alpha)*P{i+1,1}-Beta*P{i,1}; %计算P的表达式并储存在cell里
end
y=a(1,1)*P{2,1};
for i=1:n
    y=y+a(1,i+1)*P{i+2,1}; % 计算拟合式的每一次
    digits(6) % 控制6位精度
    y=vpa(expand(y)); % 展开表达式并以小数显示
    fprintf("%d次拟合:%s\n",i,y)
end

三、运行结果

传入题设数据,结果如图所示

 

 

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值