首页 > 其他分享 >数值分析实验6:多项式插值(牛顿、拉格朗日)

数值分析实验6:多项式插值(牛顿、拉格朗日)

时间:2022-11-13 16:01:31浏览次数:52  
标签:拉格朗 right 插值 多项式 0.2 0.4 0.6 x2 left

数值分析第二章实习题

第一题

 

拉格朗日插值

test.m

程序:

function yy=test(x,y,xx)

n=length(x);

m=length(y);

if n~=m

    error('x和y的维数必须相同');

    return;

end

p=zeros(1,n);

for i=1:n

    t=ones(1,n);

    for j=[1:i-1,i+1:n]

        t(j)=(xx-x(j))/(x(i)-x(j));

    end

    p(i)=prod(t);               %%li(xx),i=1:n,prod(t)表示向量t各元素分量相乘

   

end

yy=sum(y.*p);

end

 

 

运行结果:

>> yy=test(x,y,[0.2])

 

yy =

 

0.9800

 

nalagr.m

程序:

function yy=nalagr(x,y,xx)

m=length(x);n=length(y);

if m~=n,error('向量x与y的长度必须保持一致');end

s=0;

for i=1:n

    t=ones(1,length(xx));

    for j=[1:i-1,i+1:n]

        t=t.*(xx-x(j))/(x(i)-x(j));

    end

    s=s+t*y(i);

end

yy=s;

 

运行结果:

>> xx

 

xx =

 

    0.2000    0.2800    1.0800    1.0000

 

>> yy=nalagr(x,y,xx)

 

yy =

 

    0.9800    0.9622    0.2403    0.3800

 

 

牛顿插值

程序:

function [F,yy]= newton(X,Y,xx)

%   Newton插值函数

%   X为已知数据点的x坐标

%   Y为已知数据点的y坐标

%   xx为插值点的x坐标

%   函数返回F差商表

%   yy为各插值点函数值

n=length(X); m=length(xx);      %   xx=[0.2 0.28 1.0 1.08]

 

F=zeros(n,n);

F(:,1)=Y';      %矩阵的第一列用于存放插值向量X的函数值向量Y

for  j=2:n

   for i=j:n

       F(i,j)=(F(i,j-1)- F(i-1,j-1))/(X(i)-X(i-j+1));   %求矩阵下三角部分元素值

   end

end

%   disp('A:')

%   A

 

for t=1:m  %    m=4

    x=xx(t);

    s=0.0;

    for k=1:n

        w=1.0;

        for j=1:k-1

            w=w*(x-X(j));       %Wn(x)=(x-x1)*(x-x2)……(x-xn)        %n=1,2,3,4,5

        end

        s=s+F(k,k)*w;       

    end

    ss(t)=s;

end

 

yy=ss;

