矩阵古典雅克比迭代算法
矩阵雅克比迭代算法
雅克比迭代实验目的: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 (002121)n n a a a L ,⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=0...00...............00...02112n n 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...............00...02112n n a a a U 将方程组n ,...,2,1i ,b x a i n 1j j ij ==∑=乘以ii a 1,得到等价的方程组⎪⎪⎪⎭⎫ ⎝⎛-=∑≠=n i j 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 x Bx 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时停止。
jacobi迭代法matlab
jacobi迭代法matlabJacobi迭代法是一种常用的线性方程组求解方法,它是一种迭代法,通过不断迭代来逼近线性方程组的解。
Jacobi迭代法的基本思想是将线性方程组的系数矩阵分解为一个对角矩阵和一个非对角矩阵的和,然后通过迭代求解对角矩阵和非对角矩阵的乘积,最终得到线性方程组的解。
Jacobi迭代法的具体步骤如下:1. 将线性方程组的系数矩阵A分解为一个对角矩阵D和一个非对角矩阵R的和,即A=D+R。
2. 将线性方程组的右端向量b分解为一个对角矩阵D和一个非对角矩阵N的乘积,即b=Dx。
3. 对于任意的初始解向量x0,计算下一次迭代的解向量x1,即x1=D^(-1)(b-Rx0)。
4. 重复步骤3,直到达到预定的精度或迭代次数。
Jacobi迭代法的优点是简单易懂,易于实现,收敛速度较快。
但是,它的缺点也很明显,即收敛速度较慢,需要进行大量的迭代才能达到较高的精度。
在Matlab中,可以使用以下代码实现Jacobi迭代法:function [x,k]=jacobi(A,b,x0,tol,maxit)% Jacobi迭代法求解线性方程组Ax=b% 输入:系数矩阵A,右端向量b,初始解向量x0,精度tol,最大迭代次数maxit% 输出:解向量x,迭代次数kn=length(b); % 系数矩阵A的阶数D=diag(diag(A)); % 对角矩阵DR=A-D; % 非对角矩阵Rx=x0; % 初始解向量for k=1:maxitx1=D\(b-R*x); % 计算下一次迭代的解向量if norm(x1-x)<tol % 判断是否达到精度要求break;endx=x1; % 更新解向量end输出结果可以使用以下代码实现:A=[4 -1 0; -1 4 -1; 0 -1 4]; % 系数矩阵b=[15; 10; 10]; % 右端向量x0=[0; 0; 0]; % 初始解向量tol=1e-6; % 精度要求maxit=1000; % 最大迭代次数[x,k]=jacobi(A,b,x0,tol,maxit); % Jacobi迭代法求解线性方程组fprintf('解向量x=[%f; %f; %f]\n',x(1),x(2),x(3)); % 输出解向量fprintf('迭代次数k=%d\n',k); % 输出迭代次数以上就是Jacobi迭代法的主要内容,通过Matlab实现Jacobi迭代法可以更好地理解其基本思想和具体步骤。
类矩阵两种迭代法的收敛性比较
类矩阵两种迭代法的收敛性比较引言:在科学计算中,线性方程组的求解是很普遍的问题。
尤其是在大型科学计算中,线性方程组的求解是最重要的任务之一。
线性方程组的求解有很多种方法,例如高斯消元法、LU分解法、迭代法等等,其中迭代法是一种高效的方法。
迭代法的思想是从一个初值解开始,逐步改进解的准确度,直到满足误差要求。
在本文中,我们将讨论两种类矩阵迭代法的收敛性比较,即雅可比迭代法和高斯-赛德尔迭代法。
1.雅可比迭代法(Jacobi Iterative Method):雅可比迭代法是最简单的迭代法之一。
它是基于线性方程组的矩阵形式 Ax=b,将 A 分解成 A=D-L-U(D为A的对角线元素,L为A的下三角矩阵,U为A的上三角矩阵),其中 D 为对角线元素,L为严格下三角矩阵,U 为严格上三角矩阵。
则有如下迭代关系式: x^{(k+1)}=D^{-1}(L+U)x^{(k)}+D^{-1}b (1)其中,x^{(k)} 为 k 次迭代后的解,x^{(0)} 为初始解。
雅可比迭代法的迭代矩阵为M = D^{-1}(L+U)。
以下是雅可比迭代法的收敛性分析:定理1:若矩阵 A 为对称正定矩阵,则雅可比迭代法收敛。
证明:由于 A 为对称正定矩阵,所以存在唯一的解。
假设迭代后得到的解为 x^{(k)},则我们可以用误差向量 e^{(k)} = x-x^{(k)} 表示剩余项,则有 Ax^{(k)}-b = e^{(k)}。
对 (1) 式两边同时乘以 A^-1,得:x^{(k+1)}=x^{(k)}-A^{-1}e^{(k)}。
(2)将 (2) 式代入 Ax^{(k)}-b = e^{(k)} 中,得:Ax^{(k+1)}-b = Ae^{(k)}.(3)由于 A 为对称正定矩阵,则存在 A=Q\\Lambda Q^{-1},其中Q 为正交矩阵,\\Lambda 为对角矩阵。
因此,我们可以将 (3) 式转化为:\\| x^{(k+1)}-x \\|_{A} =\\| Q^{-1}A^{-1}Qe^{(k)}\\|_{\\Lambda} \\leq \\rho (Q^{-1}A^{-1}Q)\\|e^{(k)}\\|_{A}。
研究生数值分析(11)雅可比(Jacobi)迭代法
解:相应的雅可比迭代公式为
( k 1) 1 x1 (2 x2 ( k ) x3( k ) 3) 10 ( k 1) 1 x2 (2 x1( k ) x3( k ) 15) 10 ( k 1) 1 ( k ) x3 ( x1 2 x2 ( k ) 10) 5
则 AX=b 的系数矩阵 为A=D-L-U , 雅可比迭代公式的矩阵表示形式为 X ( k 1) D1 ( L U ) X ( k ) D 1b 其中 D 1 ( L U ) 称为雅可比迭代矩阵。 记为 BJ D 1 ( L U )
我们用定理2来判断雅可比迭代公式是否收敛
x1(0) x2(0) x3(0) 0 ,按迭代公式进行迭代, 取初值
得计算结果
k
0 1 2 3 4
x
(k ) 1
x2 ( k )
0 1.5000 1.7600 1.9260 1.9700
x3 ( k )
k
x1( k )
x2 ( k )
x3 ( k )
0 0.3000 0.8000 0.9180 0.9716
个方程解出得到一个同解方程组雅可比jacobi迭代法获得相应的迭代公式1121223132则axb的系数矩阵为adlu记为我们用定理2来判断雅可比迭代公式是否收敛需要考虑雅可比迭代矩阵上式左端为将系数矩阵a的对角元同乘以后所得新矩阵的行列式
1 雅可比(Jacobi)迭代法 由方程组 AX=b 的第 i 个方程解出 xi
获得相应的迭代公式
( k 1) 1 x1 (a12 x2 ( k ) a13 x3( k ) a1n xn ( k ) b1 ) a11 1 ( k 1) x2 (a21 x1( k ) a23 x3( k ) a2 n xn ( k ) b2 ) a22 (4) 1 ( k 1) xn (an1 x1( k ) an 2 x2 ( k ) an ,n 1 xn 1( k ) bn ) ann
雅克比(Jacobi)方法
雅克⽐(Jacobi)⽅法可以⽤来求解协⽅差矩阵的特征值和特征向量。
雅可⽐⽅法(Jacobian method)求全积分的⼀种⽅法,把拉格朗阶查⽪特⽅法推⼴到求n个⾃变量⼀阶⾮线性⽅程的全积分的⽅法称为雅可⽐⽅法。
雅克⽐迭代法的计算公式简单,每迭代⼀次只需计算⼀次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,⽐较容易并⾏计算。
考虑线性⽅程组Ax=b时,⼀般当A为低阶稠密矩阵时,⽤主元消去法解此⽅程组是有效⽅法。
但是,对于由⼯程技术中产⽣的⼤型稀疏矩阵⽅程组(A的阶数很⾼,但零元素较多,例如求某些偏微分⽅程数值解所产⽣的线性⽅程组),利⽤迭代法求解此⽅程组就是合适的,在计算机内存和运算两⽅⾯,迭代法通常都可利⽤A中有⼤量零元素的特点。
雅克⽐迭代法就是众多迭代法中⽐较早且较简单的⼀种,其命名也是为纪念普鲁⼠著名数学家雅可⽐。
原理【收敛性】设Ax=b,其中A=D+L+U为⾮奇异矩阵,且对⾓阵D也⾮奇异,则当迭代矩阵J的谱半径ρ(J)<1时,雅克⽐迭代法收敛。
⾸先将⽅程组中的系数矩阵A分解成三部分,即:A = L+D+U,其中D为对⾓阵,L为下三⾓矩阵,U为上三⾓矩阵。
之后确定迭代格式,X^(k+1) = B*X^(k) +f ,(这⾥^表⽰的是上标,括号内数字即迭代次数),其中B称为迭代矩阵,雅克⽐迭代法中⼀般记为J。
(k = 0,1,......)再选取初始迭代向量X^(0),开始逐次迭代。
【优缺点】雅克⽐迭代法的优点明显,计算公式简单,每迭代⼀次只需计算⼀次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,⽐较容易并⾏计算。
然⽽这种迭代⽅式收敛速度较慢,⽽且占据的存储空间较⼤,所以⼯程中⼀般不直接⽤雅克⽐迭代法,⽽⽤其改进⽅法。
实现通过雅克⽐(Jacobi)⽅法求实对称矩阵的特征值和特征向量操作步骤:S′=G T SG,其中G是旋转矩阵,S′和S均为实对称矩阵,S′和S有相同的Frobenius norm,可以⽤⼀个最简单的3维实对称矩阵为例,根据公式进⾏详细推导(参考 ):通过旋转矩阵将对称矩阵转换为近似对⾓矩阵,进⽽求出特征值和特征向量,对⾓矩阵中主对⾓元素即为S近似的实特征值。
雅克比迭代法和高斯赛德尔迭代法的算法描述
雅克比迭代法和高斯赛德尔迭代法的算法描述一. 雅克比迭代法雅克比迭代法(Jacobi Iteration)是计算数值解的一种迭代方法,它遵循一个简单的步骤:给定问题的初始值,按照一定的规则,用求出某一个矩阵元素,替换当前值,得到下一个矩阵值,重复这个步骤,直到满足某一个条件,即为所求解的结果。
雅克比迭代法求解矩阵问题的一般步骤为:(1)给定初始矩阵A和右端值矩阵B,将第i行第j列的元素表示为aij,bi;(2)第i行其它元素之和定义为s(i) =∑(j≠i)|a(i, j)|,亦即∑|aij|;(3)如果s(i)不等于0,则第i行第i列元素的值更新为xi=1 (b(i) ∑(j≠i)[a(i, j)x(j)])/a(i, i)(4)重复步骤3,直到满足|X(i)X(i)|<ε(ε为设定的误差),此时x即为所求解的结果。
二. 高斯-赛德尔迭代法高斯-赛德尔迭代法(Gauss-Seidel Iteration)是另一种迭代方法,算法的基本思想也是:通过迭代,计算出当前矩阵的第i行第j列的元素xi;然后更新第i行第j列元素的值,继续迭代,直到某种条件满足,即可求出矩阵的解。
高斯-赛德尔迭代法的基本步骤为:(1)给定初始矩阵A和右端值矩阵B,将第i行第j列的元素表示为aij,bi;(2)第i行其它元素之和定义为s(i) =∑(j≠i)|a(i, j)|,亦即∑|aij|;(3)如果s(i)不等于0,则第i行第i列元素的值更新为xi=1 (b(i) ∑(j<i)[a(i, j)x(j)]∑(j>i)[a(i,j)x(j)] )/a(i, i)(4)重复步骤3,直到满足|X(i)X(i)|<ε(ε为设定的误差),此时x即为所求解的结果。
总结从上面的对比来看,雅克比迭代法和高斯赛德尔迭代法的步骤基本一致,均采用迭代的方式求解矩阵A的解X,不同的是,高斯赛德尔迭代法在更新矩阵A的第i行第i列元素时,采用把小于i的j元素的值替换成当前迭代求得的值来计算,而雅克比迭代法采用把全部j元素的值替换成当前迭代求得的值来计算。
雅可比迭代法 迭代矩阵
雅可比迭代法(Jacobi iteration method)是一种用于求解线性方程组的迭代算法。
给定一个线性方程组Ax = b,其中A是一个n×n矩阵,x和b是n维向量,雅可比迭代法通过构造一个迭代矩阵来逼近方程的解。
雅可比迭代法的迭代矩阵通常表示为D - L - U,其中D、L和U分别是矩阵A的对角矩阵、严格下三角矩阵和严格上三角矩阵。
具体来说,D的对角线元素是A的对角线元素,L是A 的下三角部分(不包括对角线),U是A的上三角部分(不包括对角线)。
雅可比迭代法的迭代公式为:
x^(k+1) = D^(-1) * (b - (L + U) * x^k)
其中,x^k表示第k次迭代的解向量,D^(-1)是对角矩阵D的逆矩阵。
雅可比迭代法的收敛性取决于迭代矩阵D - L - U的谱半径(即最大特征值的绝对值)。
如果谱半径小于1,则雅可比迭代法收敛;否则,可能不收敛。
在实际应用中,通常会使用其他更高效的迭代方法,如高斯-赛德尔迭代法(Gauss-Seidel method)或SOR方法(Successive Over-Relaxation method)。
jacobi迭代法原理
jacobi迭代法原理引言在数值计算中,我们经常需要求解线性方程组,这是一个常见的数值问题。
而jacobi迭代法是求解线性方程组的一种常用方法。
本文将对jacobi迭代法的原理进行全面、详细、完整且深入地探讨。
什么是线性方程组在了解jacobi迭代法之前,我们首先要了解什么是线性方程组。
线性方程组是一组形如下式的方程的集合:a11*x1 + a12*x2 + ... + a1n*xn = b1a21*x1 + a22*x2 + ... + a2n*xn = b2...an1*x1 + an2*x2 + ... + ann*xn = bn其中,a11、a12、…、ann为已知系数,x1、x2、…、xn为未知数,b1、b2、…、bn为已知常数项。
我们的目标是找到满足上述方程组的未知数x1、x2、…、xn的解。
jacobi迭代法的基本原理jacobi迭代法是一种迭代的算法,通过逐步迭代求解线性方程组。
算法步骤jacobi迭代法的基本步骤如下: 1. 对于线性方程组的每个方程i,将该方程中的第i个未知数x[i]视为未知数,其他未知数x[j](j≠i)视为常数。
2. 根据第一步的设定,可以得到每个方程的迭代计算公式:x[i]^(k+1) = (b[i] -a[i1]*x[1]^k - a[i2]*x[2]^k - ... - a[i(i-1)]*x[i-1]^k - a[i(i+1)]*x[i+1]^k - ... - a[in]*x[n]^k) / a[ii]其中,x[i]^k表示第k次迭代中第i个未知数的值,a[ij]表示第i行第j个系数,b[i]表示第i个常数项。
3.按照第二步的迭代公式,进行多次迭代,直到迭代结果满足精度要求为止。
迭代收敛性对于jacobi迭代法,迭代过程是否收敛是一个重要的问题。
在满足一定条件下,jacobi迭代法是收敛的。
我们定义误差向量e^(k)为第k次迭代的解向量与真实解向量之差:e^(k) = x - x^k其中,x表示真实解向量,x^k表示第k次迭代的解向量。
雅克比迭代法公式
雅克比迭代法公式
雅克比迭代法公式是一种在数学中求解不定方程的算法。
它的名字来源于著名的19世纪的德国数学家詹姆斯雅克比(JamesJakobie)。
雅克比迭代法是一种递归算法,可以求解非线性方程组的解,从而有效地求解不定方程组。
在这种算法中,我们使用递归迭代来进行求解,简单来说,就是用某种格式的解公式,以及递归公式来求解方程组。
雅克比迭代法公式是一种求解不定方程组的方法,它可以帮助我们求解某些问题中存在的不定方程,以有效地求解此类问题。
雅克比迭代法公式可以很容易地表示为:
递归公式:X_(n+1) = F(X_n),
其中,F(x)=f(x)的连续函数。
用雅克比迭代法公式求解不定方程的具体步骤如下:
(1)首先,对于一个不定方程,需要确定可能求解的迭代起点;
(2)然后,用迭代起点作为基准,构造一个新的迭代方程,即
雅克比迭代法公式;
(3)接下来,用此方程迭代求解,迭代次数根据实际情况而定;
(4)最后,通过迭代求解求得方程的解,并对其进行检验,以
确定此解是否正确。
雅克比迭代法公式的优势在于它的计算复杂度比其他方法要低,因此在求解不定方程组方面具有很大的优势。
此外,不定方程的求解过程也更简单,不需要太多的计算量。
雅克比迭代法公式一直备受追捧,它可以帮助我们在数学中有效地求解不定方程,简化计算过程。
它也被广泛应用于科学、工程、数学和计算机方面,大大减少了计算量,提高了效率。
因此,雅克比迭代法公式在求解不定方程组中发挥着重要作用,它不仅在实际应用中十分重要,而且它的应用也使得计算更加便捷,从而为人们带来了巨大的方便。
雅可比迭代法和高斯超松弛迭代
雅可比迭代法分量形式(63)式也可改写为
(64)
(64)式更方便于编程求解。
雅可比迭代法公式简单,迭代思路明确。每迭代一次只需计算n个方程的向量乘法,程序编制时需设二个数组分别存放xk和xk+1便可实现此迭代求解。
2、高斯-赛德尔(Gauss-seidel)迭代法
由雅可比迭代法可知,在计算xk+1的过程中,采用的都是上一迭代步的结果xk。考察其计算过程,显然在计算新分量xik+1时,已经计算得到了新的分量, 。有理由认为新计算出来的分量可能比上次迭代得到的分量有所改善。希望充分利用新计算出来的分量以提高迭代解法的效率,这就是高斯-赛德尔迭代法(简称G-S迭代法)对(64)式进行改变可以得到G-S迭代法的分 量形式
(75)
其中ω称为松弛因子。
式(75)是迭代公式(74)的一个改进,可以选择松弛因子ω加速迭代过程的收敛。 式(75)的分量形式为
(76)
若对上述改进的迭代公式,按高斯-赛德尔迭代法尽量利用最新迭代得到的分量的原则,又可得到新的迭代公式
(77)
当线性方程组的系数矩阵A具有非零主元(aii≠0,i=1,2,3,…n)的特点时,可 以得到主元为1的方程组形式
雅可比迭代法和高斯-赛德尔迭代法以及超松弛迭代
对于给定的方程 用下式逐步代入求近似解的方法称为迭代法。如xk(当 )的极限存在,此极限即方程组的真正解,此迭代法收敛,否则称迭代法收敛。
1、雅可比(Jacobi)迭代法
设有方程组
Ax=b (56)
其展开形式为
(57)
系数矩阵A为非奇异阵,且 (i=1-n)A可分解为
高斯-赛德尔迭代的矩阵形式可表达为
(69)
高斯-赛德尔迭代法每步迭代的计算量与雅可比迭代相当,但在计算机进行计算时,只需存放x一个数组。
雅可比迭代法及矩阵的特征值
实验五矩阵的lu 分解法,雅可比迭代法班级:**::实验五 矩阵的LU 分解法,雅可比迭代一、目的与要求:➢ 熟悉求解线性方程组的有关理论和方法;➢ 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序;➢ 通过实际计算,进一步了解各种方法的优缺点,选择适宜的数值方法。
二、实验内容:➢ 会编制列主元消去法、LU 分解法、雅可比及高斯—塞德尔迭代法德程序,进一步了解各种方法的优缺点。
三、程序与实例➢ 列主元高斯消去法算法:将方程用增广矩阵[A ∣b ]=(ij a )1n (n )+⨯表示1) 消元过程对k=1,2,…,n-1①选主元,找{}n ,,1k ,k i k +∈使得k ,i k a =ik a ni k max ≤≤ ②如果0a k ,i k =,则矩阵A 奇异,程序完毕;否则执行③。
③如果k i k ≠,则交换第k 行与第k i 行对应元素位置,j i k j k a a ↔ j=k,┅,n+1④消元,对i=k+1, ┅,n 计算对j=l+1, ┅,n+1计算2) 回代过程①假设0=nn a ,则矩阵A 奇异,程序完毕;否则执行②。
②nn n n n a a x /1,+=;对i=n-1, ┅,2,1,计算程序与实例程序设计如下:#include <iostream>#include <cmath>using namespace std;void disp(double** p,int row,int col){for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<p[i][j]<<' ';cout<<endl;}}void disp(double* q,int n){cout<<"====================================="<<endl; for(int i=0;i<n;i++)cout<<"*["<<i+1<<"]="<<q[i]<<endl;cout<<"====================================="<<endl; }void input(double** p,int row,int col){for(int i=0;i<row;i++){cout<<"输入第"<<i+1<<"行:";for(int j=0;j<col;j++)cin>>p[i][j];}}int findMa*(double** p,int start,int end){int ma*=start;for(int i=start;i<end;i++){if(abs(p[i][start])>abs(p[ma*][start]))ma*=i;}return ma*;}void swapRow(double** p,int one,int other,int col){double temp=0;for(int i=0;i<col;i++){temp=p[one][i];p[one][i]=p[other][i];p[other][i]=temp;}}bool dispel(double** p,int row,int col){for(int i=0;i<row;i++){int flag=findMa*(p,i,row); //找列主元行号if(p[flag][i]==0) return false;swapRow(p,i,flag,col); //交换行for(int j=i+1;j<row;j++){double elem=p[j][i]/p[i][i]; //消元因子 p[j][i]=0;for(int k=i+1;k<col;k++){p[j][k]-=(elem*p[i][k]);}}}return true;}double sumRow(double** p,double* q,int row,int col){ double sum=0;for(int i=0;i<col-1;i++){if(i==row)continue;sum+=(q[i]*p[row][i]);}return sum;}void back(double** p,int row,int col,double* q){for(int i=row-1;i>=0;i--){q[i]=(p[i][col-1]-sumRow(p,q,i,col))/p[i][i]; }}int main(){cout<<"Input n:";int n; //方阵的大小cin>>n;double **p=new double* [n];for(int i=0;i<n;i++){p[i]=new double [n+1];}input(p,n,n+1);if(!dispel(p,n,n+1)){cout<<"奇异"<<endl;return 0;}double* q=new double[n];for(int i=0;i<n;i++)q[i]=0;back(p,n,n+1,q);disp(q,n);delete[] q;for(int i=0;i<n;i++)delete[] p[i];delete[] p;}1. 用列主元消去法解方程例2 解方程组计算结果如下➢ 矩阵直接三角分解法算法:将方程组A *=b 中的A 分解为A =LU ,其中L 为单位下三角矩阵,U 为上三角矩阵,则方程组A *=b 化为解2个方程组Ly =b ,U*=y ,具体算法如下:①对j=1,2,3,…,n 计算对i=2,3,…,n 计算②对k=1,2,3,…,n:a. 对j=k,k+1,…,n 计算b. 对i=k+1,k+2,…,n 计算③11b y =,对k=2,3,…,n 计算④nn n n u y x /=,对k=n-1,n-2,…,2,1计算注:由于计算u 的公式于计算y 的公式形式上一样,故可直接对增广矩阵[A ∣b ]=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡+++1,211,2222211,111211n n nn n n n n n n a a a a a a a a a a a a 施行算法②,③,此时U 的第n+1列元素即为y 。
雅可比(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非奇异,且主对
雅可比矩阵算法
雅可比矩阵算法
雅可比矩阵算法主要用于分析多元函数的导数或微分,具体步骤如下:
1. 定义:设U⊂ℝⁿ,f:U→ℝ为光滑映射,fⁱ:=uⁱ∘f:U→ℝ为分量函数,则f 在p点的雅克比矩阵为k×n矩阵Df(p),其(i,j)矩阵元为Dfⁱ(p)。
2. 分析:雅可比矩阵体现了一个可微方程与给出点的最优线性逼近,其重要性在于它类似于多元函数的导数。
3. 应用:雅可比矩阵主要用于研究非线性变换后的网格分布。
当非线性变换后,网格分布可能不等距或不平行,但如果把局部放大,在某一点附近,可以近似的把这个变换看成是局部线性变换。
以上是雅可比矩阵算法的基本步骤和应用,仅供参考,如需了解更多信息,建议查阅相关文献或咨询专业数学研究人员。
雅可比(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
雅可比迭代公式
雅可比迭代公式雅可比迭代公式是一种在数值分析中用于求解线性方程组的迭代方法。
咱先来说说这个雅可比迭代公式到底是啥。
比如说,咱有一个线性方程组,像这样:\[\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迭代法和SOR迭代法求解Hilbert矩阵方程组
燕山大学课程设计说明书题目:直接法求解Hilbert矩阵方程组学院〔系〕:理学院年级专业:学号:学生姓名:指导教师:教师职称:教授燕山大学课程设计〔论文〕任务书院〔系〕:理学院基层教学单位:学号学生姓名专业〔班级〕设计题目古典迭代法求解Hilbert矩阵方程组设计技术参数分别利用古典迭代法中的Jacobi迭代法和SOR迭代法,求解Hilbert矩阵方程组,并及准确解进行比拟,得出结论,然后针对不同的n值重复进行计算并比拟所得的结果。
设计要求写出相应的Matlab程序,执行程序得出的结果。
通过结果比照分析并进行理论分析。
工作量四周的时间掌握Hilbert矩阵的性质、Hilbert矩阵方程组的特点及其相关的求解方法,研究古典迭代法中的Jacobi 迭代法和SOR迭代法并用这两种方法求解Hilbert矩阵方程组,分析这两种方法对解Hilbert矩阵方程组的效果如何;熟悉使用Matlab软件,上机求解给定题目。
工作计划第一周:查阅资料,根本了解Jacobi迭代法和SOR迭代法的根本原理、解题步骤等,主要对Jacobi迭代法进行分析;第二周至第三周:根据其他组员编写的Jacobi迭代法的Matlab程序进行具体题目的计算并及其他同学负责的局部进行综合分析;第四周:整理和撰写报告,进行辩论。
参考资料[1]谢进,李大美. MATLAB及计算方法实验[M]. 武汉大学出版社,2016.[2]周品,何正风.MATLAB数值分析[M]. 机械工业出版社,2016.1[3]林雪松,周婧,林德新.MATLAB7.0应用集锦[M]. 机械工业出版社,2006[4](美)John H.Mathews,Kurtis D.Frink数值方法[M].电子工业出版社,2005[5]李庆扬,王能超,易大义.数值分析[M].华中科技大学出版社,2006.1指导教师签字基层教学单位主任签字说明:此表一式四份,学生、指导教师、基层教学单位、系部各一份。
数值分析-雅克比迭代法
数值分析-雅克⽐迭代法雅克⽐迭代法雅克⽐迭代法就是众多迭代法中⽐较早且较简单的⼀种,其命名也是为纪念普鲁⼠著名数学家雅可⽐。
雅克⽐迭代法的计算公式简单,每迭代⼀次只需计算⼀次矩阵和向量的乘法,且计算过程中原始矩阵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); }。
8.3 迭代法收敛定理
5 7
其系数矩阵 A=
9 3
4 10
严格对角占优,故雅
可比迭代
xx1(2(kk11))
(5 4x2(k) ) / 9 0.7 0.3x1(k)
收敛
7
赛德尔迭代
xx2(1(kk11))
(5 4x2(k) ) / 9 0.7 0.3x1(k1)
A A
4
由于定理8.3揭示了第 k 次迭代的误差向量 与相邻两次迭代近似解之差的关系。
所以在设计迭代算法时可用相邻两次迭代近 似解之差 X (k1) X (k) 作为误差的估计值, 当误差估计值小于允许误差界时,便可以停 止迭代计算并输出数据结果。
5
定理8.2 若方程组AX = b 中,系数矩阵A是对
收敛
8
定理 若方程组AX = b 中,系数矩阵A是对称 正定阵,则对任意的初始向量X (0),赛德尔迭代法 是收敛的。
推论 A对称正定时,雅可比迭代法收敛的充要条 件是2D-A也对称正定,SOR迭代法收敛的充要条 件是 0 2
9
将迭代公式(8-26)改为
x (k 1) 1
§ 8.3 迭代法收敛定理
8.3.1 迭代法的收敛定理
雅可比迭代法 X (k+1) = BJ X(k)+ fJ 赛德尔迭代法 X (k+1) = BS X(k)+ fS 由此可知迭代法是通过变化等价方程组后, 建立迭代格式X (k+1) = B X(k)+ f ,其中B称为迭 代 矩阵。
10
当1<ω<2 时该迭代公式称为超松弛迭代法 超松弛迭代公式收敛的条件与赛德尔迭代收敛 条件相同。 很多数值计算的实例表明,超松弛迭代的收敛 速度比赛德尔迭代速度快。 在计算中对松弛因子的选取不好掌握。
雅克比高斯赛德尔迭代法
第八节 雅可比迭代法与高斯—塞德尔迭代法一 雅可比迭代法设线性方程组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,定理得证.。
矩阵的逆运算迭代
求解矩阵的逆运算是数值线性代数中的基本问题。
一般地,如果一个矩阵是可逆的,我们可以用多种迭代算法求解其逆矩阵,如高斯-赛德尔迭代、雅可比迭代、超松弛迭代等。
这些迭代法在每一次迭代过程中都会对矩阵进行一系列操作,例如按行或按列进行迭代计算、填充对角线元素等,以达到逐渐逼近矩阵逆的过程。
下面我将简单介绍一下雅可比迭代法的步骤:
1. 首先对矩阵进行L对角线填充。
2. 分别对L和U求逆矩阵,得到L_inv和U_inv。
3. A_inv = U_inv * L_inv。
请注意,这只是求解矩阵逆的一种方法,并且这种方法可能不适用于所有情况。
在实际应用中,选择哪种方法取决于矩阵的性质以及问题的具体要求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
古典雅克比算法一、实验目的1、学习和掌握古典的jacobi 算法。
2、 运用古典jacobi 算法进行计算。
二、方法原理在正交相似变换下,矩阵元素的平方和保持不变,寻找相似变换,是对称矩阵A 经过变换之后所得矩阵的非对角线元素的平方和减少,对角线元素的平方和增大,且保持对称性不变,不断的施行这种正交变换,最终是非对角元素的平方和任意的接近与零,对角线元素平方的取极大值。
三、算法描述: step1:1)1(---=k qq k pp a a y 1)1()1(2*)sgn(----=kpq k qq k pp a a a x step 2:)/1(2/1cos 222y x y ++=θ θθcos /1*/*2/1sin 22y x x += step 3: 由于k A 得对称性,实际计算时只需对k A 的上三角元素进行即可。
()()(1)(1)cos sin k k k k ip pi ip iq a a a a θθ--==+()()(1)(1)sin cos k k k k iq qi ip iq a a a a θθ--==-+()()(1)(1)(1)22()sin cos (cos sin )k k k k k pq qp qq pp pq a a a a a θθθθ---==-+-()(1)2(1)(1)2cos 2sin cos sin k k k k pp pp pq qq a a a a θθθθ---=++()(1)2(1)(1)2sin 2sin cos cos k k k k qq pp pq qq a a a a θθθθ---=-+四、程序原代码如下:头文件:#include<iostream.h>#include<math.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();Matrix& operator =(Matrix &A);void max(int a[]);void get_cos_sin(double b[],int a[]);void Jacobi(Matrix &X,double b[],int a[]);bool BeZero(int a[]);double SUM();};CPP文件:#include<iostream.h>#include<malloc.h>#include<iomanip.h>#include"Jacobi.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);}}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;}Matrix& Matrix::operator =(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;return *this;}void Matrix::print()////////////////////////打印函数{for(int i=0;i<M;++i){for(int j=0;j<N;++j){cout<<setw(15)<<setprecision(5)<<ar[i][j];}cout<<endl;}}void Matrix::Init()/////////////////////////初始化函数{for(int i=0;i<M;++i){cout<<"input the data of "<<i+1<<" line"<<endl;for(int j=0;j<N;++j){cin>>ar[i][j];}}}void Matrix::max(int a[])////////////////按模最大{int i=0,j=0;Datatype max=0;for(i=0;i<M;++i){for(j=0;j<N;++j){if(i==j){continue;}if(max<ar[i][j]){a[0]=i;a[1]=j;max=ar[i][j];}}}}bool Matrix::BeZero(int a[])/////////////若分母为零{if(ar[a[0]][a[0]]==ar[a[1]][a[1]]){return true;//取值45度}else{return false;//按公式计算}}void Matrix::get_cos_sin(double b[],int a[])/////计算cos sin {double y=fabs(ar[a[0]][a[0]]-ar[a[1]][a[1]]);double x=0;if(ar[a[0]][a[0]]-ar[a[1]][a[1]]>0){x=2*ar[a[0]][a[1]];}else{x=-2*ar[a[0]][a[1]];}b[0]=sqrt((y/sqrt(pow(x,2)+pow(y,2))+1)/2);b[1]=x/(2*sqrt(pow(x,2)+pow(y,2))*b[0]);}void Matrix::Jacobi(Matrix &X,double b[],int a[])/////////进行矩阵迭代得到新矩阵X{X=*(this);for(int i=0;i<M;++i){if(i==a[0]||i==a[1]){continue;}else{X.ar[a[0]][i]=X.ar[i][a[0]]=ar[i][a[0]]*b[0]+ar[i][a[1]]*b[1];X.ar[a[1]][i]=X.ar[i][a[1]]=ar[i][a[1]]*b[0]-ar[i][a[0]]*b[1];}}X.ar[a[0]][a[0]]=ar[a[0]][a[0]]*pow(b[0],2)+2*ar[a[0]][a[1]]*b[0]*b[1]+ar[a[1]][ a[1]]*pow(b[1],2);X.ar[a[1]][a[1]]=ar[a[0]][a[0]]*pow(b[1],2)-2*ar[a[0]][a[1]]*b[0]*b[1]+ar[a[1]][ a[1]]*pow(b[0],2);X.ar[a[0]][a[1]]=X.ar[a[1]][a[0]]=(ar[a[1]][a[1]]-ar[a[0]][a[0]])*b[0]*b[1]+ar[a[0 ]][a[1]]*(pow(b[0],2)-pow(b[1],2));}double Matrix::SUM()/////////////////迭代结束判断{double sum=0;for(int i=0;i<M;++i){for(int j=0;j<N;++j){if(i==j){continue;}else{sum+=pow(ar[i][j],2);}}}return sum;}主程序:#include"Jacobi.h"#define E pow(10,-3)void main(){int row;cout<<"请输入阶数"<<endl;cin>>row;int a[2]={0};double b[2]={0};Matrix A(row,row),X(row,row);cout<<"请输入系数矩阵"<<endl;A.Init();//系数int i=1;while(1){A.max(a);if(A.BeZero(a)){b[0]=b[1]=sqrt(2)/2;}else{A.get_cos_sin(b,a);}A.Jacobi(X,b,a);cout<<"第"<<i<<"次迭代结束后矩阵为:"<<endl;X.print();cout<<endl;if(A.SUM()<E){break;}A=X;++i;} } 五、数值计算:102021211A ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦六、参考文献:[1]刑志栋,矩阵数值分析, 陕西: 陕西科学技术出版社, 2005。
[2]谭浩强,C 语言程序设计,北京:清华大学出版社,2005。
[3]翁惠玉,C 语言程序设计思想与方法,北京:人民邮电出版社,2008.。