【数值分析实验】(一)插值法(含matlab代码)

目录

  • 1 背景简介
  • 2 案例设计
  • 3 数学模型
    • 3.1 拉格朗日插值法
      • 3.1.1 算法过程
      • 3.1.2 代码
      • 3.1.3 计算结果
    • 3.2 牛顿插值法
      • 3.2.1 算法过程
      • 3.2.2 代码
      • 3.2.3 计算结果
    • 3.3 埃尔米特插值法
      • 3.3.1 算法过程
      • 3.3.2 代码
      • 3.3.3 计算结果
  • 4 分析与讨论

1 背景简介

        实际问题中许多变量的关系可以用数学函数概念进行刻画,但是在大多数情况下,这些函数的表达式是未知的,或者已知但十分复杂,需要我们将这个函数的未知解析式近似地构造出来,或者用一个简单的函数表达式来代替复杂的函数表达式。基于上述过程,我们设计实验,通过提供未知函数或复杂函数的某些已知信息,来实现以下目的:
        (1)构造该函数的近似表达式;
        (2)计算该函数在其他点处的函数值;
        (3)计算所构造的近似表达式与真实函数的误差。

2 案例设计

3 数学模型

3.1 拉格朗日插值法

3.1.1 算法过程

3.1.2 代码

function y=Lagrange(xi,fx,x)
xi_num=length(xi); % 已知节点的个数
x_num=length(x);   % 需要估计的节点个数
for i=1:x_num      % 对每个估计节点执行循环
    z=x(i);
    f=0.0;
    for m=1:xi_num
        L=1.0;     % L为基函数
        for n=1:xi_num
            if n~=m
                L=L*(z-xi(n))/(xi(m)-xi(n));
            end
        end
        f=L*fx(m)+f; 
    end
    y(i)=f;
end
end
%% 输入参数
% 输入节点
xi=(1:2:11); 
% 输入节点处函数值
fx=[2.7183 2.2317 5.9365 22.3803 100.0381 494.8276];
% 输入需要估计的节点
x=[3.57 6.91 9.36];
%% 利用Lagrange计算x处函数值
y=Lagrange(xi,fx,x) % 结果为y=[1.5326 21.1960 135.2998]

3.1.3 计算结果

3.2 牛顿插值法

3.2.1 算法过程

3.2.2 代码

function y=Newton(x,xi,yi)
xi_num=length(xi); % 已知节点的个数
x_num=length(x);   % 需要估计的节点个数
f=zeros(xi_num,xi_num);
for i=1:x_num      % 对每个估计节点执行循环
    z=x(i);
    N=0.0;
    for m=1:xi_num
        f(m)=yi(m);
    end
    for n=2:xi_num % 构造差商表   
        for m=n:xi_num
            f(m,n)=(f(m,n-1)-f(m-1,n-1))/(xi(m)-xi(m+1-n));
        end
    end
    for m=2:xi_num
        t=1;
        for j=1:m-1
            t=t*(z-xi(j));
        end
        N=f(m,m)*t+N;
    end
    N=f(1,1)+N;
    y(i)=N;
end
disp('差商表如下:');
disp(f);
end
%% 输入参数
% 输入节点
xi=(1:2:11); 
% 输入节点处函数值
fx=[2.7183 2.2317 5.9365 22.3803 100.0381 494.8276];
% 输入需要估计的节点
x=[3.57 6.91 9.36];
%% 利用Newton计算x处函数值
y=Newton(x,xi,fx) % 结果为y=[2.7854 20.9903 132.5689]

3.2.3 计算结果

3.3 埃尔米特插值法

3.3.1 算法过程

3.3.2 代码

function y=Hermite(xi,fx,fx1,x)
xi_num=length(xi); % 已知节点的个数
x_num=length(x);   % 需要估计的节点个数
for i=1:x_num
    f=0.0;
    for m=1:xi_num
        H=1.0;
        a=0.0;
        for n=1:xi_num
            if n~=m
                H=H*((x(i)-xi(n))/(xi(m)-xi(n)))^2;
                a=a+1/(xi(m)-xi(n));
            end
        end
        f=f+H*((xi(m)-x(i))*(2*a*fx(m)-fx1(m))+fx(m));
    end
    y(i)=f;
end
%% 输入参数
% 输入节点
xi=(1:2:11); 
% 输入节点处函数值
fx=[2.7183 2.2317 5.9365 22.3803 100.0381 494.8276];
% 输入节点处导数值
fx1=[-2.7183 0.7439 3.5619 15.9859 77.8074 404.8590];
% 输入需要估计的节点
x=[3.57 6.91 9.36];
%% 利用Lagrange计算x处函数值
y=Hermite(xi,fx,fx1,x) % 结果为y=[2.7854 20.9903 132.5689]

3.3.3 计算结果

4 分析与讨论

        在本设计案例中,三种插值方法都能够有效地估算插值节点外其他点的函数值,插值结果也比较接近真实值。其中,埃尔米特插值法需要用到被插函数的导数信息,估计误差最小,效果最好。而拉格朗日插值方法和牛顿插值法的估计精度相同且次于埃尔米特插值法。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月20日
下一篇 2023年12月20日

相关推荐