哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
实验报告二
题目: Gauss列主元消去法
摘要:求解线性方程组的方法很多,主要分为直接法和间接法。本实验运用直接法的Guass消去法,并采用选主元的方法对方程组进行求解。
前言:(目的和意义)
1. 学习Gauss消去法的原理。 2. 了解列主元的意义。
3. 确定什么时候系数阵要选主元 数学原理:
(k?1)由于一般线性方程在使用Gauss消去法求解时,从求解的过程中可以看到,若akk=0,(k?1)则必须进行行交换,才能使消去过程进行下去。有的时候即使akk?0,但是其绝对值非
常小,由于机器舍入误差的影响,消去过程也会出现不稳定得现象,导致结果不正确。因此有必要进行列主元技术,以最大可能的消除这种现象。这一技术要寻找行r,使得
(k?1)(k?1)|ark|?maxaik
i?k(k?1)并将第r行和第k行的元素进行交换,以使得当前的akk的数值比0要大的多。这种列主
元的消去法的主要步骤如下: 1. 消元过程
对k=1,2,…,n-1,进行如下步骤。 1) 选主元,记
|ark|?maxaik
i?k若|ark|很小,这说明方程的系数矩阵严重病态,给出警告,提示结果可能不对。 2) 交换增广阵A的r,k两行的元素。
arj?akj (j=k,…,n+1) 3) 计算消元
aij?aij?aikakj/akk (i=k+1,…,n; j=k+1,……,n+1)
2. 回代过程
对k= n, n-1,…,1,进行如下计算
.6.
哈工大A16公寓1214室 院士之家团队之作品
(Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同)
xk?(ak,n?1?至此,完成了整个方程组的求解。
程序设计:
本实验采用Matlab的M文件编写。 Gauss消去法源程序:
clear
a=input('输入系数阵:>>\\n') b=input('输入列阵b:>>\\n') n=length(b); A=[a b] x=zeros(n,1); %%%函数主体 for k=1:n-1;
%%%是否进行主元选取
j?k?1?ankjxj/akk)
if abs(A(k,k)) yzhuyuan=1; else yzhuyuan=0; end if yzhuyuan; %%%%选主元 t=A(k,k); for r=k+1:n; if abs(A(r,k))>abs(t) p=r; else p=k; end end %%%交换元素 if p~=k; for q=k:n+1; s=A(k,q); A(k,q)=A(p,q); A(p,q)=s; .7. 哈工大A16公寓1214室 院士之家团队之作品 (Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同) end end end %%%判断系数矩阵是否奇异或病态非常严重 if abs(A(k,k))< yipusilong disp(‘矩阵奇异,解可能不正确’) end %%%%计算消元,得三角阵 for r=k+1:n; m=A(r,k)/A(k,k); for q=k:n+1; A(r,q)=A(r,q)-A(k,q)*m; end end end %%%%求解x x(n)=A(n,n+1)/A(n,n); for k=n-1:-1:1; s=0; for r=k+1:n; s=s+A(k,r)*x(r); end t=(A(k,n+1)-s) x(k)=(A(k,n+1)-s)/A(k,k) end 结果分析和讨论: ??26??x??22???y???34?。其中为一小数,当?5?10?14?20575例:求解方程?时,??10,10,10,10?????????321????z????10??分别采用列主元和不列主元的Gauss消去法求解,并比较结果。 记Emax为求出的解代入方程后的最大误差,按要求,计算结果如下: 当??10?5时,不选主元和选主元的计算结果如下,其中前一列为不选主元结果,后一列为选主元结果,下同。 0.99999934768391 0.99999934782651 .8. 哈工大A16公寓1214室 院士之家团队之作品 (Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同) 2.00000217421972 2.00000217391163 2.99999760859451 2.99999760869721 Emax= 9.301857062382624e-010,0 此时,由于?不是很小,机器误差就不是很大,由Emax可以看出不选主元的计算结果精度还可以,因此此时可以考虑不选主元以减少计算量。 当??10?10时,不选主元和选主元的计算结果如下 1.00001784630877 0.99999999999348 1.99998009720807 2.00000000002174 3.00000663424731 2.99999999997609 Emax= 2.036758973744668e-005,0 此时由Emax可以看出不选主元的计算精度就不好了,误差开始增大。 当??10?14时,不选主元和选主元的计算结果如下 1.42108547152020 1.00000000000000 1.66666666666666 2.00000000000000 3.11111111111111 300000000000000 Emax= 0.70770085900503,0 此时由Emax可以看出,不选主元的结果应该可以说是不正确了,这是由机器误差引起的。 当??10?20时,不选主元和选主元的计算结果如下 NaN 1 NaN 2 NaN 3 Emax=NaN, 0 不选主元时,程序报错:Warning: Divide by zero.。这是因为机器计算的最小精度为10-15,所以此时的??10?20就认为是0,故出现了错误现象。而选主元时则没有这种现象,而且由Emax可以看出选主元时的结果应该是精确解。 结论: 采用Gauss消去法时,如果在消元时对角线上的元素始终较大(假如大于10-5),那么本方法不需要进行列主元计算,计算结果一般就可以达到要求,否则必须进行列主元这一步,以减少机器误差带来的影响,使方法得出的结果正确。 .9. 哈工大A16公寓1214室 院士之家团队之作品 (Ps:请各位师兄弟姐妹们抄的时候注意改动一下,尽量不要太雷同) 实验报告三 题目: Rung现象产生和克服 摘要:由于高次多项式插值不收敛,会产生Runge现象,本实验在给出具体的实例后,采用分段线性插值和三次样条插值的方法有效的克服了这一现象,而且还取的很好的插值效果。 前言:(目的和意义) 1. 深刻认识多项式插值的缺点。 2. 明确插值的不收敛性怎样克服。 3. 明确精度与节点和插值方法的关系。 数学原理: 在给定n+1个节点和相应的函数值以后构造n次的Lagrange插值多项式,实验结果表明(见后面的图)这种多项式并不是随着次数的升高对函数的逼近越来越好,这种现象就是Rung现象。 解决Rung现象的方法通常有分段线性插值、三次样条插值等方法。 分段线性插值: 设在区间[a, b]上,给定n+1个插值节点 a=x0 和相应的函数值y0,y1,…,yn,,求作一个插值函数?(x),具有如下性质: 1) ?(xj)?yj,j=0,1,…,n。 2) ?(x)在每个区间[xi, xj]上是线性连续函数。则插值函数?(x)称为区间[a, b]上对应n个数据点的分段线性插值函数。 三次样条插值: 给定区间[a, b]一个分划 ⊿:a=x0 1) S(x)在每个区间[xi, xj]上是不高于3次的多项式。 2) S(x)及其2阶导数在[a, b]上连续。则称S(x)使关于分划⊿的三次样条函数。 程序设计: 本实验采用Matlab的M文件编写。其中待插值的方程写成function的方式,如下 .10.