一、相关知识提要
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
三、运行结果
传入题设数据,结果如图所示