文档库 最新最全的文档下载
当前位置:文档库 › 分段线性插值

分段线性插值

《数值分析》课程设计

题目分段线性插值

学生牛彦坡陈彬冯梦雨指导教师郭阁阳

天津工程师范学院

课程设计任务书

理学院数学0702 班学生牛彦坡陈彬冯梦雨

课程设计课题:

考察分段线性插值

一、课程设计工作日自 2009 年 6 月 22 日至 2009 年 6 月 28 日

二、同组学生:牛彦坡陈彬冯梦雨

三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、参考资

料等):

?来源与意义:

本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思想,加深对其的理解以及掌握用计算机与Matlab解决相关问题的能力。

?基本要求:

要求自编程序;掌握编程思想,学会一门编程语言;报告要有较强的理论分析;有较强说服力的数据表或图像;对结果进行分析;给出相应结论;鼓励创新;

?参考资料:

1.数值分析,李庆扬,王能超,易大义,2001,清华大学出版社(第四版)。

2.数值方法,关治,陆金甫,2006,清华大学出版社。

3.数值分析与实验学习指导,蔡大用,2001,清华大学出版社。

4.数值分析与实验,薛毅,2005,北京工业大学出版社。

指导教师签字:教研室主任签字:

天津工程师范学院

课程设计评审表

理学院数学0702 班学生牛彦坡陈彬冯梦雨

一、 问题提出:

考察分段线性插值: 对2

1()1f x x

=

+在(-5,5)上进行分段线性插值,取不同节点个数n ,得到不同

分段线性插值函数。(要求:自编程序,报告有数据表、图像、分析、结论。) 虽然matlab 里有直接分段线形插值的函数,但为了对分段插值算法有更明确的理解,编写该程序是有必要的 需要解决的问题:

1、由已知数据节点编写分段线形插值函数,从而能由所编函数得到非节点的函数值。

2、比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值效果的关系

二、理论基础

所谓分段线性插值就是通过插值点用折线段连接起来逼近f (x )。设已知节点a=x 0

1o ],,[)(b a C x I h ∈

2o k h f x I =)( ),,1,0(n k =,

3o )(x I h 在每个小区间[x k ,x k+1]上是线性函数。 则称)(x I h 为分段线性插值函数。

模型一:由定义可知)(x I h 在每个小区间[x k ,x k+1]上可表示为

)

(x I h =

111

1++++--+

--k k

k k k k k k f x x x x f x x x x )(1+≤≤k k x x x

模型二:首先确定间隔序列k ,使得:

1+≤≤k k x x x

第二个量是局部变量s ,其定义为 :

k x x s -=

最后一个量是一阶均差

k

k k k k x x y y --=

++11δ

则插值基函数可表示为

k

k k k k k x x y y x x y x L ---+=++11)