F=[X',F];   %将X向量拼进矩阵F的第一列中   

end

 

运行结果:

>> X=0.2:0.2:1;

>> Y=[0.98 0.92 0.81 0.64 0.38];

>> xx=[0.2 0.28 1.0 1.08];

>> [F,yy]=newton(X,Y,xx)

 

F =

 

    0.2000    0.9800         0         0         0         0

    0.4000    0.9200   -0.3000         0         0         0

    0.6000    0.8100   -0.5500   -0.6250         0         0

    0.8000    0.6400   -0.8500   -0.7500   -0.2083         0

    1.0000    0.3800   -1.3000   -1.1250   -0.6250   -0.5208

 

 

yy =

 

0.9800    0.9622    0.3800    0.2403

 

牛顿四次插值公式为:

 

 

 

 

$$
P_4​\left( x \right) =0.98−0.3\left( x−0.2 \right) −0.625\left( x−0.2 \right) \left( x−0.4 \right) −
$$
$$
0.2083\left( x−0.2 \right) \left( x−0.4 \right) \left( x−0.6 \right) −0.5208\left( x−0.2 \right) \left( x−0.4 \right) \left( x−0.6 \right) \left( x−0.8 \right)
$$

 

第二题

 

n=10

程序:

X=-1:0.2:1;

Y=1./(1+25.*X.^2);

 

n=length(X);

F=zeros(n,n);

F(:,1)=Y';      %矩阵的第一列用于存放插值向量X的函数值向量Y

for  j=2:n

   for i=j:n

       F(i,j)=(F(i,j-1)- F(i-1,j-1))/(X(i)-X(i-j+1));   %求矩阵下三角部分元素值

   end

end

F=[X',F];   %将X向量拼进矩阵F的第一列中

F

 

 

 

 

$$
P_{10}\left( x \right) =
$$
$$
0.0385+
$$
$$
0.1018\left( x+1 \right) +
$$
$$
0.2602\left( x+1 \right) \left( x+0.8 \right) +
$$
$$
0.7919\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) +
$$
$$
2.6867\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) -
$$
$$
6.3631\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) \left( x+0.2 \right) -
$$
$$
17.6753\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) \left( x+0.2 \right) x+
$$
$$
84.8416\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) \left( x+0.2 \right) x\left( x-2 \right) -
$$
$$
167.9157\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) \left( x+0.2 \right) x\left( x-0.2 \right) \left( x-0.4 \right) +
$$
$$
220.9417\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) \left( x+0.2 \right) x\left( x-0.2 \right) \left( x-0.4 \right) \left( x-0.6 \right) -
$$
$$
220.9417\left( x+1 \right) \left( x+0.8 \right) \left( x+0.6 \right) \left( x+0.4 \right) \left( x+0.2 \right) x\left( x-0.2 \right) \left( x-0.4 \right) \left( x-0.6 \right) \left( x-0.8 \right)
$$
$$

$$

 

运行结果:

>> y2=

0.0385+

0.1018.*(x+1)+

0.2602.*(x+1).*(x+0.8)+

0.7919.*(x+1).*(x+0.8).*(x+0.6)+

2.6867.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4)-

6.3631.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4).*(x+0.2)-17.6753.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4).*(x+0.2).*x+

84.8416.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4).*(x+0.2).*x.*(x-0.2)-167.9157.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4).*(x+0.2).*x.*(x-0.2).*(x-0.4)+

220.9417.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4).*(x+0.2).*x.*(x-0.2).*(x-0.4).*(x-0.6)-220.9417.*(x+1).*(x+0.8).*(x+0.6).*(x+0.4).*(x+0.2).*x.*(x-0.2).*(x-0.4).*(x-0.6).*(x-0.8);

>> plot(x,y1,x,y2)


 

 

 

橙色的曲线为10次牛顿插值多项式,可知其在-1,+1处跟原函数图像有较大差异,误差很大,故并非插值次数n越大越好。

n=20

修改程序中的一行代码为X=-1:0.1:1;

 

插值公式的求法类似,不再赘述,当n=20时,端点处值的变化更加剧烈,误差更大。

第三题

 

 

 

 

 

 

 

 

 

>> x2

 

x2 =

 

  1 至 17 列

 

     0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16

 

  18 至 34 列

 

    17    18    19    20    21    22    23    24    25    26    27    28    29    30    31    32    33

 

  35 至 51 列

 

    34    35    36    37    38    39    40    41    42    43    44    45    46    47    48    49    50

 

  52 至 65 列

 

    51    52    53    54    55    56    57    58    59    60    61    62    63    64

 

>> y2

 

y2 =

 

  1 至 10 列

 

         0    1.0000    1.4142    1.7321    2.0000    2.2361    2.4495    2.6458    2.8284    3.0000

 

  11 至 20 列

 

    3.1623    3.3166    3.4641    3.6056    3.7417    3.8730    4.0000    4.1231    4.2426    4.3589

 

  21 至 30 列

 

    4.4721    4.5826    4.6904    4.7958    4.8990    5.0000    5.0990    5.1962    5.2915    5.3852

 

  31 至 40 列

 

    5.4772    5.5678    5.6569    5.7446    5.8310    5.9161    6.0000    6.0828    6.1644    6.2450

 

  41 至 50 列

 

    6.3246    6.4031    6.4807    6.5574    6.6332    6.7082    6.7823    6.8557    6.9282    7.0000

 

  51 至 60 列

 

    7.0711    7.1414    7.2111    7.2801    7.3485    7.4162    7.4833    7.5498    7.6158    7.6811

 

  61 至 65 列

 

    7.7460    7.8102    7.8740    7.9373    8.0000

 

