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

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


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

  • 15
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
要使用MATLAB绘制ln(x)的拉格朗日插值和牛顿插值函数图像,我们可以按照以下步骤进行操作: 1. 定义插值点的区间范围和间隔。选择一个适当的区间范围(例如[0.1, 5])和间隔(例如0.1),取得插值点的x坐标。 2. 根据ln(x)函数计算插值点的y值。 3. 使用拉格朗日插值方法,根据插值点的坐标和y值,计算ln(x)的拉格朗日插值函数。 4. 使用牛顿插值法,根据插值点的坐标和y值,计算ln(x)的牛顿插值函数。 5. 使用plot函数,将插值点及函数图像在同一个坐标系中绘制出来。 以下是MATLAB代码示例: ``` x = 0.1:0.1:5; % 定义插值点的x坐标 y = log(x); % 根据ln(x)函数计算插值点的y值 % 拉格朗日插值 lagrange_poly = lagrange(x, y); % 牛顿插值 newton_poly = newton(x, y); % 绘制图像 plot(x, y, 'o', 'MarkerFaceColor', 'b') % 绘制插值点 hold on fplot(@(x) log(x), [0.1, 5], 'r') % 绘制ln(x)函数图像 fplot(lagrange_poly, [0.1, 5], 'g') % 绘制拉格朗日插值函数图像 fplot(newton_poly, [0.1, 5], 'm') % 绘制牛顿插值函数图像 hold off legend('插值点', 'ln(x)函数', '拉格朗日插值', '牛顿插值') % 添加图例 % 拉格朗日插值多项式计算函数 function poly = lagrange(x, y) n = length(x); syms t; poly = 0; for i = 1:n L = 1; for j = 1:n if j ~= i L = L * (t - x(j)) / (x(i) - x(j)); end end poly = poly + y(i) * L; end end % 牛顿插值多项式计算函数 function poly = newton(x, y) n = length(x); syms t; poly = y(1); for i = 2:n temp = 1; for j = 1:i-1 temp = temp * (t - x(j)); end poly = poly + temp * divided_difference(x, y, i); end end % 计算分差表 function diff = divided_difference(x, y, n) if n == 1 diff = y(1); else diff = (divided_difference(x, y, n-1) - divided_difference(x, y, n-1))/(x(1)-x(n)); end end ``` 执行代码后,将会生成包含插值点、ln(x)函数拉格朗日插值函数牛顿插值函数图像,并在图例中加以区分。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值