程序1:要求给出插值次数的多项式最小二乘法
syms x f;
xx=input('请输入插值节点 as [x1,x2...]\n');
ff=input('请输入插值节点处对应的函数值 as [f1,f2...]\n');
m=input('请输入要求的插值次数m=');
n=length(xx);
for i=1:(m+1)
syms fai x;
fai=x^(i-1);
for j=1:n
x=xx(j);
H(i,j)=eval(fai);
end
end
A=ff*(H)'*inv(H*(H)');
syms x; f=0;
for i=1:(m+1)
f=f+A(i)*x^(i-1);
end
plot(xx,ff,'*')
hold on
ezplot(f,[xx(1),xx(n)])
用此程序作出课本上的两道题:
1. 请输入插值节点 as [x1,x2...]
[0 0.9 1.9 3 3.9 5.0]
请输入插值节点处对应的函数值 as [f1,f2...]
[0 10 30 50 80 110]
请输入要求的插值次数m=2
图:
2.请输入插值节点 as [x1,x2...]
[0 0.9 1.9 3 3.9 5.0]
请输入插值节点处对应的函数值 as [f1,f2...]
[19.0 32.3 49.0 73.3 97.8]
请输入要求的插值次数m=2
图:
程序2:自适应多项式最小二乘法
syms x f nihef nihe;
xx=input('请输入插值节点 as [x1,x2...]\n');
ff=input('请输入插值节点处对应的函数值 as [f1,f2...]\n');
n=length(xx);
for m=1:(n-1)
for i=1:(m+1)
syms fai x;
fai=x^(i-1);
for j=1:n
x=xx(j);
H(i,j)=eval(fai);
end
end
A=ff*(H)'*inv(H*(H)');
syms x f; f=0;
for i=1:(m+1)
f=f+A(i)*x^(i-1);
end
nihef(m)=f;
for i=1:n
x=xx(i);
niheff(i)=eval(f);
ee(i)=ff(i)-niheff(i);
end
e(m)=0;
for i=1:(n-1)
e(m)=(ee(i))^2+e(m);
end
e(m)=sqrt(e(m)/(n*(n-1)));
eee(m)=1/e(m);
end
for k=1:n
if eee(k)==max(eee);
break
end
end
syms x;
nihe=nihef(k);
emcino=e(k);
plot(xx,ff,'*')
hold on
ezplot(nihe,[xx(1),xx(n)])
fprintf('插值误差为e=%.6f',emcino)
用此程序作实验中要求的题目:
3.请输入插值节点 as [x1,x2...]
[3 4 5 6 7 8 9]
请输入插值节点处对应的函数值 as [f1,f2...]
[2.01 2.98 3.50 5.02 5.47 6.02 7.05]
插值误差为e=0.000010
图: