logo资料库

哈尔滨工业大学数值分析上机实验报告.doc

第1页 / 共27页
第2页 / 共27页
第3页 / 共27页
第4页 / 共27页
第5页 / 共27页
第6页 / 共27页
第7页 / 共27页
第8页 / 共27页
资料共27页,剩余部分请下载后查看
实验报告一
实验报告二
实验报告三
实验报告四
实验报告五
实验报告六
实验报告 yyhhit@163.com 实验报告一 题目: 非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验 采用两种常见的求解方法二分法和 Newton 法及改进的 Newton 法。 前言:(目的和意义) 掌握二分法与 Newton 法的基本原理和应用。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和 Newton 法。 对于二分法,其数学实质就是说对于给定的待求解的方程 f(x),其在[a,b]上连续, f(a)f(b)<0,且 f(x)在[a,b]内仅有一个实根 x*,取区间中点 c,若,则 c 恰为其根,否则根 据 f(a)f(c)<0 是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。 重复运行计算,直至满足精度为止。这就是二分法的计算思想。 Newton 法通常预先要给出一个猜测初值 x0,然后根据其迭代公式 x  1 k x k  ( xf k ' ( f x k ) ) 产生逼近解 x*的迭代数列{xk},这就是 Newton 法的思想。当 x0 接近 x*时收敛很快,但是 当 x0 选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 x  1 k x k  r ( xf k ' ( f x k ) ) 其中 r 为要求的方程的根的重数,这就是改进的 Newton 法,当求解已知重数的方程的根 时,在同种条件下其收敛速度要比 Newton 法快的多。 程序设计: 本实验采用 Matlab 的 M 文件编写。其中待求解的方程写成 function 的方式,如下 function y=f(x); y=-x*x-sin(x); 写成如上形式即可,下面给出主程序。 二分法源程序: clear .1.
实验报告 yyhhit@163.com %%%给定求解区间 b=1.5; a=0; %%%误差 R=1; k=0;%迭代次数初值 while (R>5e-6) ; c=(a+b)/2; if f12(a)*f12(c)>0; else a=c; b=c; end R=b-a;%求出误差 k=k+1; end x=c%给出解 Newton 法及改进的 Newton 法源程序: clear %%%% 输入函数 f=input('请输入需要求解函数>>','s') %%%求解 f(x)的导数 df=diff(f); %%%改进常数或重根数 miu=2; %%%初始值 x0 x0=input('input initial value x0>>'); k=0;%迭代次数 max=100;%最大迭代次数 R=eval(subs(f,'x0','x'));%求解 f(x0),以确定初值 x0 时否就是解 while (abs(R)>1e-8) x1=x0-miu*eval(subs(f,'x0','x'))/eval(subs(df,'x0','x')); R=x1-x0; x0=x1; k=k+1; if (eval(subs(f,'x0','x'))<1e-10); .2.
实验报告 yyhhit@163.com break end if k>max;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值 ss=input('maybe result is error,choose a new x0,y/n?>>','s'); if strcmp(ss,'y') x0=input('input initial value x0>>'); k=0; else break end end end k;%给出迭代次数 x=x0;%给出解 结果分析和讨论: 1. 用二分法计算方程 sin x 2  x 2 计算结果为  0 在[1,2]内的根。(  610*5  ,下同) x= 1.40441513061523; f(x)= -3.797205105904311e-007; k=18; 由 f(x)知结果满足要求,但迭代次数比较多,方法收敛速度比较慢。 2. 用二分法计算方程 计算结果为 3 x  x 01 在[1,1.5]内的根。 x= 1.32471847534180; f(x)= 2.209494846194815e-006; k=17; 由 f(x)知结果满足要求,但迭代次数还是比较多。 3. 用 Newton 法求解下列方程 x0=0.5; 01 xxe a) 计算结果为 x= 0.56714329040978; f(x)= 2.220446049250313e-016; k=4; 由 f(x)知结果满足要求,而且又迭代次数只有 4 次看出收敛速度很快。 .3.
实验报告 yyhhit@163.com b) 3 x  x 01 x0=1; c) ( x  2 2()1 x  )1  0 x0=0.45, x0=0.65; 当 x0=0.45 时,计算结果为 x= 0.49999999999983; f(x)= -8.362754932994584e-014; k=4; 由 f(x)知结果满足要求,而且又迭代次数只有 4 次看出收敛速度很快,实际上该方程确实 有真解 x=0.5。 当 x0=0.65 时,计算结果为 x= 0.50000000000000; f(x)=0; k=9; 由 f(x)知结果满足要求,实际上该方程确实有真解 x=0.5,但迭代次数增多,实际上当取 x0〉0.68 时,x≈1,就变成了方程的另一个解,这说明 Newton 法收敛与初值很有关系,有 的时候甚至可能不收敛。 4. 用改进的 Newton 法求解,有 2 重根,取 2 2  ( x 2()1 x0=0.55;并与 3.中的 c)比较结果。 当 x0=0.55 时,程序死循环,无法计算,也就是说不收敛。改 )1 x   0 5.1 时,结果收敛为 x=0.50000087704286; f(x)=4.385198907621127e-007; k=16; 显然这个结果不是很好,而且也不是收敛至方程的 2 重根上。 当 x0=0.85 时,结果收敛为 x= 1.00000000000489; f(x)= 2.394337647718737e-023; k=4; 这次达到了预期的结果,这说明初值的选取很重要,直接关系到方法的收敛性,实际上直 接用 Newton 法,在给定同样的条件和精度要求下,可得其迭代次数 k=15,这说明改进后 的 Newton 法法速度确实比较快。 结论: 对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和 给定的区间有关,二且总体上来说速度比较慢。Newton 法,收敛速度要比二分法快,但 是最终其收敛的结果与初值的选取有关,初值不同,收敛的结果也可能不一样,也就是结 果可能不时预期需要得结果。改进的 Newton 法求解重根问题时,如果初值不当,可能会 不收敛,这一点非常重要,当然初值合适,相同情况下其速度要比 Newton 法快得多。 .4.
实验报告 yyhhit@163.com 实验报告二 题目: Gauss 列主元消去法 摘要:求解线性方程组的方法很多,主要分为直接法和间接法。本实验运用直接法的 Guass 消去法,并采用选主元的方法对方程组进行求解。 前言:(目的和意义) 1. 学习 Gauss 消去法的原理。 2. 了解列主元的意义。 3. 确定什么时候系数阵要选主元 数学原理: 则必须进行行交换,才能使消去过程进行下去。有的时候即使 ( k 由于一般线性方程在使用 Gauss 消去法求解时,从求解的过程中可以看到,若 )1 kka =0, 0,但是其绝对值非 常小,由于机器舍入误差的影响,消去过程也会出现不稳定得现象,导致结果不正确。因 此有必要进行列主元技术,以最大可能的消除这种现象。这一技术要寻找行 r,使得 (k kka  )1 | a ( k rk )1 |   max ki  )1  a ( k ik ( k 并将第 r 行和第 k 行的元素进行交换,以使得当前的 )1 kka 的数值比 0 要大的多。这种列主 元的消去法的主要步骤如下: 1. 消元过程 对 k=1,2,…,n-1,进行如下步骤。 1) 选主元,记 | a rk  max | ki  a ik rka 很小,这说明方程的系数矩阵严重病态,给出警告,提示结果可能不对。 | 若 | 2) 交换增广阵 A 的 r,k 两行的元素。 a  rj a kj (j=k,…,n+1) a ij  a ij  aa ik kj / a kk (i=k+1,…,n; j=k+1,……,n+1) 3) 计算消元 2. 回代过程 对 k= n, n-1,…,1,进行如下计算 .5.
实验报告 yyhhit@163.com n  xa kj 1 kj  / a kk ) j x k  ( a   1 , nk 至此,完成了整个方程组的求解。 程序设计: 本实验采用 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; %%%是否进行主元选取 if abs(A(k,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; end .6.
实验报告 yyhhit@163.com 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 结果分析和讨论: 例:求解方程 62    575   123            x y z       22   34   10       。其中为一小数,当   5 10 10,  10 10,  14 10,  20 时, 分别采用列主元和不列主元的 Gauss 消去法求解,并比较结果。 记 Emax 为求出的解代入方程后的最大误差,按要求,计算结果如下: 当  510  时,不选主元和选主元的计算结果如下,其中前一列为不选主元结果,后 一列为选主元结果,下同。 0.99999934768391 2.00000217421972 2.99999760859451 0.99999934782651 2.00000217391163 2.99999760869721 .7.
Emax= 9.301857062382624e-010,0 此时,由于不是很小,机器误差就不是很大,由 Emax 可以看出不选主元的计算结果 实验报告 yyhhit@163.com 精度还可以,因此此时可以考虑不选主元以减少计算量。 当  10 10  时,不选主元和选主元的计算结果如下 1.00001784630877 1.99998009720807 3.00000663424731 0.99999999999348 2.00000000002174 2.99999999997609 Emax= 2.036758973744668e-005,0 此时由 Emax 可以看出不选主元的计算精度就不好了,误差开始增大。 当 时,不选主元和选主元的计算结果如下 14  10  1.42108547152020 1.66666666666666 3.11111111111111 1.00000000000000 2.00000000000000 300000000000000 Emax= 0.70770085900503,0 此时由 Emax 可以看出,不选主元的结果应该可以说是不正确了,这是由机器误差引 起的。 当  20 10  时,不选主元和选主元的计算结果如下 NaN NaN NaN 1 2 3 Emax=NaN, 0 不选主元时,程序报错:Warning: Divide by zero.。这是因为机器计算的最小精度为 就认为是 0,故出现了错误现象。而选主元时则没有这种现象, 10  20  10-15,所以此时的 而且由 Emax 可以看出选主元时的结果应该是精确解。 结论: 采用 Gauss 消去法时,如果在消元时对角线上的元素始终较大(假如大于 10-5),那 么本方法不需要进行列主元计算,计算结果一般就可以达到要求,否则必须进行列主元这 一步,以减少机器误差带来的影响,使方法得出的结果正确。 .8.
分享到:
收藏