第1题代码分析:

  1. clear; % 清空命令窗口变量
  2. clc; % 清空命令窗口显示
  3. clf; % 清空当前图形窗口
  4. x1=[0.2 0.4 0.6 0.8 1.0]; % 已知数据的x坐标
  5. y1=[0.98 0.92 0.81 0.64 0.38]; % 已知数据的y坐标
  6. n=length(y1); % 已知数据个数
  7. c=y1(:); % 将已知数据的y坐标向量转化为列向量
  8. for j=2:n % 求差商
  9. `for i=n:-1:j`
    
  10.     `c(i)=(c(i)-c(i-1))/(x1(i)-x1(i-j+1));`  % 递推求解差商
    
  11. `end`
    
  12. end
  13. syms x df d; % 定义符号变量
  14. df(1)=1;d(1)=y1(1); % df和d分别表示插值多项式的差商和系数,初始化
  15. for i=2:n % 求牛顿差值多项式
  16. `df(i)=df(i-1)*(x-x1(i-1));`  % 递推求解差商
    
  17. `d(i)=c(i)*df(i);`  % 递推求解插值多项式系数
    
  18. end
  19. P4=vpa(sum(d),5) % P4即为4次牛顿插值多项式,并保留小数点后5位数
  20. pp=csape(x1,y1, 'variational'); % 调用三次样条函数
  21. q=pp.coefs; % q表示样条函数的系数矩阵
  22. for i=1:4
  23. `S=q(i,:)*[(x-x1(i))^3;(x-x1(i))^2;(x-x1(i))^1;(x-x1(i))^0];`  % 逐项计算样条函数的值
    
  24. `S=vpa(collect(S),5)`  % 保留小数点后5位数
    
  25. end
  26. figure % 新建画布
  27. ezplot(P4, [0.2,1.08]); % 在画布上绘制插值多项式的图像
  28. hold on; % 保持图像
  29. x2=0.2:0.08:1.08; % 生成一系列x坐标
  30. y2=fnval(pp, x2); % 计算样条函数在这些x坐标处的值
  31. ind=[1,2,11,10]; % 选取几个特定的x坐标
  32. y3=fnval(pp,x2(ind)); % 计算这些特定x坐标处样条函数的值
  33. plot(x2,y2,'r',x2(ind),y3,'go') % 绘制样条函数的图像和特定点的散点图
  34. title('Newton interpolation with deg=4 and cubic splines'); % 添加图像标题
  35. hold off; % 释放图像

第2题代码分析:

  1. function y =lagrange (x0,y0,x) % 定义拉格朗日插值函数,输入已知数据的x坐标、y坐标和需要插值的x坐标,输出插值的y坐标
  2. m=length(x); % 需要插值的x坐标个数
  3. n=length(x0); % 已知数据个数
  4. for i=1:m % 逐个计算需要插值的x坐标的y坐标
  5. `z=x(i);`  % 取出一组需要插值的x坐标
    
  6. `s=0;`  % 初始化插值的y坐标
    
  7. `for k=1:n`  % 逐个计算拉格朗日插值多项式的每一项
    
  8.     `p=1.0;`  % 初始化插值多项式的每一项
    
  9.     `for j=1:n`  % 逐个计算插值多项式的每个乘项
    
  10.         `if j~=k`  % 如果不是同一个已知数据点
    
  11.             `p=p*(z-x0(j))/(x0(k)-x0(j));`  % 计算乘项的值
    
  12.         `end`
    
  13.     `end`
    
  14.     `s=p*y0(k)+s;`  % 将每一项相加得到插值的y坐标
    
  15. `end`
    
  16. `y(i)=s;`  % 将插值的y坐标存入结果向量中
    
  17. end
  18. clear; % 清空命令窗口变量
  19. clc; % 清空命令窗口显示
  20. clf; % 清空当前图形窗口
  21. x0=[-1:0.02:1]; % 已知数据的x坐标
  22. y0=1./(1+25*x0.^2); % 已知数据的y坐标
  23. plot(x0,y0,'b') % 在画布上绘制原曲线
  24. hold on % 保持图像
  25. x1=linspace(-1,1,11); % 选取11个已知数据点
  26. y1=1./(1+25*x1.^2); % 计算这11个点的y坐标
  27. y0=lagrange(x1,y1,x0); % 计算拉格朗日插值得到的y坐标
  28. plot(x0,y0,'--r') % 在画布上绘制插值曲线
  29. x1=linspace(-1,1,21); % 选取21个已知数据点
  30. y1=1./(1+25*x1.^2); % 计算这21个点的y坐标
  31. y0=lagrange(x1,y1,x0); % 计算拉格朗日插值得到的y坐标
  32. plot(x0,y0,'--g') % 在画布上绘制插值曲线
MATLAB代码逐行分析:牛顿插值和拉格朗日插值

原文地址: https://www.cveoy.top/t/topic/n1Kf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录