matlab实验-------计算出差商表并得出四阶牛顿和拉格朗日多项式并作出图像

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GoodLuckAC/article/details/84327239

数值分析实验,站在巨人(百度)的肩膀上写了代码~~~~~。


function [p,q]=chashang_newton(x,y)
%%%%%%%%%%%%%%%%%%%%差商表的求法 
 n=length(x);
 p(:,1)=x;
 p(:,2)=y;
 for j=3:n+1
    p(1:n+2-j,j)=diff(p(1:n+3-j,j-1)) ./(x(j-1:n)-x(1:n+2-j));
 end
 disp(p);
 q=p(1,2:n+1)';

%%%%%%%%%%%%%%%%%%%%牛顿四阶插值多项式的求法和得到相应的函数值
x1=input('输入节点坐标x=')
y=input('输入节点坐标函数值f(x)=')
x2=input('输入所要计算的节点x2=')
syms x
n=length(x1);
for i=2:n
   f1(i,1)=(y(i)-y(i-1))/(x1(i)-x1(i-1));
end


for i=2:n
   for j=i+1:n
       f1(j,i)=(f1(j,i-1)-f1(j-1,i-1))/(x1(j)-x1(j-i));
   end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%Newton插值函数
f1=[y',f1]
Newton=f1(1,1);
for i=2:n
   tt=1;
   for j=1:i-1
       tt=tt*(x-x1(j));
   end
   Newton=Newton+f1(i,i)*tt;
end
fprintf('Newton插值函数为n')
expand(Newton)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x=x2;
p=eval(Newton);
fprintf('Newton插值函数在所求点x2的函数值为n')
p









%%%%%%%%%%%%%%%%%%%%%%%%%%四阶拉格朗日插值多项式
%输出的量:n次拉格朗日插值多项式L及其系数向量C,基函数l及其系数矩阵L
%本程序为Lagrange1插值,其中x1,y1%为插值节点和节点上的函数值,输出为插值点xx的函数值,%xx可以是向量。
x2=input('本程序为Lagrange1插值,其中x2插值节点:')
y2=input('本程序为Lagrange1插值,其中y2节点上的函数值:')
xx=input('本程序为Lagrange1插值,其中x1插值节点:')
syms x
n=length(x2);
for i=1:n
t=x2;t(i)=[];L(i)=prod((x-t)./(x2(i)-t));% L向量用来存放插值基函数
end
u=sum(L.*y2);
p=simplify(u) % p是简化后的Lagrange插值函数(字符串)
yy=subs(p,x,xx);    %p是以x为自变量的函数,并求xx处的函数值

%%%%%%%%%%%%%%%%%%%%牛顿插值多项式和拉格朗日插值多项式图像
t=input('请输入更多插值点例如:t=[0.5,2.3,3.9]:-------------')
x=input('牛顿插值多项式和拉格朗日插值多项式图像,其中x插值节点:')
y=input('牛顿插值多项式和拉格朗日插值多项式图像,其中y节点上的函数值:')
syms p;
n=length(x);
s=0;
for(k=1:n)
    la=y(k);
    for(j=1:k-1)
        la=la*(p-x(j))/(x(k)-x(j));
    end;
    for(j=k+1:n)
        la=la*(p-x(j))/(x(k)-x(j));
    end;
    s=s+la;
    simplify(s);
end
if nargin==2,
        s=subs(s,'p','x');
        s=collect(s);
        s=vpa(s,6);
    else
        m=length(t);
        for i=1:m,
            temp(i)=subs(s,'p',t(i));
        end
        s=temp;
        yh=lag(x,y)
        ezplot(yh,[-4,5])
end
yh=lag(x,y)
ezplot(yh,[-4,5])
function s=lag(x,y,t)
syms p;
n=length(x);
s=0;
for(k=1:n)
    la=y(k);
    for(j=1:k-1)
        la=la*(p-x(j))/(x(k)-x(j));
    end;
    for(j=k+1:n)
        la=la*(p-x(j))/(x(k)-x(j));
    end;
    s=s+la;
    simplify(s);
end
if nargin==2,
        s=subs(s,'p','x');
        s=collect(s);
        s=vpa(s,6);
    else
        m=length(t);
        for i=1:m,
            temp(i)=subs(s,'p',t(i));
        end
        s=temp;
        yh=lag(x,y)
        ezplot(yh,[-4,5])
end
    
 x=[1,2,3,-4,5]'

x =

     1
     2
     3
    -4
     5

>> y=[2,48,272,1182,2262]'

y =

           2
          48
         272
        1182
        2262

>> [p,q]=chashang_newton(x,y)
           1           2          46          89           6           4
           2          48         224          59          22           0
           3         272        -130         125           0           0
          -4        1182         120           0           0           0
           5        2262           0           0           0           0

输入节点坐标x=[1,2,3,-4,5]

x1 =

     1     2     3    -4     5

输入节点坐标函数值f(x)=[2,48,272,1182,2262]

y =

           2          48         272        1182        2262

输入所要计算的节点x2=-4

x2 =

    -4


f1 =

           2           0           0           0           0
          48          46           0           0           0
         272         224          89           0           0
        1182        -130          59           6           0
        2262         120         125          22           4

Newton插值函数为n 
ans =
 
4*x^4 - 2*x^3 + x^2 - 3*x + 2
 
Newton插值函数在所求点x2的函数值为n
p =

        1182

本程序为Lagrange1插值,其中x2插值节点:[1,2,3,-4,5]

x2 =

     1     2     3    -4     5

本程序为Lagrange1插值,其中y2节点上的函数值:[2,48,272,1182,2262]

y2 =

           2          48         272        1182        2262

本程序为Lagrange1插值,其中x1插值节点:-4

xx =

    -4

 
p =
 
4*x^4 - 2*x^3 + x^2 - 3*x + 2

猜你喜欢

转载自blog.csdn.net/GoodLuckAC/article/details/84327239