>> plot(x2,y2,'r',x2,y22,'g')

>> f=@(x2)x2-0.1667.*x2.*(x2-1)+0.1667.*x2.*(x2-1).*(x2-4)-9.9206*10^(-4).*x2.*(x2-1).*(x2-4).*(x2-9)+3.858.*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16)-1.0522*10^(-6).*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16).*(x2-25)+2.1198*10^(-8).*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16).*(x2-25).*(x2-36)-3.2806*10^(-10).*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16).*(x2-25).*(x2-36).*(x2-49)

 

f =

 

    @(x2)x2-0.1667.*x2.*(x2-1)+0.1667.*x2.*(x2-1).*(x2-4)-9.9206*10^(-4).*x2.*(x2-1).*(x2-4).*(x2-9)+3.858.*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16)-1.0522*10^(-6).*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16).*(x2-25)+2.1198*10^(-8).*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16).*(x2-25).*(x2-36)-3.2806*10^(-10).*x2.*(x2-1).*(x2-4).*(x2-9).*(x2-16).*(x2-25).*(x2-36).*(x2-49)

 

>> f(4)

 

ans =

 

    1.9996

 

>> f(64)

 

ans =

 

   2.4640e+09

 

 

 

当取x=2时,y=1.9996,结果误差小,但是当n=64时,值变得非常大,误差巨大。

标签:拉格朗,right,插值,多项式,0.2,0.4,0.6,x2,left
From: https://www.cnblogs.com/zhangfurong/p/16886116.html

相关文章

  • 【LGR125D】【JRKSJ R5】Concvssion(多项式,长链剖分)
    Sub1:\(a_i=(i+1)\bmodn\)即图只有一个环。设\(g_u\)表示原来\(u\)上有多少个点,\(f_u=u\)表示\(u\)的点权。那么对于某个\(k\in[1,n]\),\(ans_k=\sum_{u}g_uf_......
  • 计算机等级考试二级C语言程序设计专项训练题——多项式求值
        在计算机等级考试二级C语言程序设计试题中,多项式求值是一个重要的考点,有关多项式求值的试题在历年考试试卷的程序填空题和程序设计题中经常出现。一.示例讲解......
  • C++一元多项式计算器的设计与实现
    C++一元多项式计算器的设计与实现七、一元多项式计算器的设计与实现1.基于动态数组或者链表实现--元多项式的计算,可以使用STL的vector或者list。2.在系统中需要提供必......
  • 关于泰勒展开拉格朗日余项中值点的渐进性
    之前学拉格朗日中值定理的时候做到一道涉及到特定函数中值渐进性的题,感觉似乎有一般的结论,推广了一下就是这样了。感谢刘导拯救\(n=1\)都不会证的我,感谢王佬指出这是中......
  • 【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数
    在这文中,我将介绍非​​线性​​回归的基础知识。非线性回归是一种对因变量和一组自变量之间的非线性关系进行建模的方法。最后我们用R语言非线性模型预测个人工资数据(查看......
  • 插值查找算法
    插值查找算法插值查找原理介绍:​ 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。2.将折半查找中的求mid索引的公式,low表示左边索......
  • FHE学习笔记 #2 多项式环
    https://en.wikipedia.org/wiki/Polynomial_ringhttps://zhuanlan.zhihu.com/p/419266064这篇知乎文章讲的比较透彻,但是不易理解,可以结合以下视频学习。无尽沙砾大佬的......
  • 【模板】多项式乘法 FFT
    postedon2022-08-0223:57:12|under模板|source涉世不深,不会卡常,恳求大佬指教typedefcomplex<double>comp;constdoublePI=acos(-1);template<intN>struct......
  • 拓端数据tecdat|R语言多项式回归拟合非线性关系
     多项式回归是独立x变量和因果y变量之间的非线性关系。当我们分析有一些弯曲的波动数据时,拟合这种类型的回归是很关键的。 在这篇文章中,我们将学习如何在R中拟合和绘制多......
  • cube spline---三次样条插值
    插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。与拟合不用经过每个已知点不同,插值需要经过每个已知点,另外并不是阶......