分段线性插值函数的编程实现.docx

上传人:b****2 文档编号:2137661 上传时间:2022-10-27 格式:DOCX 页数:15 大小:144.55KB
下载 相关 举报
分段线性插值函数的编程实现.docx_第1页
第1页 / 共15页
分段线性插值函数的编程实现.docx_第2页
第2页 / 共15页
分段线性插值函数的编程实现.docx_第3页
第3页 / 共15页
分段线性插值函数的编程实现.docx_第4页
第4页 / 共15页
分段线性插值函数的编程实现.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

分段线性插值函数的编程实现.docx

《分段线性插值函数的编程实现.docx》由会员分享,可在线阅读,更多相关《分段线性插值函数的编程实现.docx(15页珍藏版)》请在冰豆网上搜索。

分段线性插值函数的编程实现.docx

分段线性插值函数的编程实现

1问题的提出

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

虽然MATLAB里有直接分段线性插值的函数,但为了对分段插值算法有更明确的理解,编写该程序是有必要的.

需要解决的问题:

1、由已知数据节点编写程序,实现分段线性插值函数,从而能由所编函数得到非节点的函数值.

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

2理论基础

分段线性插值适用于计算简单、光滑性要求不高的插值问题,且其整体逼近的效果较好.

从几何意义上看,分段线性插值就是用折线近似代替曲线.

设在区间[a,b]上取n+1个点

函数在上述节点处的函数值为

于是得到n+1个点

连接相邻两点和,得一折线函数,若满足:

(1)在[a,b]上连续;

(2);

(3)在每个小区间上是线性函数,

则称折线函数为分段线性插值函数.

模型一:

由分段线性插值函数的定义可知,在每个小区间上可表为

.

是一分段函数,若用基函数表示,只需对令

显然,是分段的线性连续函数,且满足

于是

模型二:

首先确定间隔序列,使得:

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

最后一个量是一阶均差

则插值基函数可表示为

截断误差为:

若,令当时

从而

当时有即收敛于。

3编程过程

1、模型一:

用MATLAB分别建立m文件:

(1)原函数fd1.m

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

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

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

在MATLAB窗口中执行:

fd3n=2的数据见附录,图像如下:

n=8的图如下:

n=20的图

3、模型二:

用MATLAB分别建立m文件:

(1)分段插值函数fd22

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

源程序(参见附录).

在MATLAB窗口中执行:

fd32

得下图:

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

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

编写程序fd33.m,得图.

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

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

得下图:

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

4结果分析

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

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

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

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

5结论

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

参考文献

[1]李庆杨,王能超.数值分析.(第4版)[M].武汉:

华中科技大学出版社,2006:

13-24.

[2]肖筱南,赵来军.现代数值计算方法.[M].北京:

北京大学出版社,2003:

146-149.

[3]吴勃英,王德明.数值分析原理.[M].北京:

科学出版社,2003:

132-134.

[4]刘卫国编.MATLAB程序设计教程.[M].北京:

中国水利水电出版社,2001:

1-180.

[5]蔺小林,蒋耀林.现代数值分析.[M].北京:

国防工业出版社,2004:

184-186.

 

附录

程序如下:

%fd1.m线性插值原函数

functiony=fd1(x)

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

 

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

functionyi=fd2(x,y,xi)

n=length(x);

m=length(y);

ifn~=m

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

return;

end

fork=1:

n-1

ifabs(x(k)-x(k+1))

error('数据有误');

return;

end

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

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('请输入分端节点数:

');

ifn<=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);

fork1=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('原函数(实线)-插值函数(虚线)');

holdon

subplot(2,1,2);plot(xx,w,'k:

');%误差的图像

xlabel('x');

ylabel('R(x)');

title('误差分析');

holdon

xx=xx';

yyi=yyi';

z=z';

w=w';

 

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

functionv=fd22(x,y,u)

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

n=length(x);

k=ones(size(u));

forj=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'];

fori=1:

5

n=2*i+1;

x=linspace(-5,5,n);%把区间[-55]分为(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));holdon;%画出插值函数图像及误差图像

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

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,[-55],'k');%画出原函数图像

holdoff

 

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

close

t=[-5:

0.01:

5];

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

fori=1:

5

n=2*i+1;

x=[-5rand(1,n-2)*10-55];%得(-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));holdon;

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

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,[-55],'k');

holdoff

 

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

clear

t=[-5:

0.01:

5];a=[];b=[];

fori=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=[ae];

b=[bn];

end

plot(b,a,'go')

xlabel('n节点数')

ylabel('e误差平方和')

holdon

n=2的数据:

X

Y

YI(原函数)

W

-5.0000

0.0385

0.0385

0

-4.9000

0.0400

0.0577

-0.0177

-4.8000

0.0416

0.0769

-0.0353

-4.7000

0.0433

0.0962

-0.0528

-4.6000

0.0451

0.1154

-0.0703

-4.5000

0.0471

0.1346

-0.0876

-4.4000

0.0491

0.1538

-0.1047

-4.3000

0.0513

0.1731

-0.1218

-4.2000

0.0536

0.1923

-0.1387

-4.1000

0.0561

0.2115

-0.1554

-4.0000

0.0588

0.2308

-0.1719

-3.9000

0.0617

0.2500

-0.1883

-3.8000

0.0648

0.2692

-0.2045

-3.7000

0.0681

0.2885

-0.2204

-3.6000

0.0716

0.3077

-0.2361

-3.5000

0.0755

0.3269

-0.2515

-3.4000

0.0796

0.3462

-0.2665

-3.3000

0.0841

0.3654

-0.2813

-3.2000

0.0890

0.3846

-0.2956

-3.1000

0.0943

0.4038

-0.3096

-3.0000

0.1000

0.4231

-0.3231

-2.9000

0.1063

0.4423

-0.336

-2.8000

0.1131

0.4615

-0.3484

-2.7000

0.1206

0.4808

-0.3601

-2.6000

0.1289

0.5000

-0.3711

-2.5000

0.1379

0.5192

-0.3813

-2.4000

0.1479

0.5385

-0.3905

-2.3000

0.1590

0.5577

-0.3987

-2.2000

0.1712

0.5769

-0.4057

-2.1000

0.1848

0.596

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1