数 值 分 析 实 验 报 告
实验一
实验 1.1 (病态问题)
误差分析
实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。
对数值方法的研究而言, 所谓坏问题就是问题本身对扰动敏感者, 反之属于好问题。通过本实验可获得一个初步体会。
数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。 病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价 (如耗用更多的机器时间、 占用更多的存储空间等)。
问题提出:考虑一个高次的代数多项式
20
p(x) ( x 1)( x 2) ( x 20)
k
1
(x k )
(1.1)
显然该多项式的全部根为 1,2,?,20 共计 20 个,且每个根都是单重的。现考虑该多项式的一个扰动
p( x) x 0
19
(1.2)
其中 是一个非常小的数。这相当于是对(
1.1)中 x 的系数作一个小的扰动。
19
我们希望比较( 1.1)和( 1.2)根的差别,从而分析方程( 1.1)的解对扰动的敏感性。
实验内容: 为了实现方便,我们先介绍两个 Matlab 函数:“roots”和“ poly”。
u roots(a)
其中若变量 a 存储 n+1 维的向量,则该函数的输出 u 为一个 n 维的向量。设 a 的元
素依次为 a1, a2 , , an 1 ,则输出 u 的各分量是多项式方程 a1 x a2 x
n
n 1
an x an 1 0
的全部根;而函数
b poly(v)
的输出 b 是一个 n+1 维变量,它是以 n 维变量 v 的各分量为根的多项式的系数。 可见“ roots”和“ poly”是两个互逆的运算函数。
ess 0.000000001; ve zeros(1,21); ve(2) ess;
0
数 值 分 析 实 验 报 告
roots ( poly (1: 20) ve)
上述简单的 Matlab 程序便得到( 1.2)的全部根,程序中的“ ess”即是( 1.2)中的 。
实验要求:
(1)选择充分小的 ess,反复进行上述实验,记录结果的变化并分析它们。如
果扰动项的系数 很小,我们自然感觉( 1.1)和( 1.2)的解应当相差很小。计算中你有什么出乎意料的发现?表明有些解关于如此的扰 动敏感性如何? (2)将方程( 1.2)中的扰动项改成
x 或其它形式,实验中又有怎样的现
18
象出现?
(3)(选作部分)请从理论上分析产生这一问题的根源。注意我们可以将
方程( 1.2)写成展开的形式,
p( x, ) x
20
x
19
0
(1.3)
同时将方程的解 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);
1
数 值 分 析 实 验 报 告
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
数值实验结果及分析:
format long
-6-m n 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -6-m n
2
-7 -8 -9 -10
2.79722687478331 1.86753632009158 1.06052762380748 0.25273144219047 1.69376699767424 0.92310666706964 0.08471614569741 0.40804026409411 0.85401393415536 0.19941022020061 0.11031100538871 0.04296532362844
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -11
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -12
0.03972935295834
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -13
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -14
数 值 分 析 实 验 报 告
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
0.03877676439380 0.02164258317546
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.16256584868280
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0.13322664013598
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
讨论:
利用这种方法进行这类实验, 可以很精确的扰动敏感性的一般规律。 即当对扰动项的系数越来越小时, 对其多项式扰动的结果也就越来越小, 即扰动敏感性与扰动项的系数成正比, 扰动项的系数越大, 对其根的扰动敏感性就越明显, 当扰动的系数一定时, 扰动敏感性与扰动的项的幂数成正比, 扰动的项的幂数越高, 对其根的扰动敏感性就越明显。
实验总结:
利用 MATLAB 来进行病态问题的实验,虽然其得出的结果是有误差的,但是可 以很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动, 对其多 项式的根会有一定的扰动的,所以对于这类病态问题可以借助于 MATLAB 来进行问题的分析。
学号: 06450210
3
数 值 分 析 实 验 报 告
姓名:万轩
实验二
插值法
实验 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')
4