Lagrange、Newton和Hermite插值例题

问题1:

分别使用Lagrange和Newton插值公式计算函数的值。对于Newton插值要求先输出差商表,在计算x=7.5时4次插值多项式的值,并与四次Lagrange插值结果进行比较。

x

4

5

6

7

8

y

2.0000

2.23607

2.44949

2.64575

2.82843

Lagrange插值

代码1

function y = Lagrange(a,b,x,n)
%Lagrange插值法 a,b分别为x以及对应的f(x),x为插入数据,n为插值多项式次数
% a=4:8
% b=[2 2.23607 2.44949 2.64575 2.82843]
if length(a)~=length(b)
    error('输入数据不同维')
end
if n>=length(a)
    error('n值太大')
end
d=abs(x-a);
[~,idx]=sort(d);
S=0;
for i=1:n+1
    t1=1;
    t2=1;
    for j=1:n+1
        if j~=i
            t1=t1*(x-a(idx(j)));
            t2=t2*(a(idx(i))-a(idx(j)));
        end
    end
    S=S+t1/t2*b(idx(i));
end
y=S;
end

代码2

function y=lagrange_(xx,yy,x)
n=1:length(xx);
y=zeros(size(x));
for i=n
    ij=find(n~=i);
    y1=1;
    for j=1:length(ij),y1=y1.*(x-xx(ij(j)));
    end
    y=y+y1*yy(i)/prod(xx(i)-xx(ij));
end
end

% Command Window 输入
% x=sym('x');
% xx=[4:8];
% yy=[2 2.23607 2.44949 2.64575 2.82843];
% y = lagrange_(xx,yy,x)
% y = lagrange_(xx,yy,7.5)

代码3

function y=lagrangey(xx,yy,x)
n = length(xx);
m = length(x);
y = zeros(1,m);
c1 = ones(n-1,1);
c2 = ones(1,m);
for i=1:n
    xp = xx([1:i-1 i+1:n]);
    y = y + yy(i)*prod((c1*x-xp'*c2)./(xx(i)-xp'*c2));
end
end

% Command Window 输入
% x=sym('x');
% xx=[4:8];
% yy=[2 2.23607 2.44949 2.64575 2.82843];
% y = lagrangey(xx,yy,x)
% y = lagrangey(xx,yy,7.5)

代码4

function y = lagrange_fun(x,xi,yi)
y=0;
n=length(xi);
for i=1:n
    t=1;
    for j=1:n
        if j~=i
            t=t*(x-xi(j))/(xi(i)-xi(j));
        end
    end
    y=y+yi(i)*t;
end
end

% Command Window 输入
% x=sym('x');
% xi=[4:8];
% yi=[2 2.23607 2.44949 2.64575 2.82843];
% y = lagrange_fun(x,xi,yi)
% y = lagrange_fun(7.5,xi,yi)

Newton插值

差商表代码

function A = Chashang_List(a,b)
%Newton插商计算函数
if length(a)~=length(b)
    error('输入数据不同维')
end
N=length(a);
A=zeros(N,N+1);
A(:,1)=a;
A(:,2)=b;
for j=3:N+1
    for i=j-1:N
        A(i,j)=(A(i,j-1)-A(i-1,j-1))/(A(i,1)-A(i-(j-2),1));
    end
end
ChaShang_List=A
end

Newton差商表

x

f(x)

一阶差商

二阶差商

三阶差商

四阶插商

4

2

0

0

0

0

5

2.23607

0.23607

0

0

0

6

2.44949

0.21342

-0.011325

0

0

7

2.64575

0.19626

-0.00858

0.000915

0

8

2.82843

0.18268

-0.00679

0.000597

-0.00008

插值脚本

代码5

function y = Newton(a,b,x,n)
% Newton插值法 a,b分别为x以及对应的f(x),x为插入数据,n为插值多项式次数
% a=4:8
% b=[2 2.23607 2.44949 2.64575 2.82843]
if n>=length(a)
    error('n值太大')
end
A=Chashang_List(a,b);
S=A(1,2);
X=cumprod(x-a);
for i=1:n
    S=S+A(i+1,i+2)*X(i);
end
y=S;
end

代码6

function p= Newton_fun(x,xi,yi)
n=length(xi);
f=zeros(n,n);

% 对差商表第一列赋值
for k=1:n
    f(k)=yi(k);
end
% 求差商表
for i=2:n       % 差商表从0阶开始;但是矩阵是从1维开始存储!!!!!!
    for k=i:n
        f(k,i)=(f(k,i-1)-f(k-1,i-1))/(xi(k)-xi(k+1-i));
    end
end
disp('差商表如下:');
disp(f);

%求插值多项式
p=0;
for k=2:n
    t=1;
    for j=1:k-1
        t=t*(x-xi(j));
        disp(t)
    end
    p=f(k,k)*t+p;
    disp(p)
end
p=f(1,1)+p;

end

% Command Window 输入
% x=sym('x');
% xi=[4:8];
% yi=[2 2.23607 2.44949 2.64575 2.82843];
% p= Newton_fun(x,xi,yi)
% p= Newton_fun(7.5,xi,yi)

Lagrange与Newton插值公式分别得到的多项式值为

Lagrange插值

2.73863

Newton插值

2.73863

问题2

,试用

确定二点三次Hermite插值多项式H3(x)并计算H3(pi/12)的值。

构建hermite函数

function y=hermite(x0,y0,dy,x)
n=length(x0);
m=length(x);
for k=1:m 
    yy=0.0;
    for i=1:n
        h=1.0;
        a=0.0;
        for j=1:n
            if j~=i
                h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2;
                a=1/(x0(i)-x0(j))+a;
            end
        end
        yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-dy(i))+y0(i));
    end
    y(k)=yy;
end
end

插值多项式H3(x)并计算H3(pi/12)的值

clc;clear;
x=sym('x');
x0=[0,pi/6];
y0=[0,1/2]; %函数值
y1=[1,3^0.5/2]; %导数值
format long;
y=hermite(x0,y0,y1,pi/12)
y=hermite(x0,y0,y1,x)

画图与标准值对比

x1=[0:pi/60:pi/6];y=hermite(x0,y0,y1,x1);
plot(x1,y,'b') %蓝色为插值计算结果
y2=sin(x1);  %标准值
hold on
plot(x1,y2,'r--') %红色为标准值
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值