()(k

k s y δ+=.

三、实验内容

1、模型一: 用MATLAB 分别建立m 文件:

(1)原函数fd1.m

(2)分段线性插值函数fd2.m

(3)比较不同节点数所得分段线性插值函数的插值效果fd3.m

2、选取插值节点数为偶数

在MATLAB 窗口中执行:fd3 n=2的数据见附录,图像如下:

-5

-4-3-2-1

012345

x

y

原函数(实线)-插值函数(虚线)

-5

-4-3-2-1

01234

5

-1-0.5

x

R (x )

误差分析

n=8的图如下:

-5

-4-3-2-1

012345

x

y

原函数(实线)-插值函数(虚线)

-5

-4

-3

-2

-1

01

2

3

4

5

-0.4-0.200.20.4x

R (x )

误差分析

n=20的图

-5

-4-3-2-1

012345

x

y

原函数(实线)-插值函数(虚线)

-5

-4

-3

-2

-1

1

2

3

4

5

-0.1

-0.0500.05

0.1x

R (x )

误差分析

3、模型二:用MATLAB分别建立m文件:

(1)分段插值函数fd22

(2)插值效果比较函数fd32(选取插值节点数为奇数)

程序代码(参见附录)

在MATLAB窗口中执行:fd32

得下图:上图为不同节点数插值函数图像与原函数图像,下图为误差图像

-5-4-3-2-1012345

-5-4-3-2-1012345

3、由上所有的图可看出,由于原函数是偶函数,等距节点所得插值函数有很强

对称性,下任取节点,

编写程序fd33.m,得图

上图为不同节点数插值函数图像与原函数图像,下图为误差图像

-5-4

-3

-2

-1

1

2

3

4

5

00.20.40.60.81-5

-4-3-2-1012345

-1-0.5

0.5

4、比较不同节点所得插值函数与被插函数误差的平方和,程序模板为d1.m 得下图:

红星由fd32得奇数节点误差平方和,绿星加圈由fd3得偶数节点误差平方和,圈由f33得随机节点误差平方和,数据见附录

20

40

60

80

100

120

140

n 节点数

e 误差平方和

四、结果分析

1、不同插值节点数所得的分段线形插值函数,在节点处与原函数的函数值一定相同

2、所得的分段线形插值函数在原函数斜率绝对值变化大的地方,与原函数的误差比较大

3、由误差平方和e,插值节点个数越多,e有减小的趋势,最后趋于0。单考虑奇数或偶数个节点,则随节点数增加e严格减小。

4、随机生成的节点不如等距节点使插值效果好。

五、结论

插值节点个数越多,分段线形插值函数与原函数误差平方和有减小趋势,插值效果越好。

六、参考文献

《数值分析与实验》薛毅编著北京工业大学出版社

附录

代码如下:

% fd1.m线性插值原函数

function y=fd1(x)

y=1./(1+x.^2);

% fd2.m 分段线性插值函数

function yi=fd2(x,y,xi)

n=length(x);

m=length(y);

if n~=m

error('X和Y向量的长度必须相同');

return;

end

for k=1:n-1

if abs(x(k)-x(k+1))

return;

end

if x(k)<=xi&xi<=x(k+1) % 保证 x(k) < xi < x(k+1)

temp=x(k)-x(k+1);

yi=(xi-x(k+1))/temp*y(k)+(xi-x(k))/(-temp)*y(k+1)

return;

end

end

% fd3.m 比较插值效果

a=-5;

b=5;

n=input('请输入分端节点数:');

if n<=0

error('你输入的数据有误!!!');

break;

end

h=(b-a)/(n-1); % 求节点

x=a:h:b;

y=fd1(x);

xx=a:0.1:b; % 用分段线性插值函数求非节点函数值

yyi=fd1(xx);

m1=length(xx);

z=zeros(1,m1);

for k1=1:m1

z(k1)=fd2(x,y,xx(k1));

end

w=z-yyi; % 计算误差

subplot(2,1,1);plot(x,y,'o',xx,yyi,'-',x,y,'k:');%插值图像xlabel('x');

ylabel('y');

title('原函数(实线)-插值函数(虚线)');

hold on

subplot(2,1,2);plot(xx,w,'k:'); % 误差的图像

xlabel('x');

ylabel('R(x)');

title('误差分析');

hold on

xx=xx';

yyi=yyi';

z=z';

w=w';

% fd22.m 分段线性插值函数

function v=fd22(x,y,u)

delta=diff(y)./diff(x);

n=length(x);

k=ones(size(u));

for j=2:n-1

k(x(j)<=u)=j;

end

s=u-x(k);

v=y(k)+s.*delta(k);

% fd32.m同时画不同节点的插值函数图像和误差图像

clear

close

t=[-5:0.01:5];

a=['k''g''r''c''m'];

for i=1:5

n=2*i+1;

x=linspace(-5,5,n); %把区间[-5 5]分为(n-1)份,算插值节点

y=fd1(x);

p=fd22(x,y,t);p=p'; %计算以(x,y)为插值点的插值函数在t处的各个值y1=fd1(t);y1=y1';

e=p-y1; %计算误差

subplot(2,1,1);plot(x,y,a(i));hold on; %画出插值函数图像及误差图像subplot(2,1,2);plot(t,e,a(i));hold on;

end

subplot(2,1,1);

legend('n=3','n=5','n=7','n=9','n=11')

subplot(2,1,2);

legend('n=3','n=5','n=7','n=9','n=11')

subplot(2,1,1);

fplot(@fd1,[-5 5],'k'); %画出原函数图像

hold off

%fd33.m 插值节点非等分区间获得

close

t=[-5:0.01:5];

a=['k''g''r''c''m'];

for i=1:5

n=2*i+1;

x=[-5 rand(1,n-2)*10-5 5]; %得(-5,5)上的n维随机向量x=sort(x);

y=fd1(x);

p=fd22(x,y,t);p=p';

y1=fd1(t);y1=y1';

e=p-y1;

subplot(2,1,1);plot(x,y,a(i));hold on;

subplot(2,1,2);plot(t,e,a(i));hold on;

end

subplot(2,1,1);

legend('n=3','n=5','n=7','n=9','n=11')

subplot(2,1,2);

legend('n=3','n=5','n=7','n=9','n=11')

subplot(2,1,1);

fplot(@fd1,[-5 5],'k');

hold off

%fd1.m 比较不同节点数误差平方和

clear

t=[-5:0.01:5];a=[];b=[];

for i=1:10

n=2*i; %n=2*i+1则是奇数节点

x=linspace(-5,5,n)

y=fd1(x);

p=fd22(x,y,t);

y1=fd1(t);

e=p-y1;

e=e*e';

a=[a e];

b=[b n];

end

plot(b,a,'go')

xlabel('n节点数')

ylabel('e误差平方和')

hold on

n=2的数据:

n234567

误差平方和136.920979.168963.334 6.977523.73840.8329 n891011121314误差平方和9.00150.5726 3.61520.572 1.56760.46480.7472 n15161718192021误差平方和0.33660.39450.23270.22910.15930.14380.1101

相关文档