赞
踩
实际问题中许多变量的关系可以用数学函数概念进行刻画,但是在大多数情况下,这些函数的表达式是未知的,或者已知但十分复杂,需要我们将这个函数的未知解析式近似地构造出来,或者用一个简单的函数表达式来代替复杂的函数表达式。基于上述过程,我们设计实验,通过提供未知函数或复杂函数的某些已知信息,来实现以下目的:
(1)构造该函数的近似表达式;
(2)计算该函数在其他点处的函数值;
(3)计算所构造的近似表达式与真实函数的误差。
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]
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]
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]
在本设计案例中,三种插值方法都能够有效地估算插值节点外其他点的函数值,插值结果也比较接近真实值。其中,埃尔米特插值法需要用到被插函数的导数信息,估计误差最小,效果最好。而拉格朗日插值方法和牛顿插值法的估计精度相同且次于埃尔米特插值法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。