- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验名称 : 实验一 拉格朗日插值
引言
我 在生 生活中常常会遇到 的 : 某个 中, 函数 f(x) 在区 [a,b] 上存在且 ,但却很 找到其表达式,只能通 和 得到有限点上的函数表。 然,根据
些点的函数 来求其它点的函数 是非常困 的。有些情况 然可以写出表达式,但 构复 ,使用不方便。所以我 是希望根据已有的数据点(或函数表)来构造某个 函数
P(x) 作 f(x)的近似 。插 法是解决此 的一种比 古老的、 但却很常用的方法。 它不 直接广泛地 用于生 和科学研究中,而且也是 一步学 数 算方法的基 。
实验目的和要求
运用 Matlab 写三个 .m 文件,定 三种插 函数,要求一次性 入整 函数表,并利用 算机 在插 算中所需的 点。分 通 分段 性插 、分段二次插 和全区 上拉格朗日插 算 f(0.15),f(0.31),f(0.47)的近似 。已知函数表如下:
x
0.0
0.1
0.195
0.3
0.401
0.5
f(x)
0.39894
0.39695
0.39142
0.38138
0.36812
0.35206
算法原理与流程图
1)原理
函数 y=在插 区 [a,b] 上 ,且在 n+1 个不同的插 点 a≤x0,x1, ? ,xn ≤b上分 取
y0,y1, ? ,yn 。目的是要在一个性 良、便于 算的插 函数 Φ中,求一 函数 P(x), 足插 条件 P(xi )=yi (i=0,1, ? ,,n)而在其他点 x≠xi上,作 f(x)近似 。求插 函数 P(x) 的方法称 插 法。在本 中,采用拉格朗日插 法。
①分段低次插
当 定了 n+1 个点 x0x1? xn 上的函数 y0,y1, ? ,yn 后,若要 算 x≠xi 函数 f(x) 的近似 ,可先 取两个 点 x i-1 与 xi 使 x∈ [x i-1,xi],然后在小区 [x i-1 ,xi ]上作 性插 ,即得 种分段低次插 叫分段 性插 ,又称折 插 。
似地,我 可以 取距离 x 最近的三个 点 xi-1 ,xi 与 xi+1 ,然后 行二次插 ,即得
种分段低次插 叫分段二次插 ,又称分段抛物 插 。
②全区 上拉格朗日插
点 xi
(i=0,1,
? 中任一点
k
(0
≤ ≤,作一
n
次多 式
k
(x),使它在 点上的取
,n)
x
k n)
l
1,在其余点 xi (i=0,1,
?-1,k+1, ? ,n)上取 零。 于每一 点
xk(k=0,1, ? ,n),都能写出
一个 足此条件的多 式, 写出了
n+1 个多 式 l0
1
?n,其中
(x),l (x),
,l(x)
l
( x )
A ( x
x
)( x
x
) L ( x
x
k 1
)( x
x
k
1
) L ? ( x
x
) ;
k
k
0
1
n
由条件 l k( x k )
1可得
于是我 可以得出如下的拉格朗日
n 次插 多 式( 于全区 上的插 ,
n 取函数表
的长度)
( 2)流程图
分段线性插值 分段二次插值 全区间拉格朗日插值
程序代码及注释
1、分段线性插值
%分段线性插值
function y=piece_linear(x0,y0,x)
%x0 , y0 为已知点, x 为待求点
n=length(x0);p=length(y0);m=length(x);
%n , p , m分别为 x0 , y0 , x 长度
if n~=p
fprintf( Error! Please input again!\n );
%x0 和 y0 长度不等时,报错
else
for
i=1:m
z=x(i);
sum=0.0;
l=0;
%给l
赋初值 , 根据 x 的值确定 l
if zx0(1)|zx0(n)
fprintf( Error!x(%d) is out of range!\n
,i);
break ;
end
%当插值点超出范围时,报错
for j=2:n
if zx0(j)
l=j;
end
if l~=0
break ;
end
end
%一旦 l 有非零值,则终止循环 , 选出合适的 l
for k=l-1:l
a=1.0;
for s=l-1:l
if s~=k
a=a*(z-x0(s))/(x0(k)-x0(s));
end
end
sum=sum+y0(k)*a;
end
y(i)=sum;
fprintf( y(%d)=%f\nx1=%.3f y1=%.5f,x2=%.3f
y2=%.5f\n\n ,i,y(i),x0(l-1),y0(l-1),x0(l),y0(l));
文档评论(0)