数值分析实验报告1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一 误差分析
实验1.1(病态问题)
实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。
数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。
问题提出:考虑一个高次的代数多项式
)1.1()
()20()2)(1()(20
1∏=-=---=k k x x x x x p
显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动
)2.1(0
)(19=+x x p ε
其中ε是一个非常小的数。这相当于是对(1.1)中19x 的系数作一个小的扰动。我们希望比较(1.1)和(1.2)根的差别,从而分析方程(1.1)的解对扰动的敏感性。
实验内容:为了实现方便,我们先介绍两个Matlab 函数:“roots ”和“poly ”。
roots(a)u =
其中若变量a 存储n+1维的向量,则该函数的输出u 为一个n 维的向量。设a 的元素依次为121,,,+n a a a ,则输出u 的各分量是多项式方程
01121=+++++-n n n n a x a x a x a
的全部根;而函数
poly(v)b =
的输出b 是一个n+1维变量,它是以n 维变量v 的各分量为根的多项式的系数。可见“roots ”和“poly ”是两个互逆的运算函数。
;000000001.0=ess );21,1(zeros ve = ;)2(ess ve =
))20:1((ve poly roots +
上述简单的Matlab 程序便得到(1.2)的全部根,程序中的“ess ”即是(1.2)中的ε。
实验要求:
(1) 选择充分小的ess ,反复进行上述实验,记录结果的变化并分析它们。
如果扰动项的系数ε很小,我们自然感觉(1.1)和(1.2)的解应当相差很小。计算中你有什么出乎意料的发现?表明有些解关于如此的扰动敏感性如何? (2) 将方程(1.2)中的扰动项改成18x ε或其它形式,实验中又有怎样的现象出现?
(3) (选作部分)请从理论上分析产生这一问题的根源。注意我们可以
将方程(1.2)写成展开的形式,
)
3.1(0
),(1920=+-= x x x p αα
同时将方程的解x 看成是系数α的函数,考察方程的某个解关于α的扰动是否敏感,与研究它关于α的导数的大小有何关系?为什么?你发现了什么现象,哪些根关于α的变化更敏感?
思考题一:(上述实验的改进)
在上述实验中我们会发现用roots 函数求解多项式方程的精度不高,为此你可以考虑用符号函数solve 来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab 的帮助。
实验过程:
程序:
a=poly(1:20); rr=roots(a); for n=2:21 n
for m=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)
for n=2:21
n
for m=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
数值实验结果及分析:
讨论:
利用这种方法进行这类实验,可以很精确的扰动敏感性的一般规律。即当对扰动项的系数越来越小时,对其多项式扰动的结果也就越来越小,即扰动敏感性与扰动项的系数成正比,扰动项的系数越大,对其根的扰动敏感性就越明显,当扰动的系数一定时,扰动敏感性与扰动的项的幂数成正比,扰动的项的幂数越高,对其根的扰动敏感性就越明显。
实验总结:
利用MATLAB来进行病态问题的实验,虽然其得出的结果是有误差的,但是可以很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。
学号:06450210
:万轩
实验二插值法
实验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)
for m=1:6
subplot(2,3,m) %把窗口分割成2*3大小的窗口
largrang(6*m) %对largrang函数进行运行
if m==1
title('longn=6')
elseif m==2
title('longn=12')
elseif m==3
title('longn=18')
elseif m==4
title('longn=24')
elseif m==5
title('longn=30')
elseif m==6
title('longn=36')