研究生数值分析(11)---雅可比(Jacobi)迭代法
雅克比迭代算法(JacobiIterativeMethods)--[mpi,c++]
雅克⽐迭代算法(JacobiIterativeMethods)--[mpi,c++]雅克⽐迭代,⼀般⽤来对线性⽅程组,进⾏求解。
形如:a11∗x1+a12∗x2+a13∗x3=b1 a21∗x1+a22∗x2+a23∗x3=b2 a31∗x1+a32∗x2+a33∗x3=b3 我们需要求解出x1 ,x2 ,x3,我们对这组⽅程进⾏变换:x1=1a11(b1−a12∗x2−a13∗x3) x2=1a21(b2−a21∗x1−a23∗x3)x3=1a31(b3−a31∗x1−a32∗x2)我们不妨假设x00=(X01,X02,X03) ,当我们代⼊上述公式的时候,我们就会得到⼀组新的x1=(X11,X12,X13) ,此刻我们称之为⼀次迭代.然后我们将得到的X1,X2,X3再次代⼊公式,我们将会得到第⼆次迭代, 当我们重复这种迭代的时候,我们会得到第K次迭代:x k=(X k1,X k2,X k3) , k=1,2,3...n我们将其归纳成⼀般式⼦:eg: 对于⽅程组:求解:我们先将其变形:然后,我们假设:并将其代⼊得到:我们将得到的X1,x2,x3再次代⼊⽅程中,反复迭代,将会得到如下:最终我们将会得到⼀个收敛值,该组值,就是我们得到的解(会⾮常的逼近真实解)那么这种⽅法,也可以⽤来求解矩阵:对于⽅程: Ax =b ; 我们设定 A矩阵为: ,b矩阵为:, x矩阵为:到这⾥,每个⼈都有⾃⼰的解法,直接的解法是将 x = A−1b,但是A的逆矩阵A−1,计算较为复杂,我们这⾥需要⼀点⼩的tricks ,我们将A矩阵拆分成为⼀个对⾓矩阵D,下三⾓矩阵L,上三⾓矩阵U,即这样的话,公式 Ax = b 就变成了 ( D - L -U )x = b ,然后我们就可以得到:D x = b + (L+U)x ,当我们得到这个公式的时候,求解D的逆矩阵就容易了很多,我们得到D的逆矩阵为:然后,我们将D移到右边变成:这个公式,和我们上⾯描述的雅克⽐迭代是不是长得很像,然后我们可以将其⼀般化为:我们知道A是⼀个已知的常量矩阵,因⽽D,L,U都是已知矩阵,那么我们可以简化为:T=D−1∗(L+U) , c=D−1∗b ;根据这⼀个思想,我们可以得到⼀个伪代码:实现代码为:参考资料为:Processing math: 100%。
雅可比迭代公式
雅可比迭代公式雅可比迭代公式是一种在数值分析中用于求解线性方程组的迭代方法。
咱先来说说这个雅可比迭代公式到底是啥。
比如说,咱有一个线性方程组,像这样:\[\begin{cases}3x - y + z = 7 \\x + 2y - z = 1 \\x - y + 3z = 3\end{cases}\]雅可比迭代公式就是通过一次次的计算来逐渐逼近这个方程组的解。
咱们把这个方程组改写成下面这样:\[\begin{cases}x = \frac{1}{3}(7 + y - z) \\y = \frac{1}{2}(1 - x + z) \\z = \frac{1}{3}(3 - x + y)\end{cases}\]然后,咱就可以开始迭代啦。
先随便给 x、y、z 赋个初值,比如说都设成 0 。
第一次迭代,把初值代入上面的式子算新的值。
就这么一次次算下去,慢慢地,x、y、z 的值就会越来越接近真正的解。
我记得之前给学生们讲这个雅可比迭代公式的时候,有个学生特别有意思。
那是个挺机灵的小男孩,叫小明。
刚开始讲的时候,他一脸迷茫,完全没听懂。
我就给他举了个买糖果的例子。
假设小明有一笔零花钱,准备去买三种糖果,巧克力、水果糖和牛奶糖。
巧克力糖3 块钱一颗,水果糖2 块钱一颗,牛奶糖3 块钱一颗。
小明一共只有 11 块钱,而且他有个想法,就是买的巧克力糖的数量是水果糖和牛奶糖数量总和的三分之一,水果糖的数量是巧克力糖和牛奶糖数量总和的二分之一,牛奶糖的数量是巧克力糖和水果糖数量总和的三分之一。
这时候,咱们不知道每种糖到底买多少颗,那就先随便猜个数。
比如说,先猜巧克力糖买 0 颗,水果糖买 0 颗,牛奶糖也买 0 颗。
然后按照前面说的关系来调整。
第一次调整,算出来巧克力糖应该买 11/3 颗,水果糖应该买 11/4 颗,牛奶糖应该买 11/9 颗。
当然啦,糖可不能买零点几颗,这只是个计算过程。
就这么一次次调整,最后就能算出比较接近真实情况的答案啦。
雅可比迭代法和高斯塞德尔迭代法对比
雅可比迭代法和高斯塞德尔迭代法对比引言雅可比迭代法和高斯塞德尔迭代法是数值分析中常用的迭代求解线性方程组的方法。
它们都是通过迭代更新变量的值,逐渐逼近方程组的真实解。
本文将详细讨论这两种迭代法的原理、特点和适用情况,并给出一些比较和应用实例。
雅可比迭代法(Jacobi Iteration)雅可比迭代法是一种逐个更新变量的值的迭代方法。
对于线性方程组Ax = b,雅可比迭代法的更新公式如下:x i(k+1)=1a ii(b i−∑a ijnj=1j≠ix j(k))其中,aii表示系数矩阵A的第i行第i列的元素,而bi表示方程组的第i个方程的右侧常数。
特点1.雅可比迭代法的计算过程简单,容易理解和实现。
2.每次迭代只更新一个变量的值,相邻两次迭代之间没有数据依赖关系,可以并行计算。
3.雅可比迭代法收敛的条件是系数矩阵A满足严格对角占优条件或对称正定条件。
优缺点•优点:简单易懂,在一些特定情况下收敛速度较快。
•缺点:收敛速度相对较慢,尤其是在系数矩阵A的条件数较大时;不适用于对角占优条件较弱的问题。
高斯塞德尔迭代法(Gauss-Seidel Iteration)高斯塞德尔迭代法是一种逐个更新变量的值,并立即使用最新的值进行下一个变量的更新的迭代方法。
对于线性方程组Ax = b,高斯塞德尔迭代法的更新公式如下:x i(k+1)=1a ii(b i−∑a iji−1j=1x j(k+1)−∑a ijnj=i+1x j(k))特点1.高斯塞德尔迭代法相较于雅可比迭代法,每次迭代可以使用当前迭代步骤中已更新的变量值,因此收敛速度更快。
2.如果系数矩阵A是严格对角占优或对称正定的,高斯塞德尔迭代法一定收敛。
优缺点•优点:相较于雅可比迭代法,收敛速度更快,对于条件数较大的问题也有较好的效果。
•缺点:实现稍微复杂一些,每次迭代的计算依赖于之前已更新的变量值,无法并行计算。
雅可比迭代法和高斯塞德尔迭代法的比较收敛速度在一些特定的问题中,雅可比迭代法可以比高斯塞德尔迭代法更快地收敛。
数值分析迭代法数值分析实验报告jacobi迭代和seidel迭代分析
数值分析迭代法数值分析实验报告 jacobi迭代和seidel迭代分析导读:就爱阅读网友为您分享以下“数值分析实验报告jacobi迭代和seidel迭代分析”资讯,希望对您有所帮助,感谢您对的支持!数值分析实验报告一、实验目的1、了解熟悉jacobi迭代法和seidel迭代法的解法2、将原理与matlab语言结合起来,编程解决问题3、分析实验结果二、实验题目设线性方程组为2 2 31 201 31 x1 1 7 x801240 2 x 103 10 15 x 1 4考察用jacobi迭代法和seidel迭代法求解该线性方程组的收敛情况。
如果收敛,给出误差满足x(k) x(k 1)10 4的解。
三、实验原理将A 作如下分解A D L U这里a11D a22 0 a ,L 21 anna n100 a n2 0 0 a12 a1n 0 0 0 a2n ,0 00 0 JacobiU迭代矩阵为BJ D 1(L U)Seidel迭代矩阵为BS (D L) 1U它们的迭代格式都可化为x(k 1) Bx(k) g则迭代格式对任何初值都瘦脸的充要条件是迭代矩阵谱半径 (B) max k 1,其中, k是矩阵B的n个特征值,k 1,2 ,n 1 k nJacobi迭代矩阵的特征方程为det( I B J) 0Seidel迭代矩阵的特征方程为det( I B S) det( (D L) U) 0四、实验内容用matlab编写计算jacobi迭代矩程序,建立m文件如下:function[M]=BJ(A)D=diag(diag(A));L=tril(-A)+D;U=triu(-A)+D;M=inv(D)*(L+U);输入:>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];>> [M]=BJ(A)M:M =0 -0.0500 0.1500 0.0500-0.1667 0 0 -0.38890.0250 -0.0500 0 0.0500-0.2000 0 0.2000 00 0.050.150.05 0.166700 0.3889 则jacobi迭代矩阵为:BJ 0.025 0.0500.05 0.2 00.20用matlab求jacobi迭代矩阵的特征根的算法如下:>> A=[0 -0.05 0.15 -0.05;-0.67 0 0 -0.39;0.025 -0.05 0 0.05;-0.2 0 0.2 0];[V,D]=eig(A)V =-0.1892 + 0.0450i -0.1892 - 0.0450i -0.3812 -0.5005-0.9467 -0.9467 0.8867 0.5461 -0.1528 - 0.1181i -0.1528 + 0.1181i -0.2099 -0.0466 -0.1056 + 0.1325i -0.1056 - 0.1325i 0.1561 0.6701D =-0.1774 + 0.0864i 0 0 0 0 -0.1774 - 0.0864i 0 0 0 0 0.2194 0 0 0 0 0.1355 则最大特征根为:0.2194 则(BJ) 0.2194 1,所以jacobi迭代法收敛用matlab编程jacobi迭代法求根的算法:function [n,x]=jacobi(A,b,X,nm,w)%用雅克比迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w 为误差精度%输出:x为求得的方程组的解构成的列向量,n为迭代次数n=1;m=length(A);D=diag(diag(A)); %令A=D-L-U,计算矩阵DL=tril(-A)+D; %令A=D-L-U,计算矩阵LU=triu(-A)+D; %令A=D-L-U,计算矩阵UM=inv(D)*(L+U); %计算迭代矩阵g=inv(D)*b; %计算迭代格式中的常数项%下面是迭代过程while n<=nmx=M*X+g; %用迭代格式进行迭代if norm(x-X,2)<wdisp(…迭代次数为‟);ndisp(…方程组的解为‟);xreturn;%上面:达到精度要求就结束程序,输出迭代次数和方程组的解endX=x;n=n+1;end%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)disp(…在最大迭代次数内不收敛!‟);输入数据:>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];b=[1;2;10;-1];X=[0;0;0;0];>> nm=100;>> w=1e-4;>> [n,x]=jacobi1(A,b,X,nm,w)迭代次数为n =6方程组的解为x =0.06870.16450.2352-0.1667n =6x =0.06870.16450.2352-0.1667所以,满足精度的根为x = 0.0687 0.1645 0.2352用matlab编程计算seidel迭代矩阵算法为:function[M]=BS(A)D=diag(diag(A));L=tril(-A)+D;U=triu(-A)+D;M=inv(D-L)*U;输入:>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5]; >> [M]=BS(A)M =0 -0.0500 0.1500 0.0500 0 0.0083 -0.0250 -0.3972 -0.1667 迭代次数为6次0 -0.0017 0.0050 0.07110 0.0097 -0.0290 0.0042则seidel迭代矩阵为:0.150.05 0 0.05 00.0083 0.025 0.3972BS 0 0.00170.0050.0711 00.0097 0.0290.0042用matlab编程求得seidel矩阵的算法为:>> A=[0 -0.05 0.15 0.05;0 0.0083 -0.025 -0.3972;0 -0.0017 0.005 0.0711;0 0.0097 -0.029 0.0042];[V,D]=eig(A)V =1.0000 -0.1596 + 0.6750i -0.1596 - 0.6750i -0.91040 0.6965 0.6965 0.3924 0 -0.1250 + 0.0028i -0.1250 - 0.0028i 0.1313 0 0.0070 - 0.1348i 0.0070 + 0.1348i 0.0000D =0 0 0 0 0 0.0088 + 0.0768i 0 0 0 0 0.0088 - 0.0768i 0 0 0 0 -0.0001则特征根为 0 0.008+0.0768i 0.0088-0.0768i-0.0001则 (BS) 0.08 1,所以seidel迭代法收敛用seidel迭代法求根的算法为:function [n,x]=gaussseidel(A,b,X,nm,w)%用高斯-赛德尔迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w 为误差精度%输出:x为求得的方程组的解构成的列向量,n为迭代次数n=1;m=length(A);I=eye(m); %生成m*m阶的单位矩阵D=diag(diag(A)); %令A=D-L-U,计算矩阵DL=tril(-A)+D; %令A=D-L-U,计算矩阵LU=triu(-A)+D; %令A=D-L-U,计算矩阵U M=inv(D-L)*U; %计算迭代矩阵g=inv(I-inv(D)*L)*(inv(D)*b); %计算迭代格式中的常数项%下面是迭代过程while n<=nmx=M*X+g; %用迭代格式进行迭代if norm(x-X,2)<wdisp(…迭代次数为‟);ndisp(…方程组的解为‟);xreturn;%上面:达到精度要求就结束程序,输出迭代次数和方程组的解endX=x;n=n+1;end%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)disp(…在最大迭代次数内不收敛!‟);disp(…最大迭代次数后的结果为‟);x输入数据:>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];b=[1;2;10;-1];X=[0;0;0;0];nm=100;w=1e-4;[n,x]=gaussseidel(A,b,X,nm,w) 迭代次数为n =5方程组的解为x =0.06870.16450.2352-0.1667n =5x =0.06870.16450.2352-0.166满足精度的根为x =0.0687 0.1645 0.2352 -0.1667 迭代次数为5次五、实验分析从实验过程可以看到求出满足精度的根,seidel迭代要比jacobi迭代快,这是因为在jacobi迭代计算中,计算向量x(k 1)时是按分量的角标由小到大依次计算的。
雅可比迭代法原理
雅可比迭代法原理雅可比迭代法(Jacobi Iteration Method)是一种用于线性方程组迭代求解的方法。
它广泛应用于数值计算和科学工程领域,特别在计算机模拟和科学计算中得到了广泛应用。
雅可比迭代法通过将线性方程组表达为矩阵形式,并不断迭代更新估计解向量,最终求得线性方程组的精确解或者近似解。
设有一个n阶方程组表达为Ax=b,其中A是一个n×n的系数矩阵,x是一个n维向量,b是一个n维向量。
雅可比迭代法的思想是通过迭代过程逐步逼近方程组的解。
首先,我们将方程组转化为x的显式表达式。
假设矩阵A对角线上的元素都不为0(这是雅可比迭代法的一个限制条件),方程组的第i个方程可以表达为:xi = (bi - Σaijxj) / aii其中,a_ij表示A的第i行第j列的元素。
然后,我们假定一个初始解向量x^(0)。
迭代过程则是通过反复使用上述方程表达式,不断更新解向量x,直到收敛到一个满足精度要求的近似解。
雅可比迭代法的公式表达为:x^(k+1)_i = (bi - Σa_ijx^k_j) / a_ii其中,k表示迭代过程的次数,k+1表示迭代的下一步。
雅可比迭代法的收敛原理是基于对角元素主支配性的分析。
如果A的对角元素主支配于其它元素,即对于每个i,都有,a_ii,> Σ,a_ij,(i ≠j),那么雅可比迭代法是收敛的。
在实际应用中,我们通常会通过编写程序或者使用现有的数值计算软件来求解方程组,并进行相应的误差分析。
雅可比迭代法的优点之一是简单易实现,容易理解。
它不需要对矩阵进行变换,只需要进行一系列的矩阵乘法和向量加法操作,因此它的计算量相对较小。
此外,雅可比迭代法还能有效解决病态问题,即系数矩阵A 的条件数很大的情况。
然而,雅可比迭代法也有一些缺点。
首先,它的收敛速度相对较慢,特别是对于条件数很大的矩阵。
其次,迭代过程必须保证A的对角元素都不为0,否则无法进行迭代。
并且,迭代的停止条件需要合适地选择,不然可能陷入无限循环。
利用雅可比(Jocabi)迭代法解线性方程组
}
}
}
{
Console.WriteLine("请输入系数矩阵的维数:");
n=int.Parse(Console.ReadLine());
Value=newDouble[2,n];
Parameters=newdouble[n,n];
MatrixB=newdouble[n];
for(inti=0;i<n;i++)
利用雅可比(Jocabi)迭代法解线性方程组
///<summary>
///利用雅可比(Jocabi)迭代法解线性方程组
///<summary>
usingSystem;
namespaceInteretive
{
///<summary>
///Jacobi的摘要说明。
///</summary>
classJacobi
privateboolIsConvergence()
{
for(inti=0;i<n;i++)
{
for(intj=0;j<n;j++)
{
if(Parameters[i,i]<=Parameters[i,j])
{
returnfalse;
}
}
}
returntrue;
}
///<summary>
///输入初值
///计算Jacobi迭代结果
///</summary>
///<returns></returns>
privatevoidcalculate()
研究生数值分析练习题答案
------------------------------------------------ 装 ---------------------------------订 ---------------------------------线 ------------------------------------------------装 订 线 左 侧 不 要 书 写 内 容允许使用计算器一、 填空题 (本大题共10小题,每小题 2分,共 20分)1. 若2.71828x e == ,取近似值* 2.7180x =,则*x 具有 4 位有效数字。
2.为了提高数值计算精度,应将8格式进行计算。
3.已知n=3时牛顿—柯特斯系数(3)(3)(3)012133,,888C C C ===,那么(3)3C =18 。
4.设3()1f x x x =+-,则函数的四阶差商[0,1,2,3,4]f = 0 。
5. 用牛顿迭代法解方程0x x e --=在0.5x =附近的近似实根的牛顿迭代格式为)1,0(e 1e )()(1=+--='-=--+n x x x f x f x x nnx x n n n n n n6. 对给定的剖分01:n a x x x b ∆=<<<= ,当()s x 满足条件 ()s x 在[a,b]有2阶连续导数且在每个子区间上是个3次多项式 时是三次样条函数。
7.用最小二乘法拟合三点()()()0,1,1,3,2,2A B C 的直线是1322y x =+。
8.向量序列()211cos ,sin ,3Tk k x e k k k k -⎛⎫=+ ⎪⎝⎭ 的极限向量为()0,1,3T9.求积公式 10311()()(1)434f x dx f f ≈+⎰的代数精度为 2 。
10.若绝对误差限为31102-⨯,那么近似数0.03600有 2 位有效数字二、单项选择题(本大题共5小题,每小题 2 分,共 10分)1. 已知实验数据555521111(,)(1,2,3,4,5),15,31,55,105.5,k k k k kk k k k k k x y k x y x x y =========∑∑∑∑其中则用最小二乘法求近似公式01y a a x =+的法方程为( C )A 0101153155105.5a a a a +=⎧⎨+=⎩B 0101515551531105.5a a a a +=⎧⎨+=⎩C 0101515311555105.5a a a a +=⎧⎨+=⎩ D0101531153155105.5a a a a +=⎧⎨+=⎩ 2. 以下矩阵是严格对角占优矩阵的是( B )A 3210141011410012⎛⎫ ⎪ ⎪ ⎪⎪⎝⎭ B 2100131013610113-⎛⎫⎪--⎪ ⎪-- ⎪-⎝⎭C 5210113121410012-⎛⎫⎪--⎪ ⎪⎪⎝⎭D 4211141021411315⎛⎫⎪ ⎪⎪- ⎪⎝⎭3.已知两种递推公式11(1)35(1,2,,20)31(2)(20,,1)55n n n n I nI n I I n n n--=-==-= 则在数值计算过程中( C )。
雅克比迭代法python
雅克比迭代法python
-Jacobi迭代法是一种数值计算技术,用于求解非线性系统的迭代方法。
它将
非线性系统拆解为若干个独立的一维或二维子系统,利用迭代过程不断迭代地改进参数,最终收敛到满足约束条件的最优解。
Jacobi迭代法有利于在非线性系统中有效求解问题,它具有以下特点:
1、计算简单:Jacobi迭代法只需要计算每次迭代的细节,不需要求解任何解析表
达式,这种迭代方法可以有效地减少计算量和计算时间;
2、易编译:Jacobi迭代法只需要将等式离散化,然后对每组等式进行迭代,在程
序上比较容易编译;
3、稳定性好:Jacobi迭代法能够很快地收敛到最优解。
因此,Jacobi迭代法在不断优化的求解参数的过程中,以及优化非线性系统
的运算效率上,都具有较高的效率和准确度。
它的优势在于计算简单性和高效的稳定性,可以有效地提升计算效率,作为从大规模非线性系统中求解问题的一种技术,它在机器学习、信号处理、图像处理、线性系统控制、建模和函数优化等诸多领域都得到了广泛应用,受到学术界和实际应用界的高度重视。
雅可比算法
雅可比算法雅可比算法又称为Jacobimethod,是解线性方程组的一种迭代算法。
由于该方法计算比较简单,且每次迭代都会使解越来越接近真解,因此给计算机求解线性方程组提供了便利。
雅可比算法的基本思想是将线性方程组的每个未知量的值按照一定的顺序依次更新,而每次更新的值都只与上一次更新的值有关系,不受其他未知量的影响。
设Ax=b是一个n 元线性方程组,其中A是一个n×n的矩阵,x和b是n维列向量。
将A分解为D-L-U三个矩阵,其中D是A的对角线矩阵,L和U分别为A的严格下三角矩阵和严格上三角矩阵。
则该方程组的解可以表示为:x^(k+1)=D^(-1)(b-(L+U)x^(k)) (1)其中x^(k+1)表示第k+1次迭代后的解,x^(k)表示第k次迭代后的解。
将式(1)中的x^(k)代入式(1)中,得到:将式(2)中的x^(k)代入式(1)中,得到:式(3)即为雅可比算法的迭代公式。
将迭代公式表示为矩阵形式,得到:设T=D^(-1)(L+U),则式(4)可以表示为:因此,雅可比算法的迭代矩阵为T,初值为x^(0),迭代次数达到精度要求时得到的x^(k+1)就是方程组的解。
雅可比算法的收敛性与A的对角线元素有关。
如果A是严格对角占优的,即对于所有的i,有:|a_(ii)|>Σ|a_ij| (6)其中j≠i,Σ表示求和。
则雅可比算法收敛。
当A不是严格对角占优时,雅可比算法仍然可能收敛,但必须经过特殊处理。
雅可比算法的迭代次数和计算时间都与A的条件数相关,随着A的条件数增大,迭代次数和计算时间都会增加。
因此,在实际应用中,雅可比算法仅适用于条件数较小的线性方程组。
数值分析实验-雅可比迭代和高斯塞德尔迭代
1.雅可比迭代源代码A=[6,-2,-1,-1;-2,18,-1,-1;-1,-1,6,-2;-1,-1,-1,12];b=[-16;6;9;43];x0=[0;0;0;0];it_max=500;eps=1e-6;[x,k]=jacobi(A,b,x0,eps,it_max)function [x,n]=jacobi(A,b,x0,eps,it_max)% 求线性方程组的Jacobi迭代法,调用格式为% [x, k] = jacobi(A,b,x0,eps,it_max)% 其中, A 为线性方程组的系数矩阵,b 为常数项,eps 为精度要求,默认为1e-6, % it_max 为最大迭代次数,默认为200% x 为线性方程组的解,k迭代次数if nargin ==3eps = 1.0e-6;M = 200;elseif nargin<3disp('输入参数数目不足3个');returnelseif nargin ==5M = it_max;endD = diag(diag(A));%求A的对角矩阵L = -tril(A,-1);%求A的下三角矩阵U = -triu(A,1);%求A的上三角矩阵B = D\(L+U);f = D\b;x = B*x0+f;n = 1;%迭代次数while norm(x-x0)>=epsx0 = x;x = B*x0+fn = n+1;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!')return;endEnd2.高斯赛德尔迭代源代码A=[6,-2,-1,-1;-2,18,-1,-1;-1,-1,6,-2;-1,-1,-1,12];b=[-16;6;9;43];x0=[0;0;0;0];it_max=500;eps=1e-6;[x,k]=jacobi(A,b,x0,eps,it_max)function [x,n] = guaseidel(A,b,x0,eps,it_max)% 求线性方程组的Gauss-Seidel迭代法,调用格式为% [x, k] = guaseidel(A,b,x0,eps,it_max)% 其中, A 为线性方程组的系数矩阵,b 为常数项,eps 为精度要求,默认为1e-5, % it_max 为最大迭代次数,默认为100% x 为线性方程组的解,k迭代次数if nargin == 3eps = 1.0e-6it_max= 200elseif nargin == 4it_amx = 200elseif nargin <3disp('输入参数个数不足3个');return;endD = diag(diag(A));%求A的对角矩阵L = -tril(A,-1);%求A的下三角矩阵,不带对角线U = -triu(A,1);%求A的上三角矩阵G = (D-L)\U;f = (D-L)\b;x = G*x0+f;n=1; %迭代次数while norm(x-x0)>=epsx0 = x;x = G*x0+f;n = n+1;if(n>=it_max)disp('Warning:迭代次数太多,可能不收敛');return;endEnd3.方程组A=[6,-2,-1,-1;-2,18,-1,-1;-1,-1,6,-2;-1,-1,-1,12]; b=[-16;6;9;43];即4.MATLAB运行结果截图jacobi运行结果guaseidel运行结果jacobi迭代和guaseidel迭代从以上的运行结果比较来看,guaseidel的收敛性和收敛速度更快。
雅克比迭代法
雅克比迭代法马来西亚雅克比迭代法(Marey Jacobs Iterative Method)是一种功能最优化的数值分析方法,又称无约束最优化算法,其目的是找到函数最优值,这是一种全局最优解法,可以有效求解多变量非线性方程和非凸优化问题。
1. 雅克比迭代法的概念雅克比迭代法是数值分析方法的一种,他可以搜索多变量非线性函数的最优值。
该方法的核心思想是:在每次迭代中,通过计算函数的梯度(或偏导数)来找到新的最优值,以及搜索方向。
它基于雅克比矩阵求解多元非线性方程组,需要迭代计算,来自动找到变量最优值点,比如从一个初始点开始,沿着局部函数增加最快的方向,一直搜索到某一程度,就可以得到全局最优结果。
2. 雅克比迭代法的特点①雅克比迭代法可以基于非凸优化,这就使得在多元变量函数中找到最优解更加容易。
②它的收敛速度极快,一般只需一定的迭代周期就可以解出比较精确的解。
③雅克比迭代法具有很大的数值稳定性,它可以适应多元函数的各种变化而取得精确的结果。
3. 雅克比迭代法的应用(1)雅克比迭代法可以用于非线性最优化,用于非线性方程组和非凸优化问题。
(2)它可以用于解决多元、非线性优化问题,特别是在功能最优化技术中经常应用。
(3)它广泛应用于多目标最优化,在这种问题中,可以使用雅可比迭代法来求解最优值。
(4)它可以有效地解决期望、约束类优化问题,其中,约束可以通过增加惩罚函数的系数来改变。
4. 雅克比迭代法的缺点(1)雅可比迭代法的最佳初值特征和求解准确度有较大的依赖,这意味着对于不同的情况,要使用不同的参数,这就耗费了较多的时间;(2)雅可比迭代法因为受函数从原点出发的假定条件,所以只能较不理想的收敛到局部最优解,而不能较好的收敛到全局最优解;(3)雅可比迭代法实现起来较为复杂,对于复杂的非凸优化问题,往往可能导致求解的困难;(4)雅可比迭代法有一定的假定条件,一旦这些假定发生变化,那么最终计算出的结果就可能发生改变。
雅可比迭代法
雅可比迭代法一、引言雅可比迭代法,也称为雅可比算法(Jacobi method),在科学计算领域中应用很广泛,本文重点讲述该算法在迭代进化计算中的应用。
20世纪40年代初,由美国数学家Jacobi和瑞士数学家可夫等人创造。
雅可比迭代法主要步骤如下: 1、初始化; 2、选择一种迭代策略; 3、按照迭代策略执行相应的操作,直至收敛; 4、调整参数使迭代过程收敛,得到最终的收敛速度。
下面将详细介绍这个方法的原理及过程。
1、初始化“雅可比”是一个美国人,因此他不会使用编程来实现自己的想法,但是他对于迭代法非常了解,曾经使用编程来解决两个公开的问题,一个是阿基米德与公元前250年的欧几里德的问题,另一个是荷兰金属铸件需要多少时间来铸成一个合金块。
他研究过可以提高计算效率的任何技术。
20世纪30年代初, Jacobi发现一些只能运行到第n次的迭代法并没有提供尽可能快的收敛速度。
因此,他决定编写一个运行到第n+1次的迭代法,通过检查某种程序的输入输出情况,就可以预测当前执行到哪一步。
2、选择一种迭代策略在给定初始条件,一共有m次迭代,该迭代法一定满足下列条件之一:直到十年后的1973年, Jacobi在美国数学学会会议上才正式提出了雅可比算法(Jacobi algorithm),而且仅仅限于这个算法本身,并没有对它加以推广,由此可见, Jacobi选择这样一种渐进的发展策略,也许是出于性格上的稳健吧。
3、按照迭代策略执行相应的操作如果你想设计一种运行到第n+1次的迭代法,那么你要选择使计算复杂度为O(n^n)。
的策略(L(n))。
注意(1)此处的复杂度是以数字的形式来表示的;(2)它是针对每一次迭代的计算复杂度。
然后再选择一个初值使函数值在第m次迭代时满足O(n^m)。
3、调整参数使迭代过程收敛,得到最终的收敛速度雅可比迭代法一般情况下,迭代算法的目标函数不收敛,就需要对参数进行调整,而使算法收敛,如果把迭代速度函数和梯度算法进行比较,就可以知道梯度算法存在算法收敛性问题,而雅可比迭代法是满足这一要求的。
数值分析-雅克比迭代法
数值分析-雅克⽐迭代法雅克⽐迭代法雅克⽐迭代法就是众多迭代法中⽐较早且较简单的⼀种,其命名也是为纪念普鲁⼠著名数学家雅可⽐。
雅克⽐迭代法的计算公式简单,每迭代⼀次只需计算⼀次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,⽐较容易并⾏计算。
迭代过程⾸先将⽅程组中的系数矩阵A分解成三部分,即:A = L+D+U,如图1所⽰,其中D为对⾓阵,L为下三⾓矩阵,U为上三⾓矩阵。
之后确定迭代格式,X^(k+1) = B*X^(k) +f ,(这⾥^表⽰的是上标,括号内数字即迭代次数),如图1所⽰,其中B称为迭代矩阵,雅克⽐迭代法中⼀般记为J。
(k = 0,1,…)再选取初始迭代向量X^(0),开始逐次迭代。
收敛性设Ax= b,其中A=D+L+U为⾮奇异矩阵,且对⾓阵D也⾮奇异,则当迭代矩阵J的谱半径ρ(J)<1时,雅克⽐迭代法收敛优缺点雅克⽐迭代法的优点明显,计算公式简单,每迭代⼀次只需计算⼀次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,⽐较容易并⾏计算。
然⽽这种迭代⽅式收敛速度较慢,⽽且占据的存储空间较⼤例题程序算法#include<math.h>#include<stdio.h>#include <stdlib.h>int main(){float e =0.001, z, m, y[3]; float b[3]={-12, 20, 3};float x[3]={0);float a[3][3]={{5, 2, 1},{-1, 4, 2},{2, -3, 10}};int n =3, j, i, k =1;while(1){for(i=0;i<3;i++){for(j=0;j<3;j++)m=m+a[i][j]*x[j];m = m - x[i] * a[i][i]; y[i]=(b[i] - m) / a[i][i]; m =0;}i =0;while(i <3){z = fabs(x[i] - y[i]);if(z > e)break;i++;}if(i !=3){for(i =0; i <3; i++)x[i]= y[i];k++;}else if(i ==3)break;}printf("%f\n%f\n%f\n", y[0], y[1], y[2]);return0;}1求解⽅程:8 * x1 - 3 * x2 + 2 * x3 =204 * x1 - 11 * x2 - x3 =336 * x1 + 3 * x2 + 12 * x3 =36精确解:x1 =0.411817, x2 = -3.176429, x3 =3.588173 --->迭代公式:x1^(k+1)=(3 * x2^(k) - 2 * x3^(k) + 20) / 8;x2^(k+1)=(-4 * x1^(k) + 1 * x3^(k) + 33) / (-11); x2^(k+1)=(-6 * x1^(k) - 3 * x2^(k) + 36) / 12; */#include <stdio.h>#include <stdlib.h>struct X {float x1;float x2;float x3;};X jcobi(X&v){X r;r.x1 =(3 * v.x2 - 2 * v.x3 + 20) / 8;r.x2 =(-4 * v.x1 + v.x3 + 33) / (-11);r.x3 =(-6 * v.x1 - 3 * v.x2 + 36) / 12;return r;}void main(){X v={0,0,0};int iteration =20;while(iteration-- >0){v= jcobi(v);v= jcobi(v);}printf("%f\n%f\n%f\n", v.x1, v.x2, v.x3); }。
雅可比(Jacobi)迭代法
0 a21 A a31 an1
0 a32
an2
0
ann1
a11 0
a22
0
ann
a12 0
a13 a23 0
a1n
a2n
an1n
0
记作 A = L + D + U
则 Ax b 等价于 (L D U )x b
数值计算方法
雅可比(Jacobi)迭代法
1.1雅可比迭代法算法构造
例4.2 用雅可比迭代法求解方程组
8x1 3x2 2x3 20 4x1 11x2 x3 33 6x1 3x2 12x3 36
解建:立从迭方代程公组式的三个方程中分离出 x1, x2 和 x3
x1x( k 11) xxxx32(( kk 3211))
B (I D 1 A) f D 1b
x (k 1) Bx (k ) f (k = 0,1,2…)
称为雅可比迭代公式, B称为雅可比迭代矩阵
其中
0
B
(I
D 1 A)
a21 a22
an1
ann
a12 a11
0
an2
ann
a1n a11
a2n
a22
0
在例4.2中,由迭代公式写出雅可比迭代矩阵为
i 1,2,, n
若上xia(式xkiii1称)0为ja(1解a1i1iiii方((1bb,程2ii , 组jj的,njnn1i )1Ja,aaijc分xijo(xjbk离i)j)迭)出代变i公i量式1,。21x,,2i , n , n ji
1.2 雅可比迭代法的矩阵表示
设方程组 Ax b 的系数矩阵A非奇异,且主对
雅克比高斯赛德尔迭代法
第八节 雅可比迭代法与高斯—塞德尔迭代法一 雅可比迭代法设线性方程组b Ax = (1) 的系数矩阵A 可逆且主对角元素nn a ,...,a ,a 2211均不为零,令()nna ,...,a ,a diag D 2211=并将A 分解成()D D A A +-= (2)从而(1)可写成 ()b x A D Dx +-=令11f x B x +=其中b D f ,A D I B 1111--=-=. (3) 以1B 为迭代矩阵的迭代法(公式)()()111f x B x k k +=+ (4)称为雅可比(Jacobi)迭代法(公式),用向量的分量来表示,(4)为⎩⎨⎧[],...,,k ,n ,...,i x a ba xnij j )k (j j i iii)k (i21021111==∑-=≠=+ (5)其中()()()()()Tn x ,...x ,x x 002010=为初始向量.由此看出,雅可比迭代法公式简单,每迭代一次只需计算一次矩阵和向量的乘法.在电算时需要两组存储单元,以存放()k x 及()1+k x . 例1 例1 用雅可比迭代法求解下列方程组⎪⎩⎪⎨⎧=+--=-+-=--2453821027210321321321.x x x .x x x .x x x解 将方程组按雅可比方法写成⎪⎪⎩⎪⎪⎨⎧++=++=++=8402020830201072020*******2321.x .x .x .x .x .x .x .x .x取初始值()()()()()()T T ,,,x ,x ,x x 0000302010==按迭代公式()()()()()()()()()⎪⎪⎩⎪⎪⎨⎧++=++=++=+++840202083020107202010211331123211.x .x .x .x .x .x .x .x .x k k k k k k k k k进行迭代,其计算结果如表1所示表1二 高斯—塞德尔迭代法由雅可比迭代公式可知,在迭代的每一步计算过程中是用()k x的全部分量来计算()1+k x的所有分量,显然在计算第i 个分量()1+k i x 时,已经计算出的最新分量()()1111+-+k i k x ,...,x 没有被利用,从直观上看,最新计算出的分量可能比旧的分量要好些.因此,对这些最新计算出来的第1+k 次近似()1+k x的分量()1+k jx 加以利用,就得到所谓解方程组的高斯—塞德(Gauss-Seidel )迭代法.把矩阵A 分解成U L D A --= (6)其中()nn a ,...,a ,a diag D 2211=,U ,L --分别为A 的主对角元除外的下三角和上三角部分,于是,方程组(1)便可以写成 ()b Ux x L D +=-即 22f x B x +=其中()()b L D f ,U L D B 1212---=-= (7)以2B 为迭代矩阵构成的迭代法(公式)()()221f x B x k k +=+ (8)称为高斯—塞德尔迭代法(公式),用 量表示的形式为⎩⎨⎧[],...,,k ,n ,,i x a x a b a xi j n i j )k (j ij )k (j ij i ii)k (i21021111111==∑∑--=-=+=++ (9)由此看出,高斯—塞德尔迭代法的一个明显的优点是,在电算时,只需一组存储单元(计算出()1+k ix 后()k ix 不再使用,所以用()1+k i x 冲掉()k ix ,以便存放近似解.例2 例2 用高斯——塞德尔迭代法求解例1.解 取初始值()()()()()()TT,,,x ,x ,x x 0000302010==,按迭代公式()()()()()()()()()⎪⎩⎪⎨⎧++=++=++=++++++840202083020107202010121113311123211.x .x .x .x .x .x .x .x .x k k k k k k k k k进行迭代,其计算结果如下表2从此例看出,高斯—塞德尔迭代法比雅可比迭代法收敛快(达到同样的精度所需迭代次数少),但这个结论,在一定条件下才是对的,甚至有这样的方程组,雅可比方法收敛,而高斯—塞德尔迭代法却是发散的.三 迭代收敛的充分条件定理1 在下列任一条件下,雅可比迭代法(5)收敛.①111<∑=≠=∞nij j iiij ia a max B ;②1111<∑=≠=nij i iiij ja a max B ;③ 111<∑=-≠=∞-nji i jjij jTa a max AD I定理2 设21B B ,分别为雅可比迭代矩阵与高斯—塞德尔迭代矩阵,则∞∞≤12B B (10)从而,当111<∑=≠=∞nij j iiij ia a max B时,高斯—塞德尔迭代法(8)收敛. 证明 由21B B ,的定义,它们可表示成()U L D B +=-11()()U D L D I U L D B 11112-----=-=用e 表示n 维向量()T,...,,e 111=,则有不等式eB e B ∞≤11UD L D B 111--+=这里,记号|·|表示其中矩阵的元素都取绝对值,而不等式是对相应元素来考虑的,于是()()()Ie B L D I eL D B e U D ∞------≤-=111111容易验证()11==--nnL D L D所以,L D I 1--及L D I 1--可逆,且()()()1111111111-----------=++≤+++=-L D I LD ...L D I L D ...L D I LD I n n()I L D I ≥---11从而有()()((){}e I B L D I L D I eU D LD I e B ∞----------≤⋅-≤111111121{()()}eB eL D I I B I ∞--∞≤-⋅--=11111因此必有∞∞≤12B B因为已知11<∞B 所以12<∞B .即高斯—塞德尔迭代法收敛.若矩阵A 为对称,我们有定理3 若矩阵A 正定,则高斯—塞德尔迭代法收敛.证明 把实正定对称矩阵A 分解为T L L D A --=()TL U =,则D 为正定的,迭代矩阵()T L L D B 12--=设λ是2B 的任一特征值,x 为相应的特征向量,则()()x x L L D T λ=--1以L D -左乘上式两端,并由T L L D A --=有()Ax x L T λλ=-1用向量x 的共轭转置左乘上式两端,得()Ax x x L xTTT--=-λλ1 (11)求上式左右两端的共轭转置,得Ax x x L x T T ----=⎪⎭⎫ ⎝⎛-λλ1以λ--1和λ-1分别乘以上二式然后相加,得()()Axx x L L x T T T -----⎪⎭⎫ ⎝⎛-+=+⎪⎭⎫ ⎝⎛--λλλλλλ211 由TL L D A --=,得()()Axx x A D x T T -----⎪⎭⎫ ⎝⎛-+=-⎪⎭⎫ ⎝⎛--λλλλλλ211即()Ax x x L x TT---=-λλλ2211 (12)因为A 和D 都是正定的,且x 不是零向量,所以由(11)式得1≠λ,而由(12)式得012>-λ, 即1<λ,从而()12<B ρ,因而高斯—塞德尔迭代法收敛.定义1 设()nn ij a A ⨯=为n 阶矩阵.① ①如果n,...,i ,a a nij i j ij ii 21=∑>≠= (13)即A 的每一行对角元素的绝对值都严格大于同行其他元素绝对值之和,则称A 为严格对角优势矩阵.② ②如果n,...,i ,a a nij i j ij ii 21=∑≥≠=且至少有一个不等式严格成立,则称A 为弱对角优势矩阵.例如⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-310131012是严格对角优势矩阵,⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--310121011是弱对角优势矩阵. 定义2 设()nn ij a A ⨯=是n 阶矩阵,如果经过行的互换及相应列的互换可化为⎥⎦⎤⎢⎣⎡2212110A A A ,即存在n 阶排列矩阵P,使⎥⎦⎤⎢⎣⎡=2212110A A A AP P T其中2211A ,A 为方阵,则称A 是可约的,否则称A 为不可约的.A 是可约矩阵,意味着b Ax =可经过若干次行列重排,化为两个低阶方程组,事实上,b Ax =可化为 ()b P x P AP P TT T =,记()()()()⎥⎦⎤⎢⎣⎡==⎥⎦⎤⎢⎣⎡==2121d d d b P ,y y y x P TT于是,求解b Ax =化为求解()()()()()⎪⎩⎪⎨⎧=+=+22221212111d y A d y A y A可以证明,如果A 为严格对角优势矩阵或为不可约弱对角优势矩阵,则A 是非奇异的.定理4 如果A 为严格对角优势矩阵或为不可约弱对角优势矩阵,则对任意()0x ,雅可比迭代法(4)与高斯—塞德尔迭代法(8)均为收敛的.证明 下面我们以A 为不可约弱对角优势矩阵为例,证明雅可比迭代法收敛,其他证明留给读者.要证明雅可比迭代法收敛,只要证()11<B ρ,1B 是迭代矩阵.用反证法,设矩阵1B 有某个特征值μ,使得1≥μ,则()01=-B I det μ,由于A 不可约,且具有弱对角优势,所以1-D 存在,且 ()()D A D D A D I I B I -+=--=---μμμ111从而()0=-+D A D detμ另一方面,矩阵()D A D -+μ与矩阵A 的非零元素的位置是完全相同的,所以()D A D -+μ也是不可约的,又由于1≥μ,且A 弱对角优势,所以n,...,i ,a a a nij i j ij ii ii 21=∑≥≥≠=μ并且至少有一个i 使不等号严格成立.因此,矩阵()D A D -+μ弱对角优势,故()D A D -+μ为不可约弱对角优势矩阵.从而()0≠-+D A D det μ矛盾,故1B 的特征值不能大于等于1,定理得证.。
雅可比(Jacobi)迭代法
高斯赛德尔迭代矩阵BG一般不容易计算,所以实际使用 时采用分量形式的算法,参见程序 GaussSeidelit2.m
例子:p.55(p.52)例8 ,10-3的精度,迭代6 次。
3x1x12xx22
5 5
x(k 1) 1
x(k) 2 3
x(k) i
(bi
a x( k1) ij j
aij
x
( j
k
)
)
/
aii
j 1
ji
不同的 的值会影响SOR迭代的收敛性、收敛 速度。
20
例(7)SOR迭代法
8 3 2 A 4 11 1
6 3 12
取 =1.5,则迭代矩阵:
1 / 2 9 / 16
3 / 8
B 3 /11 71/ 88 15 / 44
|| B || 20, || B ||1 17, || B ||2 14.4, (B) 13
不收敛。
14
(2)简单构造迭代法-2
8x1 3x2 2x3 20 4x1 11x2 x3 33 6x1 3x2 12x3 36
2
3
4x1 20 4x1 3x2 2x3
9x2 33 4x1 2x2 x3
举例:
8 4
x1 x1
3x2 2x3 11x2 x3
20 33
6 x1 3 x2 12x3 36
精确解
3 2 1
13
(1)简单迭代法
8 3 2 7 3 2 B I A I 4 11 1 4 10 1
6 3 12 6 3 11 20 b' 33 36
SOR迭 代( 1.3545), 17次 , (B) 0.452847
矩阵雅克比迭代算法
雅克比迭代实验目的:1.学习和掌握线性代数方程组的jacobi 迭代法。
2.运用jacobi 迭代法进行计算。
方法原理:设方程组Ax=b 的系数矩阵A 非奇异而且),...,2,1(0n i a ii =≠,将A 分裂为 A=D+L+U,可以使计算简便。
其中),,...,,(2211nn a a a diag D =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=0...............0...00 (002)121n n a a a L ,⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=0..................00...02112nn a a a U A=D+L+U ,其中),,...,,(2211nn a a a diag D =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=0...............0...00 (002)121n n a a a L ,⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=0..................00...02112nn a a a U 将方程组n ,...,2,1i ,b x a i n1j j ij ==∑=乘以iia 1,得到等价的方程组⎪⎪⎪⎭⎫ ⎝⎛-=∑≠=nij 1j j ij i ii i x a b a 1x ,i=1,2,…n ,简记为x Bx f=+。
其中 11()B I D A D L U --=-=-+, 1f D b -=. 我们称x Bx f ϕ=+为迭代函数。
任取初始向量(0)x x=,按照(1)()k k xBx f+=+形成迭代格式,称这种迭代方法为Jacobi 迭代法。
算法描述:Step1:给定一组x ,即初值。
Step2:用for 循环计算:x[k+1]=(b[i]-∑∑+=-=-n1i j 1i 1j ]j [x ]j ][i [a ]j [x ]j ][i [a )/a[i][i].Step3:当fabs(x[k+1]-x[k])<eps时停止。
程序代码:头文件:#include<iostream.h>typedef double Datatype;class Matrix{private:Datatype **ar;int M;int N;public:Matrix(int a=0,int b=0);Matrix(Matrix &A);~Matrix();void print();void Init();void Jacobi(Matrix b,Matrix x,Matrix &xx);bool compare(Matrix X);void change(Matrix xx);};CPP文件:#include<iostream.h>#include<malloc.h>#include<iomanip.h>#include"Jacobi.h"#define E 0.0000001#include<math.h>Matrix::Matrix(int a,int b)///////////////////构造函数{M=a;N=b;ar=(Datatype **)malloc(sizeof(Datatype *)*M);for(int i=0;i<M;++i){ar[i]=(Datatype *)malloc(sizeof(Datatype)*N);for(int j=0;j<N;++j){ar[i][j]=0;}}}Matrix::~Matrix()////////////////////////////析构函数{for(int i=0;i<M;++i){free(ar[i]);}free(ar);}Matrix::Matrix(Matrix &A){M=A.M;N=A.N;Datatype **p=(Datatype **)malloc(sizeof(Datatype *)*M);for(int i=0;i<M;++i){p[i]=(Datatype *)malloc(sizeof(Datatype)*N);for(int j=0;j<N;++j){p[i][j]=A.ar[i][j];}}ar=p;}void Matrix::print()////////////////////////打印函数{for(int i=0;i<M;++i){for(int j=0;j<N;++j){cout<<setw(5)<<ar[i][j];}cout<<endl;}}void Matrix::Init()/////////////////////////初始化函数{for(int i=0;i<M;++i){cout<<"请输入第"<<i+1<<"行数据"<<endl;for(int j=0;j<N;++j){cin>>ar[i][j];}}}void Matrix::Jacobi(Matrix b,Matrix x,Matrix &xx) {for(int i=0;i<N;++i){Datatype sum=0;for(int j=0;j<N;++j){if(i==j)continue;sum+=ar[i][j]*x.ar[j][0];}xx.ar[i][0]=(b.ar[i][0]-sum)/ar[i][i];}}bool Matrix::compare(Matrix X){int flag=0;for(int i=0;i<M;++i){for(int j=0;j<N;++j){if(fabs(ar[i][j]-X.ar[i][j])>E){flag=1;break;}}break;}if(flag==1)return false;//程序需继续迭代elsereturn true;//迭代结束}void Matrix::change(Matrix xx){for(int i=0;i<M;++i){ for(int j=0;j<N;++j) { ar[i][j]=xx.ar[i][j]; } } }主程序:#include"Jacobi.h"void main() { int row; cout<<"*****"<<endl; cin>>row; Matrix A(row,row),b(row,1),x(row,1),xx(row,1); cout<<"请输入系数矩阵"<<endl; A.Init();//系数 cout<<"请输入矩阵b"<<endl; b.Init();//b cout<<"请输入迭代初始值"<<endl; x.Init();//迭代初始值 while(1) { A.Jacobi(b,x,xx); if(pare(xx)) { xx.print(); break; } x.change(xx); } }测试数据:1231231232213225x x x x x x x x x +-=⎧⎪++=⎨⎪++=⎩ 测试结果:参考文献:[1]刑志栋,矩阵数值分析,陕西:陕西科学技术出版社,2005。
雅克比迭代法……
{ a[i]=(float *)malloc(n*sizeof(float)); return a; } float matrix_category(float* x,int n) { int i; float temp=0; for(i=0;i<n;i++) { temp=temp+fabs(x[i]); } return temp; }
结束
④三角分解法 #include<iostream> using namespace std; int main() { const int N=100; static double a[N][N],b[N]; int i,j,k,num,p; double m,t,q; cout<<"请输入矩阵阶数 请输入矩阵阶数: cout<<"请输入矩阵阶数:"; cin>>num;
cout<<endl<<"输入初始向量 输入初始向量: cout<<endl<<"输入初始向量:\n"; for(i=0;i<n;i++) { cin>>x_0[i]; } x_k=one_array_malloc(n); cout<<"输入松弛因子 (1<w<2): cout<<"输入松弛因子 w (1<w<2):\n"; cin>>w; float temp; for(k=0;k<MAX;k++) for(k=0;k<MAX;k++) { for(i=0;i<n;i++) { temp=0; for(j=0;j<i;j++) { temp=temp+a[i][j]*x_k[j]; } x_k[i]=a[i][n]x_k[i]=a[i][n]-temp; temp=0; for(j=i+1;j<n;j++) { temp=temp+a[i][j]*x_0[j]; } x_k[i]=(x_k[i]x_k[i]=(x_k[i]-temp)/a[i][i]; x_k[i]=(1x_k[i]=(1-w)*x_0[i]+w*x_k[i]; } for(i=0;i<n;i++) x_0[i]=x_k[i]{ x_0[i]=x_k[i]-x_0[i]; } if(matrix_category(x_0,n)<precision) { break; } else { for(i=0;i<n;i++) { x_0[i]=x_k[i]; } } } if(MAX==k) cout<<"迭代不收敛 迭代不收敛\ { cout<<"迭代不收敛\n"; } cout<<"迭代次数为 迭代次数为: cout<<"迭代次数为:"<<k<<endl; cout<<"解向量为 解向量为: cout<<"解向量为:\n"; for(i=0;i<n;i++) { cout<<"x"<<i<<": "<<x_k[i]<<endl; } return 0; } float *one_array_malloc(int n) { float *a; a=(float *)malloc(sizeof(float)*n); return a; } float **two_array_malloc(int m,int n) { float **a; int i; **)malloc(m*sizeof(float a=(float **)malloc(m*sizeof(float *)); for (i=0;i<m;i++)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a x (k) n,n1 n1
bn )
取初始向量
X
(0)
(
x (0) 1
,
x (0) 2
,
,
x (0) n
)T
利用(4)反复迭代可以得到一个向量序列 {X (k)}
称式(4)为雅可比迭Jacobi代公式。
若记
a11
D
a22
0
a21 0
0 a12
0
L a31
a32
0
U
特征方程 I D1(L U ) 0
又可以写成 D1 D L U 0 因为 D1 0 ,所以 D L U 0 上式左端为将系数矩阵 A 的对角元同乘以 λ 后所得新矩阵的行列式。
例8 用雅可比迭代法求解方程组
10x1 2x2 x3 3 2x1 10x2 x3 15 x1 2x2 5x3 10
由迭代矩阵的特征方程
10 2 1 2 10 1 0 1 2 5
展开得到
(10 2)(50 2 10 3) 0
解得
1
1 5
, 2
1 10
7
, 3
1 10
7
于是 (J ) 1 7 0.3646 1
10
因而雅可比迭代公式是收敛的。
练习:考察用雅可比Jacobi迭代法解方程组 AX=b的收敛性,
解:相应的雅可比迭代公式为
x1(
k
1)
1 10
(2x2(k )
x (k) 3
3)
x2(k
1)
1 10
(2
x1(
k
)
x (k) 3
15)
x3(k
1)
1 5
(
x1(
k
)
2x2(k )
10)
取初值
x (0) 1
x (0) 2
x (0) 3
,按迭代公式进行迭代,
得计算结果
k x (k) 1
x (k) 2
ann
an1 an2
an1 0
a1n
a2n
an1,n
0
则 AX=b 的系数矩阵 为A=D-L-U , 雅可比迭代公 式的矩阵表示形式为
X (k1) D1(L U ) X (k) D1b 其中 D1(L U ) 称为雅可比迭代矩阵。
记为 BJ D1(L U )
我们用定理2来判断雅可比迭代公式是否收敛 需要考虑雅可比迭代矩阵 D1(L U )
4 0.9716 1.9700 2.9540 9 0.9998 1.9998 2.9998
原方程组的准确解为 x1 1, x2 2, x3 3
可以看出,当迭代次数增加时,迭代结果 越来越接近准确解.
因此,
x (9) 1
0.9998, x2(9)
1.9998, x3(9)
2.9998
可以作为原方程组的近似解。
an,n1xn1 bn )
获得相应的迭代公式
x1(k
1)
1 a11
(a12 x2(k )
a13 x3(k )
x2 ( k
1)
1 a22
(a21x1(k )
a23 x3(k )
xn(
k
1)
1 ann
(an1x1(k )
an2 x2(k )
a1n xn(k ) b1)
a2n xn(k ) b2 )
1、雅可比(Jacobi)迭代法
由方程组 AX=b 的第 i 个方程解出 xi (i 1, 2, , n) 得到一个同解方程组
x1
1 a11
(a12 x2
a13 x3
x2
1 a22
(a21x1
a23x3
xn
1 an1
(an1x1
an2 x2
a1n xn b1) a2n xn b2 )
x (k) 3
k
x (k) 1
x (k) 2
x (k) 3
00
0
0
5 0.9894 1.9897 2.9823
1 0.3000 1.5000 2.0000 6 0.9963 1.9961 2.9938
2 0.8000 1.7600 2.6600 7 0.9986 1.9986 2.9977
3 0.9180 1.9260 2.8640 8 0.9995 1.9995 2.9992
其中 1 0 1
A 1 1
0
1 2 3