数值分析实验报告.docx
《数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
数值分析实验报告
(此文档为word格式,下载后您可任意编辑修改!
)
姓名:
袁义平
学号:
班级:
信息与计算科学二班
实验一误差分析
实验1.1(病态问题)
实验目的:
算法有“优”与“劣”之分,问题也有“好”与“坏”之别。
对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。
通过本实验可获得一个初步体会。
数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。
病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。
问题提出:
考虑一个高次的代数多项式
显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。
现考虑该多项式的一个扰动
其中是一个非常小的数。
这相当于是对(1.1)中的系数作一个小的扰动。
我们希望比较(1.1)和(1.2)根的差别,从而分析方程(1.1)的解对扰动的敏感性。
实验内容:
为了实现方便,我们先介绍两个Matlab函数:
“roots”和“poly”。
其中若变量a存储n+1维的向量,则该函数的输出u为一个n维的向量。
设a的元素依次为,则输出u的各分量是多项式方程
的全部根;而函数
的输出b是一个n+1维变量,它是以n维变量v的各分量为根的多项式的系数。
可见“roots”和“poly”是两个互逆的运算函数。
上述简单的Matlab程序便得到(1.2)的全部根,程序中的“ess”即是(1.2)中的。
实验要求:
(1)选择充分小的ess,反复进行上述实验,记录结果的变化并分析它们。
如果扰动项的系数很小,我们自然感觉(1.1)和(1.2)的解应当相差很小。
计算中你有什么出乎意料的发现?
表明有些解关于如此的扰动敏感性如何?
(2)将方程(1.2)中的扰动项改成或其它形式,实验中又有怎样的现象出现?
(3)(选作部分)请从理论上分析产生这一问题的根源。
注意我们可以将方程(1.2)写成展开的形式,
同时将方程的解x看成是系数的函数,考察方程的某个解关于的扰动是否敏感,与研究它关于的导数的大小有何关系?
为什么?
你发现了什么现象,哪些根关于的变化更敏感?
思考题一:
(上述实验的改进)
在上述实验中我们会发现用roots函数求解多项式方程的精度不高,为此你可以考虑用符号函数solve来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab的帮助。
实验过程:
程序:
a=poly(1:
20);
rr=roots(a);
forn=2:
21
n
form=1:
9
ess=10^(-6-m);
ve=zeros(1,21);
ve(n)=ess;
r=roots(a+ve);
-6-m
s=max(abs(r-rr))
end
end
利用符号函数:
(思考题一)
a=poly(1:
20);
y=poly2sym(a);
rr=solve(y)
forn=2:
21
n
form=1:
8
ess=10^(-6-m);
ve=zeros(1,21);
ve(n)=ess;
a=poly(1:
20)+ve;
y=poly2sym(a);
r=solve(y);
-6-m
s=max(abs(r-rr))
end
end
数值实验结果及分析:
formatlong
-6-mn
-7
-8
-9
-10
2
2.31
1.58
1.48
0.47
3
1.24
0.64
0.41
0.11
4
0.36
0.61
0.34
0
5
0.71
0.44
0
0
6
0
0
0
0
7
0
0
0
0
8
0
0
0
0
9
0
0
0
0
10
0
0
0
0
11
0
0
0
0
12
0
0
0
0
13
0
0
0
0
14
0
0
0
0
15
0
0
0
0
16
0
0
0
0
17
0
0
0
0
18
0
0
0
0
19
0
0
0
0
20
0
0
0
0
21
0
0
0
0
-6-mn
-11
-12
-13
-14
2
0.80
0.80
0.98
0
3
0.46
0
0
0
4
0
0
0
0
5
0
0
0
0
6
0
0
0
0
7
0
0
0
0
8
0
0
0
0
9
0
0
0
0
10
0
0
0
0
11
0
0
0
0
12
0
0
0
0
13
0
0
0
0
14
0
0
0
0
15
0
0
0
0
16
0
0
0
0
17
0
0
0
0
18
0
0
0
0
19
0
0
0
0
20
0
0
0
0
21
0
0
0
0
讨论:
利用这种方法进行这类实验,可以很精确的扰动敏感性的一般规律。
即当对扰动项的系数越来越小时,对其多项式扰动的结果也就越来越小,即扰动敏感性与扰动项的系数成正比,扰动项的系数越大,对其根的扰动敏感性就越明显,当扰动的系数一定时,扰动敏感性与扰动的项的幂数成正比,扰动的项的幂数越高,对其根的扰动敏感性就越明显。
实验总结:
利用MATLAB来进行病态问题的实验,虽然其得出的结果是有误差的,但是可以很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。
实验二插值法
实验2.1(多项式插值的振荡现象)
问题提出:
考虑一个固定的区间上用插值逼近一个函数。
显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。
我们自然关心插值多项式的次数增加时,L(x)是否也更加靠近被逼近的函数。
龙格给出了一个极著名例子。
设区间[-1,1]上函数
f(x)=1/(1+25x^2)
实验内容:
考虑区间[-1,1]的一个等距划分,分点为:
x(i)=-1+2i/n,i=0,1,2…,n
泽拉格朗日插值多项式为:
L(x)=∑l(i)(x)/(1+25x(j)^2)i=0,1,…n
其中l(i)(x),i=0,1,…n,n是n次拉格朗日插值基函数。
实验要求:
⑴选择不断增大的分点数目n=2,3…,画出f(x)及插值多项式函数L(x)在[-1,1]上的图象,比较分析实验结果。
(2)选择其它的函数,例如定义在区间[-5,5]上的函数
h(x)=x/(1+x^4),g(x)=arctanx
重复上述的实验看其结果如何。
(3)区间[a,b]上切比雪夫点的定义为:
xk=(b+a)/2+((b-a)/2)cos((2k-1)π/(2(n+1))),k=1,2,^,n+1
以x1,x2^x(n+1)为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果。
实验过程:
程序:
多项式插值的震荡现象(实验2.1)
form=1:
6
subplot(2,3,m)%把窗口分割成2*3大小的窗口
largrang(6*m)%对largrang函数进行运行
ifm==1
title('longn=6')
elseifm==2
title('longn=12')
elseifm==3
title('longn=18')
elseifm==4
title('longn=24')
elseifm==5
title('longn=30')
elseifm==6
title('longn=36')
end%对每个窗口分别写上标题为插值点的个数
end
保存为:
chazhi.m
functionlargrang(longn)
mm=input('pleaseinputmm(运行第几个函数就输入mm为几):
mm=')
ifmm==1%d表示定义域的边界值
d=1;
elseifmm==2||mm==3
d=5;
end
x0=linspace(-d,d,longn);%x的节点
ifmm==1
y0=1./(1.+25.*x0.^2);
elseifmm==2
y0=x0./(1.+x0.^4);
elseifmm==3
y0=atan(x0);
end
x=sym('x');n=length(x0);s=0.0;
fork=1:
n
p=1.0;
forj=1:
n
ifj~=k
p=p*(x-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
y=s;
ifmm==1
ezplot('1/(1+25*x^2)')
elseifmm==2
ezplot('x/(1+x^4)')
elseifmm==3
ezplot('atan(x)')
end
holdon
ezplot(y,[-d,d])
holdoff
保存为:
largrang.m
数值实验结果及分析:
对于第一个函数f(x)=1/(1+25x2)
对于第二个函数h(x)=x/(1+x4)
对于第三个函数g(x)=arctan(x)
讨论:
通过对三个函数得出的largrang插值多项式并在数学软件中的运行,得出函数图象,说明了对函数的支点不是越多越好,而是在函数的两端而言支点越多,而largrang插值多项式不是更加靠近被逼近的函数,反而更加远离函数,在函数两端的跳动性更加明显,argrang插值多项式对函数不收敛。
实验总结:
利用MATLAB来进行函数的largrang插值多项式问题的实验,虽然其得出的结果是有误差的,但是增加支点的个数进行多次实验,可以找出函数的largrang插值多项式的一般规律,当支点增加时,largrang插值多项式对函数两端不收敛,不是更加逼近,而是更加远离,跳动性更强。
所以对于函数的largrang插值多项式问题可以借助于MATLAB来进行问题的分析,得到比较准确的实验结规律。
实验三函数逼近与曲线拟合
实验3.1(曲线逼近方法的比较)
问题提出:
曲线的拟合和插值,是逼近函数的基本方法,每种方法具有各自的特点和特定的适用范围,实际工作中合理选择方法是重要的。
实验内容:
考虑实验2.1中的著名问题。
下面的MATLAB程序给出了该函数的二次和三次拟合多项式。
x=-1:
0.2:
1;
y=1/(1+25*x.*x);
xx=-1:
0.02:
1;
p2=polyfit(x,y,2);
yy=polyval(p2,xx);
plot(x,y,’o’,xx,yy);
xlabel(‘x’);
ylabel(‘y’);
holdon;
p3=polyfit(x,y,3);
yy=polyval(p3,xx);
plot(x,y,’o’,xx,yy);
holdoff;
适当修改上述MATLAB程序,也可以拟合其他你有兴趣的函数。
实验要求:
(1)将拟合的结果与拉格朗日插值及样条插值的结果比较。
(2)归纳总结数值实验结果,试定性地说明函数逼近各种方法的适用范围,及实际应用中选择方法应注意的问题。
第
(1)问:
对函数进行拟合,与所给的节点进行了比较,程序代码如下:
拟合程序代码:
x=-1:
0.2:
1;
y=1./(1+25*x.^2);
xx=-1:
0.02:
1;
p2=polyfit(x,y,2);
yy=polyval(p2,xx);
subplot(2,2,1)
xlabel('x');
ylabel('y');
holdon;
p3=polyfit(x,y,2);
yy=polyval(p3,xx);
plot(x,y,'o',xx,yy);
x=-1:
0.2:
1;
y=1./(1+25*x.^2);
xx=-1:
0.02:
1;
p2=polyfit(x,y,2);
yy=polyval(p2,xx);
subplot(2,2,2)
xlabel('x');
ylabel('y');
holdon;
p3=polyfit(x,y,4);
yy=polyval(p3,xx);
plot(x,y,'o',xx,yy);
x=-1:
0.2:
1;
y=1./(1+25*x.^2);
xx=-1:
0.02:
1;
p2=polyfit(x,y,2);
yy=polyval(p2,xx);
subplot(2,2,3)
xlabel('x');
ylabel('y');
yy=polyval(p3,xx);
holdon;
p3=polyfit(x,y,7);
yy=polyval(p3,xx);
plot(x,y,'o',xx,yy);
x=-1:
0.2:
1;
y=1./(1+25*x.^2);
xx=-1:
0.02:
1;
p2=polyfit(x,y,2);
yy=polyval(p2,xx);
subplot(2,2,4)
xlabel('x');
ylabel('y');
holdon;
p3=polyfit(x,y,9);
yy=polyval(p3,xx);
plot(x,y,'o',xx,yy);
holdoff;
实验结果:
图1不同次数的拟合函数图像与原函数比较
拉格朗日插值结果:
三次样条插值的结果
对比这三种方式的插值我们可以看出,无论是拉格朗日插值还是高次函数的拟合,在当次数很高的时候,在两端都可能出现龙格现象。
而采用三次样条插值函数对原函数插值的时候,随着点的越来越多,越来越接近于原函数。
第
(2)问:
归纳总结数值实验结果,试定性地说明函数逼近各种方法的适用范围,及实际应用中选择方法应注意的问题。
实验结果:
在这几次的数值实验中,对函数运用不同的插值方法进行了插值,如拉格朗日插值,切比雪夫插值,以及三次样条插值。
在本次实验中又对该函数进行了拟合。
总结归纳每种种函数逼近的结果如下所示:
1拉格朗日插值:
2切比雪夫插值:
3三次样条插值:
④拟合:
结果分析:
我们可以看出,在进行高次函数插值的过程中,随着次数的增加,拉格朗日函数和拟合函数会随着次数的增加在两端出现比较明显的龙格现象。
究其原因就是,插值余项的高阶导数的值会随着函数次数的增加而显著的增加。
但在采用切比雪夫节点和三次样条插值函数进行插值的时候,并没有看到插值函数图形出现龙格现象。
并且明显可以看出随着点的增多,和原函数的拟合程度越好。
实验总结:
在实际生产生活中,若要求对一个函数进行插值的话,需根据实际情况,选择合适的插值函数。
若要求的插值函数给出的点不是很多,那么我们可以考虑拉格朗日插值函数。
但若要求对多个点进行插值拟合的时候,那么我们应该选择切比雪夫或者是三次样条插值函数对原函数进行拟合插值。