MATLAB代码逐行分析:牛顿插值和拉格朗日插值
第1题代码分析:
clear;% 清空命令窗口变量clc;% 清空命令窗口显示clf;% 清空当前图形窗口x1=[0.2 0.4 0.6 0.8 1.0];% 已知数据的x坐标y1=[0.98 0.92 0.81 0.64 0.38];% 已知数据的y坐标n=length(y1);% 已知数据个数c=y1(:);% 将已知数据的y坐标向量转化为列向量for j=2:n% 求差商-
`for i=n:-1:j` -
`c(i)=(c(i)-c(i-1))/(x1(i)-x1(i-j+1));` % 递推求解差商 -
`end` endsyms x df d;% 定义符号变量df(1)=1;d(1)=y1(1);% df和d分别表示插值多项式的差商和系数,初始化for i=2:n% 求牛顿差值多项式-
`df(i)=df(i-1)*(x-x1(i-1));` % 递推求解差商 -
`d(i)=c(i)*df(i);` % 递推求解插值多项式系数 endP4=vpa(sum(d),5)% P4即为4次牛顿插值多项式,并保留小数点后5位数pp=csape(x1,y1, 'variational');% 调用三次样条函数q=pp.coefs;% q表示样条函数的系数矩阵for i=1:4-
`S=q(i,:)*[(x-x1(i))^3;(x-x1(i))^2;(x-x1(i))^1;(x-x1(i))^0];` % 逐项计算样条函数的值 -
`S=vpa(collect(S),5)` % 保留小数点后5位数 endfigure% 新建画布ezplot(P4, [0.2,1.08]);% 在画布上绘制插值多项式的图像hold on;% 保持图像x2=0.2:0.08:1.08;% 生成一系列x坐标y2=fnval(pp, x2);% 计算样条函数在这些x坐标处的值ind=[1,2,11,10];% 选取几个特定的x坐标y3=fnval(pp,x2(ind));% 计算这些特定x坐标处样条函数的值plot(x2,y2,'r',x2(ind),y3,'go')% 绘制样条函数的图像和特定点的散点图title('Newton interpolation with deg=4 and cubic splines');% 添加图像标题hold off;% 释放图像
第2题代码分析:
function y =lagrange (x0,y0,x)% 定义拉格朗日插值函数,输入已知数据的x坐标、y坐标和需要插值的x坐标,输出插值的y坐标m=length(x);% 需要插值的x坐标个数n=length(x0);% 已知数据个数for i=1:m% 逐个计算需要插值的x坐标的y坐标-
`z=x(i);` % 取出一组需要插值的x坐标 -
`s=0;` % 初始化插值的y坐标 -
`for k=1:n` % 逐个计算拉格朗日插值多项式的每一项 -
`p=1.0;` % 初始化插值多项式的每一项 -
`for j=1:n` % 逐个计算插值多项式的每个乘项 -
`if j~=k` % 如果不是同一个已知数据点 -
`p=p*(z-x0(j))/(x0(k)-x0(j));` % 计算乘项的值 -
`end` -
`end` -
`s=p*y0(k)+s;` % 将每一项相加得到插值的y坐标 -
`end` -
`y(i)=s;` % 将插值的y坐标存入结果向量中 endclear;% 清空命令窗口变量clc;% 清空命令窗口显示clf;% 清空当前图形窗口x0=[-1:0.02:1];% 已知数据的x坐标y0=1./(1+25*x0.^2);% 已知数据的y坐标plot(x0,y0,'b')% 在画布上绘制原曲线hold on% 保持图像x1=linspace(-1,1,11);% 选取11个已知数据点y1=1./(1+25*x1.^2);% 计算这11个点的y坐标y0=lagrange(x1,y1,x0);% 计算拉格朗日插值得到的y坐标plot(x0,y0,'--r')% 在画布上绘制插值曲线x1=linspace(-1,1,21);% 选取21个已知数据点y1=1./(1+25*x1.^2);% 计算这21个点的y坐标y0=lagrange(x1,y1,x0);% 计算拉格朗日插值得到的y坐标plot(x0,y0,'--g')% 在画布上绘制插值曲线
原文地址: https://www.cveoy.top/t/topic/n1Kf 著作权归作者所有。请勿转载和采集!