matlab实现插值法和曲线拟合

  • 格式:docx
  • 大小:269.31 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

插值法和曲线拟合

电子科技大学

摘要:理解拉格朗日多项式插值、分段线性插值、牛顿前插,曲线拟合,用matlab编程求解函数,用插值法和分段线性插值求解同一函数,比较插值余项;用牛顿前插公式计算函数,计算函数值;对于曲线拟合,用不同曲线拟合数据。

关键字:拉格朗日插值多项式;分段线性插值;牛顿前插;曲线拟合

引言:

在数学物理方程中,当给定数据是不同散点时,无法确定函数表达式,求解函数就需要很大的计算量,我们有多种方法对给定的表格函数进行求解,我们这里,利用插值法和曲线拟合对函数进行求解,进一步了解函数性质,两种方法各有利弊,适合我们进行不同的散点函数求解。

正文:

一、插值法和分段线性插值

1拉格朗日多项式原理

对某个多项式函数,已知有给定的k + 1个取值点:

其中对应着自变量的位置,而对应着函数在这个位置的取值。

假设任意两个不同的x j都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:

[3]

拉格朗日基本多项式的特点是在上取值为1,在其它的点上取值为0。2分段线性插值原理

给定区间[a,b], 将其分割成a=x

0

1

<…

n

=b, 已知函数y= f(x) 在这些插值结点的函数

值为

y k =f(x

k

)(k=0,1,…,n)求一个分段函数I

h

(x), 使其满足:

(1) I h (x k )=y k ,(k=0,1,…,n) ;

(2) 在每个区间[x k ,x k+1 ] 上,I h (x)是个一次函数。

易知,I h (x)是个折线函数, 在每个区间[x k ,x k+1 ]上,(k=0,1,…,n) k

1k k 1k 1

k k 1k k k ,1)

()

()(x x x x x f x x x x x f x L --+--=++++,

于是, I h (x)在[a,b]上是连续的,但其一阶导数是不连续的。 3拉格朗日插值多项式算法

○1输入,(0,1,2,,)i i x y i n = ,令0)(=x L n 。 ○

2对0,1,2,,i n = ,计算 0,()()/()

n

i j i j j j i

l x x x x x -≠=

--∏

()()()n n i i

L x L x l x y ←−−+

4分段线性插值算法

○1输入(x k ,y k ),k=0,1,…,n;

○2计算k

1k k 1k 1

k k 1k k k ,1)

()

()(x x x x x f x x x x x f x L --+--=++++

5插值法和分段线性插值程序

按下列数据分别作五次插值和分段线性插值,画出两条插值曲线以及给定数据点。求x 1=0.32,

functionlagrint

xi=[0.32,0.55,0.68];

%xi=[0.2:0.001:0.8];

x=[0.3,0.42,0.50,0.58,0.66,0.72];

y=[1.04403,1.08462,1.11803,1.15603,1.19817,1.23223]; L=zeros(size(y)); m=length(xi); fori=1:m

dxi=xi(i)-x;

L(1)=prod(dxi(2:6))/prod(x(1)-x(2:6));

L(6)=prod(dxi(1:6-1))/prod(x(6)-x(1:6-1)); for j=2:6-1

num=prod(dxi(1:j-1))*prod(dxi(j+1:6));

den=prod(x(j)-x(1:j-1))*prod(x(j)-x(j+1:6));

L(j)=num/den;

end

yi(i)=sum(y.*L);

fprintf('x=%f,y=%f\n',xi(i),yi(i));

end

plot(xi,yi,'r');

axis([0.2 0.8 1.03 1.24]);

hold on

plot(x,y,'b.','markersize',20)

grid on

分段线性插值算法程序:

function [y]=div

%xi=[0.3:0.001:0.72];

x0=[0.3,0.42,0.50,0.58,0.66,0.72];

y0=[1.04403,1.08462,1.11803,1.15603,1.19817,1.23223]; k=1;

xi=[0.32,0.55,0.68];

for j=1:3

fori=1:5

if xi(j)>=x0(i) && xi(j)<=x0(i+1) && k<=3

lx(1)=(xi(j)-x0(i+1))/(x0(i)-x0(i+1));

lx(2)=(xi(j)-x0(i))/(x0(i+1)-x0(i));

y(k)=lx(1)*y0(i)+lx(2)*y0(i+1);

k=k+1;

end

end

end

plot(xi,y,'r');

axis([0.2 0.8 1.03 1.24]);

hold on

plot(x0,y0,'b.','markersize',20)

grid on

6运算结果

拉格朗日插值结果