计算方法实验报告实验报告一、求方程fxx3-sinx-12x1的全部根, ε1e-6 1、用一般迭代法; 2、用牛顿迭代法; 并比较两种迭代的收敛速度。
一、首先,由题可求得. 其次,分析得到其根所在的区间。
①令,可得到. ②用一阶导数分析得到和两个函数的增减区间;再用二阶导数分析得到两个函数的拐点以及凹凸区间. ③在直角坐标轴上描摹出和的图,在图上可以看到他们的交点,然后估计交点所在的区间,即是所要求的根的区间。
经过估计,得到根所在的区间为,和. 1、一般迭代法(1)算法步骤设为给定的允许精度,迭代法的计算步骤为①选定初值.由确定函数,得等价形式. ②计算.由迭代公式得.③如果,则迭代结束,取为解的近似值;否则,用代替,重复步骤②和步骤③. (2)程序代码①在区间内,代码clc x0-3.5; 初值iter_max100; 迭代的最大次数ep1e-6; 允许精度k0; while kiter_max k从0开始到iter_max循环x1sinx012*x0-1.1/3; 代入,算出的值if absx1-x0ep 与允许精度作比较break; 条件成立,跳出循环end x0x1; 条件不成立,用代替kk1; k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star -3.4101 ;iter 14 ②在区间内,代码clc x00.5; 初值iter_max100; 迭代的最大次数ep1e-6; 允许精度k0; while kiter_max k从0开始到iter_max循环x11/12*x0.3-sinx01; 代入,算出的值if absx1-x0ep 与允许精度作比较break; 条件成立,跳出循环end x0x1; 条件不成立,用代替kk1; k加1 end x_starx1, iterk 为解的近似值,iter 为迭代次数结果x_star 0.07696;iter 6 ③在区间内,代码clc x03.5; 初值iter_max100; 迭代的最大次数ep1e-6; 允许精度k0; while kiter_max k从0开始到iter_max循环x1sinx012*x0-1.1/3; 代入,算出的值if absx1-x0ep 与允许精度作比较break; 条件成立,跳出循环end x0x1; 条件不成立,用代替kk1; k加1 end x_starx1, iterk 为解的近似值,iter 为迭代次数运行结果x_star 3.4101 ;iter 10 2、牛顿迭代法(1)算法步骤①选定初值,计算,. ②按公式迭代,得新的近似值,并计算,. ③对于给定的允许精度,如果,则终止迭代,取;否则,,在转回步骤②计算. (2)程序代码①在区间内,clc x1-3.5; 初值k0; while k100 k从0开始到100循环x0x1; 将初值赋给f0x0.3-sinx0-12*x01; 计算f13*x0.2-cosx0-12; 计算x1x0-f0/f1; 计算得到新的近似值if absx1-x0 1.0e-6 与允许精度作比较break; 条件成立,跳出循环end kk1; 条件不成立,k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star -3.4911;iter 2 ②在区间内,clc x10.5; 初值k0; while k100 k从0开始到100循环x0x1; 将初值赋给f0x0.3-sinx0-12*x01; 计算f13*x0.2-cosx0-12; 计算x1x0-f0/f1; 计算得到新的近似值if absx1-x0 1.0e-6 与允许精度作比较break; 条件成立,跳出循环end kk1; 条件不成立,k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star 0.07696 ;iter 3 ③在区间内,clc x13.5; 初值k0; while k100 k从0开始到100循环x0x1; 将初值赋给f0x0.3-sinx0-12*x01; 计算f13*x0.2-cosx0-12; 计算x1x0-f0/f1; 计算得到新的近似值if absx1-x0 1.0e-6 与允许精度作比较break; 条件成立,跳出循环end kk1; 条件不成立,k加1 end x_starx1, iterk 为解的近似值,iter为迭代次数运行结果x_star 3.4101;iter 3 3、运行结果x_star iter x_star iter x_star iter 一般迭代3.4101 14 0.7696 6 3.4101 10 牛顿法3.4911 2 0.70696 3 3.4101 3 4、结果分析从这题的结果可以看出,牛顿迭代法的迭代速度比一般迭代法的速度要快,牛顿法的迭代次数比较少。
例如,求在的根时,一般迭代法迭代了14次(iter 14),而牛顿法只用了2次(iter 2)。
总而言之,一般迭代法是一种逐次逼近的方法,具有原理简单、编制程序方便等优点,但存在是否收敛和收敛速度的快慢等问题。
牛顿迭代法是一种特殊的迭代法,用于求方程的单根时具有2阶收敛。
因此是一种求非线性方程解的好方法,还可以用于求重根和复根,而且可以推广到求非线性方程组的解.二、解方程组直接法1、已知对矩阵A做LU分解。
2、用追赶法解下述方程组,并给出n10的结果,其中,1、杜利特尔分解法(直接三角分解法)设方程组的系数矩阵的各阶主子式,则可知该方程组存在唯一的杜利特尔分解,其中,. 我们记矩阵的第行第列元素为,则矩阵的第一行和的第一列可由公式(1.1)求出(2.1)再由公式(2.2)求出的第行、的第列元素(2.2)(1)算法步骤由于系数矩阵的各阶主子式,则可知该方程组存在唯一的杜利特尔分解。
①利用公式(2.1)和(2.2)求出和的元素和。
②求解单位下三角形方程组,即按公式(2.3)求出。
④求解上三角形方程组,即按公式(2.4)可求得方程组的解。
(2)程序代码function [L,U]LUA A [n,n]sizeA; 定义为阶矩阵Lzerosn,n; 矩阵初始化Uzerosn,n; 矩阵初始化for i1n Li,i1; 矩阵的对角线元素为 1 end for k1n for jkn Uk,jAk,j-sumLk,1k-1.*U1k-1,j ; 求出元素end for ik1n Li,kAi,k-sumLi,1k-1.*U1k-1,k /Uk,k; 求出的元素end end A[4 2 1 5;8 7 2 10;4 8 3 6;12 6 11 20]; 矩阵[L,U]LUA 2、追赶法设所求方程组为,(2.5)(1)算法步骤①由方程组的第1个方程,将未知元用表示为记,,得。
①以此类推,用表示,用表示。
我们可以得到一般式(其中记)(2.6)(2.7)②将代入方程组(2.5)的第n个方程,并解出得,上式右端恰好是式(2.6)的。
于是,可由式(2.7)求出三对角方程组的解,即,(2.8)(2)程序代码clc a[0 1 1 1 1 1 1 1 1 1]; b[2 2 2 2 2 2 2 2 2 2]; c[1 1 1 1 1 1 1 1 1 0]; r[-7 -5 -5 -5 -5 -5 -5 -5 -5 -5]; u[0 0 0 0 0 0 0 0 0 0]; v[0 0 0 0 0 0 0 0 0 0]; x[0 0 0 0 0 0 0 0 0 0]; u1r1/b1; 计算v1c1/b1; 计算for k210 ukrk-uk-1*ak/bk-vk-1*ak; 计算vkck/bk-vk-1*ak; 计算end x10u10; for k19 xkuk-vk*xk1; 由,解出end x 运行结果x[-3.5000 -1.0000 -3.0000 -1.6000 -2.8333 -1.8571 -2.7500 -2.0000 -0.8182 -2.0909] 3、运行结果(1)杜利特尔分解法(2)追赶法。
4、结果分析(1)杜利特尔分解法在实现分解后,解具有相同系数矩阵的方程组,非常方便,每解一个方程只需用式(2.3)和式(2.4)解两个三角形方程组即可,大大减少了运算工作量。
另外,矩阵和的元素可采用紧凑格式存放在系数矩阵的相应元素位置上,节省了存储单元。
(2)追赶法追赶法仅适用于三对角方程组的求解。
我们由式(2.6)和式(2.8)可以算出,追赶法的乘、除运算次数仅为,加、减运算次数仅为。
故追赶法具有运算量小和存储量小的优势。
三、解方程组迭代法1、用迭代法解Axb,其中b5,5,,5T,给定误差,用Jacobi和SOR两种迭代法计算,并给出n10的结果。
对于阶方程组,假定系数矩阵的对角元时,可得雅可比迭代格式为,(3.1)记为方程组的系数矩阵的对角元组成的对角阵,和分别为由的元素组成的严格下三角阵和上三角阵,则系数矩阵可分解为. 1、Jacobi(雅可比)迭代法(1)算法步骤①根据矩阵,算出矩阵、和,即,,。
②计算雅可比迭代矩阵. ③计算矩阵. ④代入给出的初值,得到雅可比迭代公式(3.1)的矩阵形式. 3.2 由式(3.2)就可以得到向量序列. (2)程序代码clc A[3 -1/2 -1/4 0 0 0 0 0 0 0;-1/2 3 -1/2 -1/4 0 0 0 0 0 0; -1/4 -1/2 3 -1/2 -1/4 0 0 0 0 0;0 -1/4 -1/2 3 -1/2 -1/4 0 0 0 0; 0 0 -1/4 -1/2 3 -1/2 -1/4 0 0 0;0 0 0 -1/4 -1/2 3 -1/2 -1/4 0 0; 0 0 0 0 -1/4 -1/2 3 -1/2 -1/4 0;0 0 0 0 0 -1/4 -1/2 3 -1/2 -1/4; 0 0 0 0 0 0 -1/4 -1/2 3 -1/2;0 0 0 0 0 0 0 -1/4 -1/2 3]; x0[0 0 0 0 0 0 0 0 0 0] ; 初值b[5 5 5 5 5 5 5 5 5 5] ; L [0 0 0 0 0 0 0 0 0 0;1/2 0 0 0 0 0 0 0 0 0; 1/4 1/2 0 0 0 0 0 0 0 0;0 1/4 1/2 0 0 0 0 0 0 0; 0 0 1/4 1/2 0 0 0 00 0;0 0 0 1/4 1/2 0 0 0 0 0; 0 0 0 0 1/4 1/2 0 0 0 0;0 0 0 0 0 1/4 1/2 0 0 0; 0 0 0 0 0 0 1/4 1/2 0 0;0 0 0 0 0 0 0 1/4 1/2 0]; U[ 0 1/2 1/4 0 0 0 0 0 0 0;0 0 1/2 1/4 0 0 0 0 0 0; 0 0 0 1/2 1/4 0 0 0 0 0;0 0 0 0 1/2 1/4 0 0 0 0; 0 0 0 0 0 1/2 1/4 0 0 0;0 0 0 0 0 0 1/2 1/4 0 0; 0 0 0 0 0 0 0 1/2 1/4 0;0 0 0 0 0 0 0 0 1/2 1/4; 0 0 0 0 0 0 0 0 0 1/2;0 0 0 0 0 0 0 0 0 0]; D[3 0 0 0 0 0 0 0 0 0; 0 3 0 0 0 0 0 0 0 0; 0 0 3 0 0 0 0 0 0 0; 0 0 0 3 0 0 0 0 0 0; 0 0 0 0 3 0 0 0 0 0; 0 0 0 0 0 3 0 0 0 0; 0 0 0 0 0 0 3 0 0 0; 0 0 0 0 0 0 0 3 0 0; 0 0 0 0 0 0 0 0 3 0; 0 0 0 0 0 0 0 0 0 3]; BJinvD*LU; 计算雅可比迭代矩阵FJinvD*b; 计算矩阵N1000; ep1e-10; 误差k0; while kiter_max k从0开始到iter_max循环x1BJ*x0fJ; 计算if normx1-x0, inf ep 与误差做比较break; 满足,跳出循环end x0x1; 不满足,将赋给kk1; k加1 end x_starx1, iterk 2、SOR(超松弛)迭代法(1)算法步骤①根据矩阵,算出矩阵、和,即,,。