当前位置:   article > 正文

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

matlab做数值实验的代码写法

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
%% 输入参数
% 输入节点
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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
%% 输入参数
% 输入节点
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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
%% 输入参数
% 输入节点
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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.3.3 计算结果

在这里插入图片描述

4 分析与讨论

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/193252
推荐阅读
相关标签
  

闽ICP备14008679号