数值计算方法——插值公式的实现

lagrange插值公式

function Ln=lagrange(x,y,w)
% x=input('请输入x向量:');
% y=input('请输入y向量:');
% w=input('请输入待求值:');
Ln=0;
for i=1:n
    z=1;%基函数,每次循环前置为1,这个很重要
    for j=1:n
        if i~=j
            z=z.*(w-x(j))/(x(i)-x(j));
        end   
    end
    Ln=Ln+z.*y(i);
end
%调用函数脚本文件,运行可输出。
clear;
clc;
fprintf('输入一组节点(x,y)以及待求x0。其中y为函数值')
while 1
    x=input('x');
    y=input('y');
    w=input('x0');
    m=length(x);
    n=length(y);
    if m==n
        break
    end
end
%参考数据
% x=[100 121 144];
% y=[10 11 12];
%w=125
Ln=lagrange(x,y,w);
disp(Ln)

两点Hermite插值公式

%函数名:phi0.m
function phi0=phi0(t)
phi0=(1-t)*(1-t)*(1+2*t);
%函数名:phi1.m
function phi1=phi1(t)
phi1=t*(1-t)^2;
%函数名:Hermite.m
function H3=Hermite(x,y0,y1,w)
m=length(x);
n=length(y0);
r=length(y1);
if m==n&&n==r
%     phi0(t)=(1-t)^2*(1+2t);
%     phi1(t)=t*(1-t)^2;
    h=x(2)-x(1);
    t=(w-x(1))/h;
    h00(w)=phi0(t);
    t=(x(2)-w)/h;
    h10(w)=phi0(t);
    t=(w-x(1))/h;
    h01(w)=h*phi1(t);
    t=(x(2)-w)/h;
    h11(w)=-h*phi1(t);
    H3=y0(1)*h00(w)+y0(2)*h10(w)+y1(1)*h01(w)+y1(2)*h11(w);
end
%脚本文件运行可输出,调用了前三个函数
clear;
clc;
fprintf('输入一组节点(x,y0,y1)以及待求x0。其中y0为函数值,y1为一阶导数值')
while 1 %提高健壮性,避免输入错误的数
    x=input('x');
    y0=input('y0');
    y1=input('y1');
    w=input('x0');
    m=length(x);
    n=length(y0);
    r=length(y1);
    if m==2&&m==n&&n==r
        break
    end
end 
%参考数据
% x=[122 144];
% y0=[11 12];
% y1=[1/22 1/24];
% w=125;
H3=Hermite(x,y0,y1,w);
disp(H3)

分段低次插值公式

function s=dici(x,y,x0)
t1=x0-x(2);
t2=x0-x(1);
b1=x(1)-x(2);
b2=x(2)-x(1);
s=(t1/b1)*y(1)+(t2/b2)*y(2);
function f=FenD(x,y,x0)
%输入一组节点(x,y)
%输入待求值x0
n=length(x);
for a=0:n-1
    if x0<x(a+1)&&x0>x(a)
        x1=[x(a),x(a+1)];
        y1=[y(a),y(a+1)];
        f=dici(x1,y1,x0);
    end
end
%测试代码
clear;
clc;
fprintf('输入一组节点(x,y)以及待求x0。其中y为函数值')
while 1
    x=input('x');
    y=input('y');
    x0=input('x0');
    m=length(x);
    n=length(y);
    if m==n
        break
    end
end
% x=[11 12 34 45];
% y=[23 34 66 45];
% x0=33;
y0=FenD(x,y,x0);
disp(y0)

分段高次插值公式

function s=gaoci(x,y0,y1,x0)
%函数名gaoci.m
h=zeros(2,2);
d=x(2)-x(1);
t1=(x0-x(1))/d;
h(1,1)=phi0(t1);
t2=(x(2)-x0)/d;
h(2,1)=phi0(t2);
t3=(x0-x(1))/d;
h(1,2)=d*phi1(t3);
t4=(x(2)-x0)/d;
h(2,2)=-d*phi1(t4);
s=y0(1)*h(1,1)+y0(2)*h(2,1)+y1(1)*h(1,2)+y1(2)*h(2,2);

phi0和phi1函数已经在两点Hermite插值公式代码处给出!

function f=FenG(x,y0,y1,x0)
%输入一组节点(x,y0,y1)其中y0为函数值,y1为一阶导数值
%输入待求值x0
n=length(x);
for a=1:n-1
    if x0<x(a+1)&&x0>x(a)
        b=[x(a),x(a+1)];
        b0=[y0(a),y0(a+1)];
        b1=[y1(a),y1(a+1)];
        f=gaoci(b,b0,b1,x0);
    end
end
clear;
clc;
%分段高次插值公式测试代码
fprintf('输入一组节点(x,y0,y1)以及待求x0。其中y0为函数值,y1为一阶导数值')
while 1 %提高健壮性,避免输入错误的数
    x=input('x');
    y0=input('y0');
    y1=input('y1');
    x0=input('x0');
    m=length(x);
    n=length(y0);
    r=length(y1);
    if m==n&&n==r
        break
    end
end 
% x=[12 14 17 87 122 144];
% y0=[ 1 2 4 3 11 12];
% y1=[2 3  1 1 1/22 1/24];
% x0=125;
y0=FenG(x,y0,y1,x0);
disp(y0)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyacinth&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值