线性方程组的迭代解法(Matlab)
matlab迭代法解线性方程组
function x=ak(a,b)%a为系数矩阵,b为初始向量(默认为零向量)
%e为精度(默认为1e-6),N为最大迭代次数(默认为100),x为返回解向量
n=length(b);
N=100;
e=1e-6;
x0=zeros(n,1)
%生成一n*1阶零矩阵
x=x0;
x0=x+2*e;
k=0;
d=diag(diag(a));
%生成一个除对角线上元素不为零外其他元素皆为零的矩阵d,且d对角线上的元素为矩阵a 对角线上的元素
l=-tril(a,-1);
%生成一个下三角矩阵
u=-triu(a,1);
%生成一个上三角矩阵
while norm(x0-x,inf)>e & k<N %norm(x0-x,inf)为矩阵(x0-x)的无穷范数
k=k+1;
x0=x;
x=inv(d)*(l+u)*x+inv(d)*b;%雅可比迭代公式k
disp(x')
end
if k==N warning('已达最大迭代次数'); end
function X=BDD(f,x0,TOL)
%X用来存储迭代过程所有的根;
%f是符合不动点迭代要求的迭代方程;%x0设定的迭代初值;
%TOL允许的误差值;
x=feval(f,x0);
n=1;
X(:,n)=x;
while abs(x-x0)>TOL
x0=x;
x=feval(f,x0);
n=n+1;
X(:,n)=x;
end。
matlab 解线性方程组的迭代法
小结
➢ 线性方程组求根方法的几何意义
➢ 线性方程组求根函数的理解与应用
设线性代数方程组为
展开为
若对角元素 逐一变量分离得方程组
即
此即为迭代公式
简单迭代解法的过程如下:
1 设定一组初值 2 第一次迭代:
得到
第k次迭代 第i个变量
3 第二次迭代: 得到
4 同样做法,得到第k+1次迭代:
迭代次数k的取值与精度要求有关,按下式判断:
若满足则停止迭代 为了便于编程,迭代公式可改写为:
matlab 解线性方程组的 迭代法
2020年4月22日星期三
第十讲 解线性方程组的迭代解法
内容提要
引言 简单迭代法 赛得尔迭代法 迭代解法的收敛性 MATLAB的线性方程组求解函数2 小结
1、引言
迭代解法的基本思想
根据给定方程组,设计出一个迭代公式,构造一 数组的序列 ,代入迭代公式,计算出 ,再代 入迭代公式,经过k次迭代运算后得到 ,若 收敛于某一极限数组xi,则xi就是方程组的近似解。
while(norm(x-x1)>eps) x1=x; x=(I-A)*x1+b; n = n + 1; if(n>=M) disp('Warning: 迭代次数太多,现
在退出!'); return;
end end
例:求解方程组
clear all; A =[ 1.0170 -0.0092 0.0095;
线性方程组的迭代解法及收敛分析
河南科技学院2015届本科毕业论文论文题目:线性方程组的三种迭代解法及收敛分析学生姓名:韦成州所在院系:数学科学学院所学专业:信息与计算科学导师姓名:李巧萍完成时间:2015年5月20日线性方程组的三种迭代解法及收敛分析摘要对于线性方程组的迭代解法,本文重点讨论雅可比迭代法,高斯塞德尔迭代法和超松弛迭代法三种迭代解法。
主要讨论内容有:首先,写出三种迭代解法的基本思想,基本算法及收敛条件;其次,针对这三种迭代解法进行举例分析,通过MATLAB程序,求得三种迭代法各自的迭代次数、每次迭代的结果及误差;最后,在满足设定精度的情况下,对每个迭代方法所用的迭代次数进行通过分析比较,得出了在选择适当的松弛因子后,三种迭代法的收敛速度:超松弛迭代法>高斯塞德尔迭代法>雅可比迭代法,对于方程组Ax b,迭代法的收敛性只与系数矩阵A有关,而与右端项b无关。
同时,本文又对算法设计,收敛速度的判定等问题提出了改进意见。
关键词:MATLAB,数学模型,迭代解法,收敛,线性方程组Three kinds of solutions of systems of linear equations iterative methodand convergence analysisAbstractFor iterative solution of linear equations, this article focuses on the Jacobi iteration method, gauss seidel iteration method and overrelaxation iteration method of three kinds of iterative method.Main discussion: first of all, write down three iterative method, the basic idea of the basic algorithm and convergence condition;Secondly, in view of the three kinds of iterative solution methods for analysis, through the MATLAB program, get three iterative method respective number of iterations, the results of each iteration and error;Finally, in the case of meet the setting precision, for each iteration method to carry through analysis and comparison, the number of iterations used in selecting the appropriate relaxation factor is obtained, the convergence rate of the three types of iterative method: overrelaxation iteration method, gauss seidel iteration method, Jacobi iteration method for the system of equations, the convergence of iterative method is only related to the coefficient matrix, and has nothing to do with the right items.And at the same time, this paper, the algorithm design, and the convergence rate of decision problems, such as improvement opinions are put forward.Keywords:MATLAB, Mathematical model, Iterative method, Convergence System of linear equations目录1引言 (1)2迭代法的基本思想 (1)3三种迭代法的思想,算法及收敛条件 (1)3.1 雅可比迭代法 (1)3.1.1 雅可比迭代法的思想与算法 (1)3.1.2 雅格比迭代法的收敛条件 (2)3.2 高斯塞德尔迭代法 (3)3.2.1 高斯塞德尔迭代法的思想和算法 (3)3.2.2 高斯塞德尔迭代法的收敛条件 (4)3.3超松弛迭代法 (4)3.3.1 松弛法思想和算法 (4)3.3.2 超松弛迭代法的收敛条件 (5)4数学模型 (5)4.1雅可比迭代法求解 (6)4.2高斯赛德尔方法求解 (9)4.3超松弛迭代法求解 (12)5小结 (16)致谢 (18)参考文献 (19)1引言在实际生活中,存在着大量求解线性方程组的问题。
matlab迭代法求解方程
matlab迭代法求解方程在MATLAB中,可以使用迭代法来求解方程。
迭代法是一种通过反复迭代逼近方程解的方法。
下面我将从多个角度全面回答你关于MATLAB迭代法求解方程的问题。
首先,迭代法的基本思想是通过不断迭代一个初始猜测值,使得迭代序列逐渐趋近方程的解。
在MATLAB中,可以使用循环结构来实现迭代过程。
一般来说,迭代法需要满足收敛条件,即迭代序列能够收敛到方程的解。
常见的迭代法包括简单迭代法、牛顿迭代法和割线法等。
其次,我将介绍一种常见的迭代法——简单迭代法(也称为不动点迭代法)。
简单迭代法的基本思想是将方程转化为等价的不动点形式,即将方程f(x) = 0转化为x = g(x)的形式。
然后,通过迭代序列x_{n+1} = g(x_n)来逼近方程的解。
在MATLAB中,可以通过编写一个循环结构来实现简单迭代法。
下面是一个使用简单迭代法求解方程的MATLAB代码示例:matlab.function x = simple_iteration(g, x0, tol, max_iter)。
% 简单迭代法求解方程。
% 输入,g为迭代函数,x0为初始猜测值,tol为容差,max_iter为最大迭代次数。
% 输出,x为方程的解。
x = x0; % 初始猜测值。
iter = 0; % 迭代次数。
while abs(g(x) x) > tol && iter < max_iter.x = g(x); % 迭代计算下一个近似解。
iter = iter + 1; % 迭代次数加1。
end.if iter == max_iter.disp('迭代次数超过最大迭代次数,未找到解');else.disp(['迭代次数为,', num2str(iter)]);disp(['方程的解为,', num2str(x)]);end.end.在上述代码中,g为迭代函数,x0为初始猜测值,tol为容差,max_iter为最大迭代次数。
matlab中的迭代算法
matlab中的迭代算法迭代算法在matlab中的应用迭代算法是一种通过多次重复计算来逼近解的方法,它在matlab中得到了广泛的应用。
在本文中,我们将介绍一些常见的迭代算法,并探讨它们在matlab中的实现和应用。
1. 二分法二分法是一种简单而直观的迭代算法,它通过将问题的解空间一分为二,并根据中间点的取值来确定解所在的子空间。
在matlab中,可以使用while循环来实现二分法。
首先,需要指定解空间的上下界,然后通过计算中间点的值来判断解所在的子空间,并更新解空间的上下界。
重复这个过程,直到解的精度满足要求为止。
2. 牛顿迭代法牛顿迭代法是一种用于求解方程的迭代算法,它利用函数的局部线性近似来逼近方程的解。
在matlab中,可以使用while循环来实现牛顿迭代法。
首先,需要给定一个初始点,然后根据函数的一阶和二阶导数来计算下一个点的值。
重复这个过程,直到解的精度满足要求为止。
3. 高斯-赛德尔迭代法高斯-赛德尔迭代法是一种用于求解线性方程组的迭代算法,它通过不断更新近似解来逼近方程的解。
在matlab中,可以使用while循环和矩阵运算来实现高斯-赛德尔迭代法。
首先,需要给定一个初始解向量,然后根据方程组的系数矩阵和常数向量来计算下一个解向量的值。
重复这个过程,直到解的精度满足要求为止。
4. 迭代法求特征值迭代法也可以用于求解矩阵的特征值和特征向量。
在matlab中,可以使用while循环和矩阵运算来实现迭代法求特征值。
首先,需要给定一个初始特征向量,然后根据矩阵的幂来计算下一个特征向量的值。
重复这个过程,直到特征向量的变化小于某个阈值为止。
5. 迭代法求最优化问题除了求解方程和矩阵相关的问题,迭代算法还可以用于求解最优化问题。
在matlab中,可以使用while循环和梯度计算来实现迭代法求最优化问题。
首先,需要给定一个初始解向量,然后根据目标函数的梯度来计算下一个解向量的值。
重复这个过程,直到解的精度满足要求为止。
迭代解法的matlab实现
解线性方程组b AX =的迭代法是从初始解出发,根据设计好的步骤用逐次求出的近似解逼近精确解.在第三章中介绍的解线性方程组的直接方法一般适合于A 为低阶稠密矩阵(指n 不大且元多为非零)的情况,而在工程技术和科学计算中常会遇到大型稀疏矩阵(指n 很大且零元较多)的方程组,迭代法在计算和存贮两方面都适合后一种情况.由于迭代法是通过逐次迭代来逼近方程组的解,所以收敛性和收敛速度是构造迭代法时应该注意的问题.另外,因为不同的系数矩阵具有不同的性态,所以大多数迭代方法都具有一定的适用范围.有时,某种方法对于一类方程组迭代收敛,而对另一类方程组迭代时就发散.因此,我们应该学会针对具有不同性质的线性方程组构造不同的迭代.4.1 迭代法和敛散性及其MATLAB 程序4.1.2 迭代法敛散性的判别及其MATLAB 程序根据定理4.1和谱半径定义,现提供一个名为pddpb.m 的M 文件,用于判别迭代公用谱半径判别迭代法产生的迭代序列的敛散性的MATLAB 主程序 输入的量:线性方程组b AX =的迭代公式(4.7)中的B ; 输出的量:矩阵B 的所有特征值和谱半径mH )(B ρ=及其有关迭代法产生的迭代序列的敛散性的相关信息.function H=ddpbj(B)H=eig(B);mH=norm(H,inf); if mH>=1disp('请注意:因为谱半径不小于1,所以迭代序列发散,谱半径mH 和B 的所有的特征值H 如下:')elsedisp('请注意:因为谱半径小于1,所以迭代序列收敛,谱半径mH 和B 的所有的特征值H 如下:')end mH4.1.3 与迭代法有关的MATLAB 命令(一) 提取(产生)对角矩阵和特征值可以用表4–1的MATLAB 命令提取对角矩阵和特征值.MATLAB 命令 功 能DX=diag(X) 若输入向量X ,则输出DX 是以X 为对角元的对角矩阵; 若输入矩阵X ,则输出DX 是以X 的对角元构成的向量;DX=diag(diag(X))输入矩阵X ,输出DX 是以X 的对角元构成的对角矩阵,可用于迭代法中从A 中提取D .lm=eig(A) 输入矩阵A ,输出lm 是A 的所有特征值.(二) 提取(产生)上(下)三角形矩阵第四章 解线性方程组的迭代法可以用表4–2的MATLAB 命令提取矩阵的上三角形矩阵和下三角形矩阵.MATLAB 命令 功 能U=triu(A) 输入矩阵A ,输出U 是A 的上三角形矩阵. L=tril(A) 输入矩阵A ,输出L 是A 的下三角形矩阵.U=triu(A,1) 输入矩阵A ,输出U 是A 的上三角形矩阵,但对角元为0,可用于迭代法中从A 中提取U .L=tril(A,-1)输入矩阵A ,输出L 是A 的下三角形矩阵,但对角元为0,可用于迭代法中从A 中提取L .(三)稀疏矩阵的处理对稀疏矩阵在存贮和运算上的特殊处理,是MA TLAB 进行大规模科学计算时的特点和优势之一.可以用表4–3的MATLAB 命令,输入稀疏矩阵的非零元(零元不必输入),即可进行运算.MATLAB 命令 功 能ZA=sparse(r,c,v,m,n)表示在第r 行、第c 列输入数值v ,矩阵共m 行n 列,输出ZA ,给出 (r , c ) 及v 为一稀疏矩阵.MA=full(ZA) 输入稀疏矩阵ZA ,输出为满矩阵MA (包含零元)4.2 雅可比(Jacobi )迭代及其MATLAB 程序4.2.2 雅可比迭代的收敛性及其MATLAB 程序判别雅可比迭代收敛性的MATLAB 主程序输入的量:线性方程组b AX =的系数矩阵A ; 输出的量:系数矩阵=A ()nn ija ⨯的kk nki j kja a a -=∑≠=1 ),,2,1(n k =的值和有关雅可比迭代收敛性的相关信息.[n m]=size(A); for j=1:ma(j)=sum(abs(A(:,j)))-2*(abs(A(j,j))); end for i=1:n if a(i)>=0disp('请注意:系数矩阵A 不是严格对角占优的,此雅可比迭代不一定收敛')return end end if a(i)<0disp('请注意:系数矩阵A 是严格对角占优的,此方程组有唯一解,且雅可比迭代收敛 ') end例4.2.2 用判别雅可比迭代收敛性的MATLAB 主程序,判别由下列方程组的雅可比迭代产生的序列是否收敛?(1)⎪⎩⎪⎨⎧=+--=-+-=--;2.45,3.8210,2.7210321321321x x x x x x x x x (2)⎪⎩⎪⎨⎧=+--=-+-=--.2.45.0,3.8210,2.7210321321321x x x x x x x x x 解 (1)首先保存名为jspb.m 的M 文件,然后在MATLAB 工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 5];a=jspb(A)运行后输出结果请注意:系数矩阵A 是严格对角占优的,此方程组有唯一解,且雅可比迭代收敛a =-8 -8 -1(2)在MATLAB 工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 0.5];a=jspb(A)运行后输出结果请注意:系数矩阵A 不是严格对角占优的,此雅可比迭代不一定收敛 a =-8.0000e+000 -8.0000e+000 3.5000e+0004.2.3 雅可比迭代的两种MATLAB 程序利用MATLAB 程序和雅可比迭代解线性方程组b AX =的常用的方法有两种,一种方法是根据雅可比迭代公式(4.11)、(4.12)式、定理4.3和公式(4.14)编写一个名为jacdd.m 的M 文件并保存,然后在MATLAB 工作窗口输入对应的命令,执行此文件;另一种方法是根据雅可比迭代的定义,利用提取对角矩阵和上、下三角矩阵的MATLAB 程序解线性方程组b AX =.下面我们分别介绍这两种方法.用雅可比迭代解线性方程组b AX =的MATLAB 主程序输入的量:线性方程组b AX =的系数矩阵A 和b , 初始向量X 0,范数的名称P = 1, 2, inf 或 'fro .',近似解X 的误差(精度)wucha 和迭代的最大次数max1;输出的量:系数矩阵=A ()nn ija ⨯的kk nki j kja a a -=∑≠=1 ),,2,1(n k =的值和有关雅可比迭代收敛性的相关信息及其b AX =的精确解jX 和近似解X .的M 文件如下:function X=jacdd(A,b,X0,P,wucha,max1) [n m]=size(A); for j=1:ma(j)=sum(abs(A(:,j)))-2*(abs(A(j,j))); end for i=1:n if a(i)>=0disp('请注意:系数矩阵A 不是严格对角占优的,此雅可比迭代不一定收敛')return end end if a(i)<0disp('请注意:系数矩阵A 是严格对角占优的,此方程组有唯一解,且雅可比迭代收敛 ') endfor k=1:max1kfor j=1:mX(j)=(b(j)-A(j,[1:j-1,j+1:m])*X0([1: j-1,j+1:m]))/A(j,j);endX,djwcX=norm(X'-X0,P); xdwcX=djwcX/(norm(X',P)+eps); X0=X';X1=A\b;if (djwcX<wucha)&(xdwcX<wucha)disp('请注意:雅可比迭代收敛,此方程组的精确解jX和近似解X如下:')returnendendif (djwcX>wucha)&(xdwcX>wucha)disp('请注意:雅可比迭代次数已经超过最大迭代次数max1 ')enda,X=X;jX=X1',例4.2.3用 范数和判别雅可比迭代的MATLAB主程序解例4.2.2 中的方程组,解的精度为0.001,分别取最大迭代次数max1=100,5,初始向量X0=(0 0 0)T,并比较它们的收敛速度.解(1)取最大迭代次数max1=100时.①首先保存名为jacdd.m的M文件,然后在MATLAB工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 5]; b=[7.2;8.3;4.2];X0=[0 0 0]'; X=jacdd(A,b,X0,inf,0.001,100)运行后输出结果请注意:系数矩阵A是严格对角占优的,此方程组有唯一解,且雅可比迭代收敛请注意:雅可比迭代收敛,此方程组的精确解jX和近似解X如下:a =-8 -8 -1jX =1.1000 1.2000 1.3000X =1.0994 1.1994 1.2993②在MATLAB工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 0.5]; b=[7.2;8.3;4.2]; X0=[0 0 0]';X=jacdd(A,b,X0,inf, 0.001,100)运行后输出结果请注意:系数矩阵A不是严格对角占优的,此雅可比迭代不一定收敛请注意:雅可比迭代收敛,此方程组的精确解jX和近似解X如下:a =-8.0000 -8.0000 3.5000jX =24.5000 24.6000 106.6000X =24.0738 24.1738 104.7974(2)取最大迭代次数max1=5时,①在MATLAB工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 5];b=[7.2;8.3;4.2]; X0=[0 0 0]'; X=jacdd(A,b,X0,inf,0.001,5)运行后输出结果请注意:系数矩阵A是严格对角占优的,此方程组有唯一解,雅可比迭代收敛请注意:雅可比迭代次数已经超过最大迭代次数max1a =-8 -8 -1jX =1.1000 1.2000 1.3000 X =1.0951 1.1951 1.2941②在MATLAB 工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 0.5]; b=[7.2;8.3;4.2]; X0=[0 0 0]'; X=jacdd(A,b,X0,inf, 0.001,5)运行后输出结果请注意:系数矩阵A 不是严格对角占优的,此雅可比迭代不一定收敛 请注意:雅可比迭代次数已经超过最大迭代次数max1 a =-8.0000 -8.0000 3.5000 jX =24.5000 24.6000 106.6000 X =5.5490 5.6490 27.6553由(1)和(2)可见,如果系数矩阵A 是严格对角占优的,则雅可比迭代收敛的速度快;如果系数矩阵A 不是严格对角占优的,则雅可比迭代收敛的速度慢.因此,kk nki j kj a a a -=∑≠=1 ),,2,1(n k =的值越小,雅可比迭代收敛的速度越快.(二)利用雅可比迭代定义编写的解线性方程组的MATLAB 程序利用雅可比迭代定义编写解线性方程组(4.5)的MATLAB 程序的一般步骤 步骤1 将线性方程组(4.5)的系数矩阵A 分解为U L D A --=,其中=D ⎪⎪⎪⎪⎪⎭⎫⎝⎛=nn nn a a a a a a diag22112211),,(, -=L⎪⎪⎪⎪⎪⎭⎫⎝⎛-0001,2121n n n n a a aa -=U ,⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-000,1112nn n a a a . 在MATLAB 工作窗口输入程序>> A=[a11 a12 …a1n; a21 a22 …a2n;…; an1 an2 …ann;]; D=diag(A) U=triu(A,1), L=tril(A,-1)运行后即可输出U L D A ,,的; 步骤2 若对角矩阵D 非奇异(即),,1,0n i a ii =≠,则(4.5)化为 b D X U L D X 11)(--++=.若记b D f U L D B 1111),(--=+=.则方程组的迭代形式可写作1)(1)1(f X B Xk k +=+ )2,1,0( =k 可以利用下面的MATLAB 程序完成>>dD=det(D); if dD==0disp('请注意:因为对角矩阵D 奇异,所以此方程组无解.') elsedisp('请注意:因为对角矩阵D 非奇异,所以此方程组有解.') iD=inv(D); B1=iD*(L+U);f1=iD*b;for k=1:max1X= B1*X0+ f1; X0=X; djwcX=norm(X-X0,P);xdwcX=djwcX/(norm(X,P)+eps); X1=A\b;if (djwcX<wucha)&(xdwcX<wucha)disp('请注意:雅可比迭代收敛,此方程组的精确解jX和近似解X如下:')returnendendif (djwcX>wucha)|(xdwcX>wucha)disp('请注意:雅可比迭代次数已经超过最大迭代次数max1 ')endenda,X=X;jX=X1',4.3 高斯-塞德尔(Gauss-Seidel)迭代及其MATLAB程序4.3.3 高斯-塞德尔迭代两种MATLAB程序AX=的常用方法有两种,一利用MATLAB程序和高斯-塞德尔迭代解线性方程组b种方法是根据高斯-塞德尔迭代公式(4.16)、(4.17)、定理4.3和公式(4.14)编写一个名为gsdd.m的M文件并保存,然后在MATLAB工作窗口输入对应的命令,执行此文件;另一种方法是根据高斯-塞德尔迭代的定义,利用提取对角矩阵和上、下三角矩阵的AX=.下面我们分别介绍这两种方法.MATLAB程序解线性方程组b(一)高斯-塞德尔迭代定义的MATLAB程序1AX=的MATLAB主程序1 用高斯-塞德尔迭代定义解线性方程组bAX=的系数矩阵A和b, 初始向量X0,范数的名称P = 1, 2, 输入的量:线性方程组binf, 或'fro.',近似解X的误差(精度)wucha和迭代的最大次数max1.A()n n ij a⨯的对角元构成的对角矩阵D、A的上三角形矩阵输出的量:以系数矩阵=U,但对角元为0、A的下三角形矩阵L,但对角元为0和有关高斯-塞德尔迭代收敛性的AX=的精确解jX和近似解X.相关信息及其bD=diag(diag(A));U=-triu(A,1);L=-tril(A,-1); dD=det(D);if dD==0disp('请注意:因为对角矩阵D奇异,所以此方程组无解.')elsedisp('请注意:因为对角矩阵D非奇异,所以此方程组有解.')iD=inv(D-L); B2=iD*U;f2=iD*b;jX=A\b; X=X0; [n m]=size(A);for k=1:max1X1= B2*X+f2; djwcX=norm(X1-X,P);xdwcX=djwcX/(norm(X,P)+eps);if (djwcX<wucha)|(xdwcX<wucha)returnelsek,X1',k=k+1;X=X1;endendif (djwcX<wucha)|(xdwcX<wucha)disp('请注意:高斯-塞德尔迭代收敛,此A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下:')elsedisp('请注意:高斯-塞德尔迭代发散,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jX和迭代向量X如下:')X=X';jX=jX' end endX=X';D,U,L,jX=jX'例4.3.3 用高斯-塞德尔迭代定义的MATLAB 主程序解下列线性方程组,取初始值)0,0,0(),,()0(3)0(2)0(1=x x x ,要求当3)()1(10-∞+<-k k x x 时,迭代终止.(1)⎪⎩⎪⎨⎧=+--=-+-=--.2.45.0,3.8210,2.7210321321321x x x x x x x x x (2)⎪⎪⎩⎪⎪⎨⎧=++--=+-+=-+-=+-+.2132127,11613514,22382,575434321432143214321x x x x x x x x x x x x x x x x解 (1)首先保存名为gsdddy.m 的M 文件,然后在MATLAB 工作窗口输入程序>> A=[10 -1 -2;-1 10 -2;-1 -1 0.5]; b=[7.2;8.3;4.2]; X0=[0 0 0]'; X=gsdddy(A,b,X0,inf, 0.001,100)运行后输出结果请注意:因为对角矩阵D 非奇异,所以此方程组有解.请注意:高斯-塞德尔迭代收敛,此A 的分解矩阵D,U,L 和方程组的精确解jX 和近似解X 如下:此近似解与例4.2.3中的(1)中②的解X =(24.073 8, 24.173 8, 104.797 4)T比较,在相同的条件下, 高斯-塞德尔迭代比雅可比迭代得到的近似解的精度更高.(2)在MATLAB 工作窗口输入程序>> A=[3 4 -5 7;2 -8 3 -2;4 51 -13 16;7 -2 21 3];b=[5;2;-1;21]; X0=[0 0 0 0]';X=gsdddy(A,b,X0,inf,0.001,100)运行后输出结果请注意:因为对角矩阵D 非奇异,所以此方程组有解.请注意:高斯-塞德尔迭代发散,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jX 和迭代向量X 如下:jX =0.1821 -0.2571 0.7286 1.3036X = 1.0e+142 *0.2883 0.1062 0.3622 -3.1374(二) 高斯-塞德尔迭代公式的MATLAB 程序2 根据高斯-塞德尔迭代公式(4.16)、(4.17)、定理4.3和公式(4.14),现提供名为用高斯-塞德尔迭代解线性方程组b AX =的MATLAB 主程序2 输入的量:线性方程组b AX =的系数矩阵A 和b , 初始向量X 0,范数的名称P = 1, 2, inf, 或 'fro.',近似解X 的误差(精度)wucha 和迭代的最大次数max1.输出的量:系数矩阵=A ()nn ija ⨯的kk nki j kja a a -=∑≠=1 ),,2,1(n k =的值和有关D =10.0000 0 0 0 10.0000 0 0 0 0.5000 U =0 1 2 0 0 2 0 0 0L =0 0 0 1 0 0 1 1 0 jX =24.5000 24.6000 106.6000 X =24.4996 24.5996 106.5984AX=的精确解jX和近似解X.高斯-塞德尔迭代收敛性的相关信息及其b[n m]=size(A);for j=1:ma(j)=sum(abs(A(:,j)))-2*(abs(A(j,j)));endfor i=1:nif a(i)>=0disp('请注意:系数矩阵A不是严格对角占优的,此高斯-塞德尔迭代不一定收敛')returnendendif a(i)<0disp('请注意:系数矩阵A是严格对角占优的,此方程组有唯一解,且高斯-塞德尔迭代收敛')endfor k=1:max1for j=1:mif j==1X(1)=(b(1)-A(1,2:m)*X0(2:m))/A(1,1)endif j==mX(m)=(b(m)-A(m,1:M1)*X(1:M1)')/A(m,m);endfor j=2:M1X(j)=(b(j)-A(j,1:j-1)*X(1:j-1) -A(j,j+1:m)*X(j+1:m))/A(j,j);endenddjwcX=norm(X'-X0,P);xdwcX=djwcX/(norm(X',P)+eps); X0=X';X1=A\b;if (djwcX<wucha)|(xdwcX<wucha)disp('请注意:高斯-塞德尔迭代收敛,此方程组的精确解jX和近似解X 如下:')returnendendif (djwcX>wucha)&(xdwcX>wucha)disp('请注意:高斯-塞德尔迭代次数已经超过最大迭代次数max1 ') enda,X=X;jX=X1',4.4 解方程组的超松弛迭代法及其MATLAB程序用雅可比迭代法和高斯-塞德尔迭代法解线性方程组时,有时收敛速度很慢,为了提高收敛速度,我们介绍超松弛迭代法,它是对高斯-塞德尔迭代的一种加速方法,适用于大型稀疏矩阵方程组的求解.4.4.2 超松弛迭代法收敛性及其MATLAB程序根据定理4.5和谱半径定义,现提供名为ddpbj.m的M文件,用于判别超松弛迭代用谱半径判别超松弛迭代法产生的迭代序列的敛散性的MATLAB主程序AX=的系数矩阵A和松弛因子om;输入的量:线性方程组b输出的量:矩阵])1([)(1D U L D B ωωωω-+-=-的所有特征值和谱半径mH)(ωρB =及其有关超松弛迭代法产生的迭代序列的敛散性的相关信息.D=diag(diag(A));U=-triu(A,1); L=-tril(A,-1); iD=inv(D-om*L); B2=iD*(om*U+(1-om)*D); H=eig(B2);mH=norm(H,inf); if mH>=1disp('请注意:因为谱半径不小于1,所以超松弛迭代序列发散,谱半径mH和B 的所有的特征值H 如下:') elsedisp('请注意:因为谱半径小于1,所以超松弛迭代序列收敛,谱半径mH和B 的所有的特征值H 如下:') end mH例4.4.1 当取ω=1.15,5时,判别用超松弛迭代法解下列方程组产生的迭代序列是否收敛?⎪⎪⎩⎪⎪⎨⎧-=+++-=---=+++=--+372364213824254321432143214321x x x x x x x x x x x x x x x x 解 (1)当取ω=1.15时,首先保存名为ddpbj.m 的M 文件,然后在MATLAB 工作窗口输入程序>> A=[5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-1 3 2 7]; H=ddpbj(A,1.15)运行后输出结果请注意:因为谱半径小于1,所以超松弛迭代序列收敛,谱半径mH 和B 的所有的特征值H 如下:mH =0.1596 H =0.1049 + 0.1203i 0.1049 - 0.1203i -0.1295 + 0.0556i -0.1295 - 0.0556i (2)当取ω=5时,然后在MATLAB 工作窗口输入程序>> H=ddpbj(A, 5)运行后输出结果请注意:因为谱半径不小于1,所以超松弛迭代序列发散,谱半径mH 和B 的所有的特征值H 如下:mH =14.1082 H =-14.1082 -2.5107 0.5996 + 2.6206i 0.5996 - 2.6206i4.4.3 超松弛迭代法的MATLAB 程序用超松弛迭代法解线性方程组b AX =的MATLAB 主程序输入的量:线性方程组b AX =的系数矩阵A 和b , 初始向量X ,范数的名称P = 1, 2, inf, 或 'fro.',松弛因子om ,近似解X 的误差(精度)wucha 和迭代的最大次数max1.输出的量:谱半径mH ,以系数矩阵A 的对角元构成的对角矩阵D 、A 的上三角形矩阵U ,但对角元为0、A 的下三角形矩阵L ,但对角元为0, 迭代次数i ,有关超松弛迭代收敛性的相关信息及其b AX =的精确解jX 和近似解X .function X=cscdd (A,b,X,om,wucha,max1)D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1); jX=A\b;[n m]=size(A);iD=inv(D-om*L); B2=iD*(om*U+(1-om)*D);H=eig(B2);mH=norm(H,inf);for k=1:max1iD=inv(D-om*L); B2=iD*(om*U+(1-om)*D);f2= om*iD*b; X1= B2*X+f2;X=X1; djwcX=norm(X1-jX,inf); xdwcX=djwcX/(norm(X,inf)+eps);if (djwcX<wucha)|(xdwcX<wucha)disp('谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX,迭代次数i如下:')mH,D,U,L,jX=jX', i=k-1,returnif i> max1disp('迭代次数已经超过最大迭代次数max1,谱半径mH,方程组的精确解jX,迭代次数i如下:')mH,D,U,L,jX=jX', i=k-1,endendendif mH>=1disp('请注意:因为谱半径不小于1,所以超松弛迭代序列发散.')disp('谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX,迭代次数i和迭代序列X如下:')i=k-1,mH,D,U,L,jX,elsedisp('因为谱半径小于1,所以超松弛迭代序列收敛,近似解X如下:') end或function X=cscdd1 (A,b,X,om,wucha,max1)D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1); jX=A\b;[n m]=size(A);iD=inv(D-om*L); B2=iD*(om*U+(1-om)*D);H=eig(B2);mH=norm(H,inf);for k=1:max1iD=inv(D-om*L); B2=iD*(om*U+(1-om)*D);f2= om*iD*b; X1= B2*X+f2; X=X1; djwcX=norm(X1-jX,inf);xdwcX=djwcX/(norm(X,inf)+eps);endif mH>=1disp('请注意:因为谱半径不小于1,所以超松弛迭代序列发散.谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX和近似解X如下:')elsedisp('请注意:因为谱半径小于1,所以超松弛迭代序列收敛.')if (djwcX<wucha)|(xdwcX<wucha)disp('谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX和近似解X 如下:')mH,D,U,L,jX=jX',elsedisp('迭代次数已经超过最大迭代次数max1,谱半径mH,方程组的精确解jX和迭代向量X如下:')mH,D,U,L,X=X1';jX=jX'returnendend例4.4.3用超松弛迭代法(取ω=1.15和5)解例4.4.1中的线性方程组.解(1)当取ω=1.15时,首先保存名为cscdd.m的M文件,然后在MATLAB工作窗口输入程序>> A=[5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-1 3 2 7];b=[4;1;6;-3];X=[0 0 0 0]';X=cscdd (A,b,X,1.15,0.001,100),运行后输出结果谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX,迭代次数i如下:mH =0.1596D =5 0 0 00 8 0 00 0 -4 00 0 0 7U =0 -1 1 20 0 -1 -30 0 0 10 0 0 0L =0 0 0 0-2 0 0 0-1 2 0 01 -3 -2 0jX =0.4491 0.2096 -1.4850 -0.0299i =3因为谱半径小于1,所以超松弛迭代序列收敛,近似解X如下:X =0.44840.2100-1.4858-0.0303(2)当取ω=5时,保存名为cscdd.m的M文件,然后在MATLAB工作窗口输入程序>> A=[5 1 -1 -2;2 8 1 3;1 -2 -4 -1;-1 3 2 7];b=[4;1;6;-3];X=[0 0 0 0]';X=cscdd (A,b,X,5,0.001,100),运行后输出结果如下:请注意:因为谱半径不小于1,所以超松弛迭代序列发散.谱半径mH,A的分解矩阵D,U,L和方程组的精确解jX,迭代次数i和迭代序列X如下:i = mH =99 14.1082D =5 0 0 00 8 0 00 0 -4 00 0 0 7U =0 -1 1 20 0 -1 -30 0 0 10 0 0 0L =0 0 0 0-2 0 0 0-1 2 0 01 -3 -2 0jX = X =1.0e+114 *0.4491 -0.31220.2096 1.0497-1.4850 -3.7174-0.0299 3.9615。
基于Matlab的解线性方程组的几种迭代法的实现及比较
基于Matlab的解线性方程组的几种迭代法的实现及比较线性方程组的解法有很多种,其中一类常用的方法是迭代法。
迭代法根据一个初值逐步逼近方程组的解,在每一次迭代中利用现有的信息产生新的近似值,并不断地修正。
下面介绍基于Matlab的三种迭代法:雅可比迭代法、高斯-赛德尔迭代法和超松弛迭代法,并进行比较。
1. 雅可比迭代法雅可比迭代法是迭代法中最简单的一种方法。
对于线性方程组Ax=b,雅可比迭代法的迭代公式为:x_{i+1}(j)=1/a_{jj}(b_j-\\sum_{k=1,k\eq j}^n a_{jk}x_i(k))其中,i表示迭代次数,j表示未知数的下标,x_i表示第i次迭代的近似解,a_{jk}表示系数矩阵A的第j行第k列元素,b_j 表示方程组的常数项第j项。
在Matlab中,可以使用以下代码实现雅可比迭代:function [x,flag]=jacobi(A,b,X0,tol,kmax)n=length(b);x=X0;for k=1:kmaxfor i=1:nx(i)=(b(i)-A(i,:)*x+A(i,i)*x(i))/A(i,i);endif norm(A*x-b)<tolflag=1;returnendendflag=0;return其中,参数A为系数矩阵,b为常数项列向量,X0为初值列向量,tol为迭代误差容许值(默认为1e-6),kmax为最大迭代次数(默认为1000)。
函数返回值x为近似解列向量,flag表示是否满足容许误差要求。
2. 高斯-赛德尔迭代法高斯-赛德尔迭代法是雅可比迭代法的改进。
其基本思想是,每次迭代时,利用已经求出的新解中的信息来更新其他未知数的值。
迭代公式为:x_{i+1}(j)=(1/a_{jj})(b_j-\\sum_{k=1}^{j-1}a_{jk}x_{i+1}(k)-\\sum_{k=j+1}^n a_{jk}x_i(k))与雅可比迭代法相比,高斯-赛德尔迭代法的每一次迭代都利用了前面已求得的近似解,因此可以更快地收敛。
迭代法求解方程matlab
迭代法求解方程的MATLAB实现1.引言迭代法是一种求解方程的常用方法,尤其适用于大规模矩阵和高维问题。
在迭代法中,我们通过不断迭代来逐步逼近方程的解。
本篇文章将介绍如何使用MATLAB实现迭代法求解方程。
2.收敛性判断在使用迭代法求解方程时,我们需要判断迭代是否收敛。
通常,我们使用以下两种方法进行收敛性判断:2.1 判断迭代公式是否收敛对于许多迭代公式,我们可以根据其结构来判断其是否收敛。
例如,Jacobi迭代法和Gauss-Seidel方法通常适用于对角占优的矩阵,而SOR方法适用于对角占优或松弛型的矩阵。
2.2 判断迭代误差是否收敛我们还可以通过判断迭代误差是否收敛来判断迭代是否收敛。
迭代误差通常定义为实际解与迭代解之间的范数。
如果迭代误差逐渐减小并趋于零,则说明迭代收敛。
3.迭代公式下面我们以Jacobi迭代法为例,介绍迭代公式的实现。
Jacobi迭代法的迭代公式如下:x{n+1}=(\frac{1}{a{ii}})(b i-A{ii,1:i-1}x1-A{ii,i+1:n}x_n)其中,A是系数矩阵,b是右侧向量,x是解向量,a_{ii}是矩阵A的主对角线元素。
4.误差计算为了判断迭代是否收敛,我们需要计算迭代误差。
通常,我们使用实际解与迭代解之间的相对误差或范数误差来衡量误差大小。
例如,相对误差可以按下式计算:||x^-x_n||_2/(||x^||_2)其中,x^*是实际解向量,x_n是第n次迭代的解向量。
5.MATLAB实现下面是一个使用MATLAB实现Jacobi迭代法的示例代码:function x = jacobi(A, b, x0, tol, max_iter)% 输入参数:系数矩阵A、右侧向量b、初始解向量x0、容许误差tol和最大迭代次数max_iter% 输出参数:方程的解向量xn = length(b); % 方程的未知数个数x = zeros(n, 1); % 初始化解向量xx(:) = x0; % 将初始解向量赋值给xerr = tol + 1; % 初始化误差大于容许误差,表示未收敛k = 0; % 初始化迭代次数k=0while err > tol && k < max_iterk = k + 1; % 更新迭代次数k=k+1for i = 1:n % 对每个未知数进行更新x(i) = (b(i) - A(i, 1:i-1)*x(1:i-1) - A(i, i+1:n)*x(i+1:n)) / A(i, i); % 更新解向量x的第i个元素x(i)的公式为x(i)=[b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x(i+1:n)]/A(i,i)endforendwhileif k < max_itererr = norm(x - x_prev, 'fro') / norm(x_prev, 'fro'); % 计算相对误差endendendfunction```。
matlab逐次超松弛迭代法
matlab逐次超松弛迭代法
逐次超松弛迭代法(Gauss-Seidel Overrelaxation Method)
是一种用于求解线性方程组的数值方法,常用于解决大型稀疏矩阵
的方程组。
在MATLAB中,可以通过编写逐次超松弛迭代法的代码来
实现该算法。
首先,让我们回顾一下逐次超松弛迭代法的基本原理。
该方法
是基于迭代的思想,通过不断迭代计算得到线性方程组的近似解。
在每一次迭代中,通过更新当前解向量的各个分量来逐步逼近方程
组的精确解。
逐次超松弛迭代法引入了松弛因子,可以加速收敛速度。
在MATLAB中,可以使用以下步骤来实现逐次超松弛迭代法:
1. 首先,编写一个函数来表示线性方程组的系数矩阵和右侧向量。
这个函数可以接受系数矩阵、右侧向量和当前解向量作为输入,并返回更新后的解向量。
2. 接下来,编写主程序来调用这个函数,并设置迭代的终止条件。
可以选择设置最大迭代次数或者设定一个收敛精度作为终止条
件。
3. 在主程序中,使用一个循环来进行迭代计算,直到满足设定的终止条件为止。
在每一次迭代中,调用上述编写的函数来更新解向量。
4. 最后,输出得到的近似解向量作为结果。
需要注意的是,逐次超松弛迭代法的收敛性与松弛因子的选择有关,通常需要根据具体的线性方程组进行调整。
总之,在MATLAB中实现逐次超松弛迭代法需要编写系数矩阵和右侧向量的函数以及主程序来进行迭代计算,并且需要注意收敛性和松弛因子的选择。
希望这个回答能够帮助你更好地理解和实现逐次超松弛迭代法。
MATLAB代码解线性方程组的迭代法
MATLAB代码解线性方程组的迭代法解线性方程组的迭代法1.rs里查森迭代法求线性方程组Ax=b的解function[x,n]=rs(A,b,x0,eps,M)if(nargin==3)eps=1.0e-6;%eps表示迭代精度M=10000;%M表示迭代步数的限制值elseif(nargin==4) M=10000;endI=eye(size(A));n=0;x=x0;tol=1;%迭代过程while(tol>eps)x=(I-A)*x0+b;n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!'); return;endend2.crs里查森参数迭代法求线性方程组Ax=b的解function[x,n]=crs(A,b,x0,w,eps,M)if(nargin==4)eps=1.0e-6;%eps表示迭代精度M=10000;%M表示迭代步数的限制值elseif(nargin==5)M=10000;endI=eye(size(A));n=0;x=x0;tol=1;%迭代过程while(tol>eps)x=(I-w*A)*x0+w*b;n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!'); return;endend3.grs里查森迭代法求线性方程组Ax=b的解function[x,n]=grs(A,b,x0,W,eps,M)if(nargin==4)eps=1.0e-6;%eps表示迭代精度M=10000;%M表示迭代步数的限制值elseif(nargin==5)M=10000;endI=eye(size(A));n=0;x=x0;tol=1;%前后两次迭代结果误差%迭代过程while(tol>eps)x=(I-W*A)*x0+W*b;%迭代公式n=n+1;%n为最终求出解时的迭代步数tol=norm(x-x0); x0=x;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!'); return;endend4.jacobi雅可比迭代法求线性方程组Ax=b的解function[x,n]=jacobi(A,b,x0,eps,varargin)if nargin==3eps=1.0e-6;M=200;elseif nargin<3errorreturnelseif nargin==5M=varargin{1};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+f;n=n+1;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!');return;endend5.gauseidel高斯-赛德尔迭代法求线性方程组Ax=b的解function[x,n]=gauseidel(A,b,x0,eps,M)if nargin==3eps=1.0e-6;M=200;elseif nargin==4M=200;elseif nargin<3errorreturn;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>=M)disp('Warning:迭代次数太多,可能不收敛!');return;endend6.SOR超松弛迭代法求线性方程组Ax=b的解function[x,n]=SOR(A,b,x0,w,eps,M)if nargin==4eps=1.0e-6;M=200;elseif nargin<4errorreturnelseif nargin==5M=200;endif(w<=0||w>=2)error;return;endD=diag(diag(A));%求A的对角矩阵L=-tril(A,-1);%求A的下三角阵U=-triu(A,1);%求A的上三角阵B=inv(D-L*w)*((1-w)*D+w*U);f=w*inv((D-L*w))*b;x=B*x0+f;n=1;%迭代次数while norm(x-x0)>=epsx0=x;x=B*x0+f;n=n+1;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!');return;endend7.SSOR对称逐次超松弛迭代法求线性方程组Ax=b的解function[x,n]=SSOR(A,b,x0,w,eps,M)if nargin==4eps=1.0e-6;M=200;elseif nargin<4errorreturnelseif nargin==5M=200;endif(w<=0||w>=2)error;return;endD=diag(diag(A));%求A的对角矩阵L=-tril(A,-1);%求A的下三角阵U=-triu(A,1);%求A的上三角阵B1=inv(D-L*w)*((1-w)*D+w*U);B2=inv(D-U*w)*((1-w)*D+w*L);f1=w*inv((D-L*w))*b;f2=w*inv((D-U*w))*b;x12=B1*x0+f1;x=B2*x12+f2;n=1;%迭代次数while norm(x-x0)>=epsx0=x;x12=B1*x0+f1;x=B2*x12+f2;n=n+1;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!');return;endend8.JOR雅可比超松弛迭代法求线性方程组Ax=b的解function[x,n]=JOR(A,b,x0,w,eps,M)if nargin==4eps=1.0e-6;M=10000;elseif nargin==5M=10000;endif(w<=0||w>=2)%收敛条件要求error;return;endD=diag(diag(A));%求A的对角矩阵B=w*inv(D);%迭代过程x=x0;n=0;%迭代次数tol=1;%迭代过程while tol>=epsx=x0-B*(A*x0-b);n=n+1;tol=norm(x-x0);x0=x;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!'); return;endend9.twostep两步迭代法求线性方程组Ax=b的解function[x,n]=twostep(A,b,x0,eps,varargin) if nargin==3eps=1.0e-6;M=200;elseif nargin<3errorreturnelseif nargin==5M=varargin{1};endD=diag(diag(A));%求A的对角矩阵L=-tril(A,-1);%求A的下三角阵U=-triu(A,1);%求A的上三角阵B1=(D-L)\U;B2=(D-U)\L;f1=(D-L)\b;f2=(D-U)\b;x12=B1*x0+f1;x=B2*x12+f2;n=1;%迭代次数while norm(x-x0)>=epsx0=x;x12=B1*x0+f1;x=B2*x12+f2;n=n+1;if(n>=M)disp('Warning:迭代次数太多,可能不收敛!');return;endend10.fastdown最速下降法求线性方程组Ax=b的解function[x,n]=fastdown(A,b,x0,eps)if(nargin==3)eps=1.0e-6;endx=x0;n=0;tol=1;while(tol>eps)%以下过程可参考算法流程r=b-A*x0;d=dot(r,r)/dot(A*r,r);x=x0+d*r;tol=norm(x-x0);x0=x;n=n+1;end11.conjgrad共轭梯度法求线性方程组Ax=b的解function[x,n]=conjgrad(A,b,x0)r1=b-A*x0;p=r1;n=0;for i=1:rank(A)%以下过程可参考算法流程if(dot(p,A*p)< 1.0e-50)%循环结束条件break;endalpha=dot(r1,r1)/dot(p,A*p);x=x0+alpha*p;r2=r1-alpha*A*p;if(r2< 1.0e-50)%循环结束条件break;endbelta=dot(r2,r2)/dot(r1,r1);p=r2+belta*p;n=n+1;end12.preconjgrad预处理共轭梯度法求线性方程组Ax=b的解function[x,n]=preconjgrad(A,b,x0,M,eps)if nargin==4eps=1.0e-6;endr1=b-A*x0;iM=inv(M);z1=iM*r1;p=z1;n=0;tol=1;while tol>=epsalpha=dot(r1,z1)/dot(p,A*p);x=x0+alpha*p;r2=r1-alpha*A*p;z2=iM*r2;belta=dot(r2,z2)/dot(r1,z1);p=z2+belta*p;n=n+1;tol=norm(x-x0);x0=x;%更新迭代值r1=r2;z1=z2;end13.BJ块雅克比迭代法求线性方程组Ax=b的解function[x,N]=BJ(A,b,x0,d,eps,M)if nargin==4eps=1.0e-6;M=10000;elseif nargin<4errorreturnelseif nargin==5M=10000;%参数的默认值endNS=size(A);n=NS(1,1);if(sum(d)~=n)disp('分块错误!');return;endbnum=length(d);bs=ones(bnum,1);for i=1:(bnum-1)bs(i+1,1)=sum(d(1:i))+1;%获得对角线上每个分块矩阵元素索引的起始值endDB=zeros(n,n);for i=1:bnumendb=bs(i,1)+d(i,1)-1;DB(bs(i,1):endb,bs(i,1):endb)=A(bs(i,1):endb,bs(i,1):endb);%求A的对角分块矩阵endfor i=1:bnumendb=bs(i,1)+d(i,1)-1;invDB(bs(i,1):endb,bs(i,1):endb)=inv(DB(bs(i,1):endb,bs(i,1):e ndb));%求A的对角分块矩阵的逆矩阵endN=0;tol=1;while tol>=epsx=invDB*(DB-A)*x0+invDB*b;%由于LB+DB=DB-AN=N+1;%迭代步数tol=norm(x-x0);%前后两步迭代结果的误差x0=x;if(N>=M)disp('Warning:迭代次数太多,可能不收敛!');return;endend14.BGS块高斯-赛德尔迭代法求线性方程组Ax=b的解function[x,N]=BGS(A,b,x0,d,eps,M)if nargin==4eps=1.0e-6;M=10000;elseif nargin<4errorreturnelseif nargin==5M=10000;endNS=size(A);n=NS(1,1);bnum=length(d);bs=ones(bnum,1);for i=1:(bnum-1)bs(i+1,1)=sum(d(1:i))+1;%获得对角线上每个分块矩阵元素索引的起始值endDB=zeros(n,n);for i=1:bnumendb=bs(i,1)+d(i,1)-1;DB(bs(i,1):endb,bs(i,1):endb)=A(bs(i,1):endb,bs(i,1):endb); %求A的对角分块矩阵endLB=-tril(A-DB);%求A的下三角分块阵UB=-triu(A-DB);%求A的上三角分块阵N=0;tol=1;while tol>=epsinvDL=inv(DB-LB);x=invDL*UB*x0+invDL*b;%块迭代公式N=N+1;tol=norm(x-x0);x0=x;if(N>=M)disp('Warning:迭代次数太多,可能不收敛!');return;end15.BSOR块逐次超松弛迭代法求线性方程组Ax=b的解function[x,N]=BSOR(A,b,x0,d,w,eps,M)if nargin==5eps=1.0e-6;M=10000;elseif nargin<5errorreturnelseif nargin==6M=10000;%参数默认值endNS=size(A);n=NS(1,1);bnum=length(d);bs=ones(bnum,1);for i=1:(bnum-1)bs(i+1,1)=sum(d(1:i))+1;%获得对角线上每个分块矩阵元素索引的起始值endDB=zeros(n,n);for i=1:bnumendb=bs(i,1)+d(i,1)-1;DB(bs(i,1):endb,bs(i,1):endb)=A(bs(i,1):endb,bs(i,1):endb); %求A的对角矩阵endLB=-tril(A-DB);%求A的下三角阵UB=-triu(A-DB);%求A的上三角阵N=0;iw=1-w;while tol>=epsinvDL=inv(DB-w*LB);x=invDL*(iw*DB+w*UB)*x0+w*invDL*b;%块迭代公式N=N+1;tol=norm(x-x0);x0=x;if(N>=M)disp('Warning:迭代次数太多,可能不收敛!'); return;endend。
线性方程组迭代法matlab
第三章 大作业考虑线性方程组12345615310002213131002201310010013101130013122150001322x x x x x x ⎛⎫⎛⎫- ⎪ ⎪ ⎪ ⎪⎛⎫ ⎪ ⎪-- ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪-- ⎪ ⎪= ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪ ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪ ⎪⎝⎭ ⎪ ⎪ ⎪ ⎪-⎝⎭⎝⎭(1)分别用Jacobi 方法和G-S 方法求解上述方程组,并比较它们的收敛快慢;(2)用SOR 方法求解,试分析松弛因子ω的选取对方法收敛的影响,并找到最佳松弛因子J 法:function [X]=jf(A,B,X)m=rank(A);X=reshape(X,length(X),1);B=reshape(B,length(B),1);k=1;%if m~=size(A,1) %求行数disp('A 不可逆');returnend%Bj=zeros(m,m);%while k<mg=max_(A(k:m,k)')+k-1; %求列主元行数R=A(g,:);A(g,:)=A(k,:);A(k,:)=R; %交换第k 行和主元行M=B(g);B(g)=B(k);B(k)=M; %交换B 中元素k=k+1;end%k=1;while k<=mBj(k,1:k-1)=-A(k,1:k-1)/A(k,k); Bj(k,1+k:m)=-A(k,k+1:m)/A(k,k); f(k)=B(k)/A(k,k);k=k+1;endf=f';%k=0;t=norm((X-f),inf);while t>0.00000001 %回代求解X1=Bj*X+f;t=norm((X1-X),inf);X=X1;k=k+1;end;X=X';disp('迭代次数')kGS法:function [X]=gs1(A,B,X)m=rank(A);X=reshape(X,length(X),1);B=reshape(B,length(B),1);k=1;%if m~=size(A,1) %求行数disp('A不可逆');returnend%%while k<=mg=max_(A(k:m,k)')+k-1; %求列主元行数R=A(g,:);A(g,:)=A(k,:);A(k,:)=R; %交换第k行和主元行M=B(g);B(g)=B(k);B(k)=M; %交换B中元素k=k+1;end%k=1;while k<=mG(k:m,k)=A(k:m,k); %G=D-LU(k,k:m)=-A(k,k:m);U(k,k)=0;k=k+1;endBgs=G\U;fgs=G\B;%k=0;t=norm((X-fgs),inf);while t>0.00000001 %回代求解X1=Bgs*X+fgs;t=norm((X1-X),inf);X=X1;k=k+1;end;X=X';disp('迭代次数')kSOR法function [X]=sor1(A,B,X,w)m=rank(A);X=reshape(X,length(X),1);B=reshape(B,length(B),1);k=1;%if m~=size(A,1) %求行数disp('A不可逆');returnend%D=zeros(m,m);%while k<=mg=max_(A(k:m,k)')+k-1; %求列主元行数R=A(g,:);A(g,:)=A(k,:);A(k,:)=R; %交换第k行和主元行M=B(g);B(g)=B(k);B(k)=M; %交换B中元素k=k+1;end%k=1;while k<=mD(k,k)=A(k,k);L(k:m,k)=-A(k:m,k);U(k,k:m)=-A(k,k:m);k=k+1;endL=L+D;U=U+D;Bw=(D-w*L)\((1-w)*D+w*U);fw=w*((D-w*L)\B);%k=0;t=norm((X-fw),inf);while t>0.00000001 %回代求解X1=Bw*X+fw;t=norm((X1-X),inf);X=X1;k=k+1;end;X=X';disp('迭代次数')k最佳function w=opt(A)%optdisp('best')m=rank(A);k=1;%if m~=size(A,1) %求行数disp('A不可逆');returnend%Bj=zeros(m,m);%while k<mg=max_(A(k:m,k)')+k-1; %求列主元行数R=A(g,:);A(g,:)=A(k,:);A(k,:)=R; %交换第k行和主元行k=k+1;end%k=1;while k<=mBj(k,1:k-1)=-A(k,1:k-1)/A(k,k);Bj(k,1+k:m)=-A(k,k+1:m)/A(k,k);k=k+1;end%[x y]=eig(Bj);r=max(sqrt(max(abs(y))));w=2/(1+sqrt(1-r^2));。
数值计算线性方程迭代法实验
实验报告一一、实验目的理解线性方程组直接法与迭代法思想,掌握常用算法的设计,掌握用MATLAB 实现的数值解法。
二、实验题目实验一 线性方程组迭代法实验 1、 迭代法的收敛速度用迭代法分别对n=20,n=200解方程组,b Ax =其中nn A ⨯⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛------------------=431513143151513143151513143151513143151314(1) 选取不同的初值0x 和不同的右端向量b,给定迭代误差,用两种迭代法计算,观测得到的迭代向量并分析计算结果给出结论;(2) 取定初值0x 和右端向量b,给定迭代误差,将A 的主对角元成倍放大,其余元素不变,用Jacobi 迭代法计算多次,比较收敛速度,分析计算结果并给出结论。
2、 SOR 迭代法松弛因子的选取用逐次超松弛(SOR )迭代法求解方程组,b Ax =其中 .5555551221212211212212121221121221212200199198321⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛----------=x x x x x x A (1) 给定迭代误差,选取不同的超松弛因子1>ω进行计算,观测得到的近似值向量并分析计算结果,给出你的结论;(2) 给定迭代误差,选取不同的低松弛因子1<ω进行计算,观测得到的近似值向量并分析计算结果,给出你的结论。
三、实验原理Jacobi 迭代法算法:步1 取初始点()0x ,精度要求ε,最大迭代次数N ,置0:=k ;步 2 由()n i x a b a x ni j j j ij i ii k i,,1,1,11 =⎪⎪⎭⎫⎝⎛-=∑≠=+ 或()b D x A D D x k 111)(--++-= 计算()1+k x ; 步3 若()()ε≤-∞+k k xx1,则停算,输出()1+k x作为方程组的近似解; 步4 若N k =,则停算,输出迭代失败信息;否则置1+=k k ,转布2。
matlab用迭代法求方程
matlab用迭代法求方程Matlab是一种常用的科学计算软件,可用于解决各种数学问题。
其中,迭代法可以用来求解方程,是一种简单但非常有效的算法。
本文将介绍如何在Matlab中使用迭代法求解方程的步骤。
步骤一:构造迭代式迭代法的核心在于构造一个迭代式,通过不断迭代的方式逼近方程的解。
在求解方程f(x)=0时,一般可以构造形如x(n+1)=g(x(n))的递推公式来进行迭代。
其中,g(x)是一个函数,可以通过试错与调整来确定。
步骤二:设定初值x(0)在开始迭代之前,需要确定初值x(0),即从哪个点开始进行迭代。
初值不同可能会得到不同的解,在实际应用中需要特别注意。
步骤三:设定迭代停止条件为了避免无限迭代,需要设定迭代停止的条件。
常用的条件有两种:一种是设定迭代次数,即达到一定迭代次数后停止迭代;另一种是设置收敛条件,即在一定误差范围内停止迭代。
步骤四:编写Matlab代码完成以上准备工作后,可以开始编写Matlab代码。
具体实现可以采用for循环或while循环的方式进行迭代,根据设定的迭代停止条件来决定何时停止迭代。
以求解方程f(x)=x^3-x-1为例,其迭代式可以构造为:x(n+1)=x(n)-(x(n)^3-x(n)-1)/(3*x(n)^2-1)初值设为x(0)=1,迭代停止条件设为当两次迭代之差小于0.0001时停止。
则对应的Matlab代码可写为:x(1)=1;tol=0.0001;for n=1:100x(n+1)=x(n)-(x(n)^3-x(n)-1)/(3*x(n)^2-1);if abs(x(n+1)-x(n))<tolbreak;endend步骤五:运行程序并解读结果编写完Matlab代码后,可以运行程序并查看结果。
对于上述例子,最终的解为x=1.3247,满足收敛条件。
在使用迭代法求解方程时,需要注意函数的收敛性、初值选择、迭代次数等问题。
此外,迭代法也存在无法收敛或收敛速度慢的情况,需要特别注意。
Jacobi迭代法_Gauss-Seidel迭代法
Matlab线性方程组的迭代解法(Jacobi迭代法Gauss-Seidel迭代法)实验报告2008年11月09日星期日12:49Jacobi迭代法,并编写Matlab程序matlab程序按照算法(Jacobi迭代法)编写Matlab程序(Jacobi.m)function [x, k, index]=Jacobi(A, b, ep, it_max)%求解线性方程组的Jacobi迭代法,其中% A ---方程组的系数矩阵% b ---方程组的右端项% ep ---精度要求。
省缺为1e-5% it_max ---最大迭代次数,省缺为100% x ---方程组的解% k ---迭代次数% index --- index=1表示迭代收敛到指定要求;% index=0表示迭代失败if nargin <4 it_max=100; endif nargin <3 ep=1e-5; endn=length(A); k=0;x=zeros(n,1); y=zeros(n,1); index=1;while 1for i=1:ny(i)=b(i);for j=1:nif j~=iy(i)=y(i)-A(i,j)*x(j);endendif abs(A(i,i))<1e-10 | k==it_maxindex=0; return;endy(i)=y(i)/A(i,i);endif norm(y-x,inf)<epbreak;endx=y; k=k+1;end用Jacobi迭代法求方程组的解。
输入:A=[4 3 0;3 3 -1;0 -1 4];b=[24;30;-24];[x, k, index]=Jacobi(A, b, 1e-5, 100)输出:x =k =100index =Gauss-Seidel迭代法,并编写Matlab程序function [v,sN,vChain]=gaussSeidel(A,b,x0,errorBound,maxSp)%Gauss-Seidel迭代法求解线性方程组%A-系数矩阵b-右端向量x0-初始迭代点errorBound-近似精度maxSp-最大迭代次数%v-近似解sN-迭代次数vChain-迭代过程的所有值step=0;error=inf;s=size(A);D=zeros(s(1));vChain=zeros(15,3);%最多能记录15次迭代次数k=1;fx0=x0;for i=1:s(1)D(i,i)=A(i,i);end;L=-tril(A,-1);U=-triu(A,1);while error>=errorBound & step<maxSpx0=inv(D)*(L+U)*x0+inv(D)*b;vChain(k,:)=x0';k=k+1;error=norm(x0-fx0);fx0=x0;step=step+1;endv=x0;sN=step;用Gauss-Seidel迭代法求解上题的线性方程组,取。
matlab迭代法解方程的程序
文章标题:使用MATLAB迭代法解方程的程序目录1. 什么是迭代法解方程2. MATLAB中迭代法的实现3. 迭代法解方程的优缺点4. 实例分析:使用MATLAB实现迭代法解方程5. 结语1. 什么是迭代法解方程迭代法是一种数值计算方法,用于逼近方程的根或解。
在实际应用中,经常会遇到无法通过代数方法得到准确解的方程,这时候就需要借助数值计算的方法来求得近似解。
迭代法通过不断逼近解的过程,逐步缩小误差,最终得到一个接近精确解的近似值。
2. MATLAB中迭代法的实现MATLAB作为一种强大的数值计算工具,提供了丰富的数值计算函数和工具箱,其中包括了多种迭代法的实现。
在MATLAB中,常用的迭代法有牛顿法、雅各比迭代法、高斯-赛德尔迭代法等。
这些迭代法都可以通过调用MATLAB内置函数或自行编写程序实现。
在编写迭代法程序时,需要注意选择合适的迭代停止条件、初始化的迭代值、迭代步数等参数。
3. 迭代法解方程的优缺点迭代法解方程具有以下优点:1) 适用范围广:迭代法可以解决各种类型的方程,包括线性方程组、非线性方程、微分方程等;2) 可以得到近似解:即使方程无法通过代数方法求解,迭代法也可以得到一个接近精确解的近似值;3) 数值稳定性:在一定条件下,迭代法能够保证解的稳定性和收敛性。
但迭代法也存在一些缺点:1) 收敛速度慢:一些迭代法可能需要较多的迭代次数才能得到满意的解;2) 初始值敏感:迭代法对初始值的选取比较敏感,选取不当可能导致迭代发散或者收敛到错误的解;3) 复杂度高:一些迭代法的实现比较复杂,需要具备较高的数值计算和编程能力。
4. 实例分析:使用MATLAB实现迭代法解方程接下来,我们将以求解非线性方程x^2-3x+2=0为例,使用MATLAB实现迭代法来求得方程的根。
我们选择使用简单而经典的二分法来进行迭代计算。
```MATLABfunction result = iteration_method()f = @(x) x^2 - 3*x + 2;a = 0;b = 2;tol = 1e-6;if f(a)*f(b) > 0error('The function has the same sign at the endpoints.'); endwhile (b - a) > tolc = (a + b) / 2;if f(c) == 0break;elseif f(a)*f(c) < 0b = c;elsea = c;endresult = c;endend```上述代码中,我们通过定义函数f(x)为方程的表达式,并选择区间[a, b]为[0, 2]作为初始迭代区间。
基于Matlab实现线性方程组的迭代解法
-41111-411 11b=1111第3 3 卷第5 期武夷学院学报Vol〃3 3 No〃5 2 0 1 4 年 1 0 月JOURNAL OF WUYI UNIVERSITY O CT 〃2014基于M a t l a b 实现线性方程组的迭代解法王学彬(武夷学院数学与计算机学院,福建武夷山354300)摘要:本文结合求解线性方程组的迭代法,介绍了如何利用M a t L a b软件求解线性方程组,并给出具体实例。
关键词:M a t l a b;线性方程组;数值解中图分类号:O241〃6文献标识码:A文章编号:1674-2109(2014)05-0006-04DOI:10.14155/ki.35-1293/g4.2014.05.002 1 M a t l a b 软件和迭代法简介并对运行结果进行分析。
(要求计算精度为10-5)例1 利用迭代法解线性方程组 A x = b ,M a t l a b是由T h e M a t h W o r k s公司开发的一套强大的数学软件,现已成为国际上最流行的科学计算与工程计算软件工具之一,M a t l a b主要面对科学计算、可视化及交互式程序设计的高科技计算环境,这使得111111111111-411111111-411111111111111111111111111111111111111111 1111111它的使用不仅仅局限在控制领域和数值分析领域内,在金融分析、神经网络、优化、虚拟现实等许多领域也都被广泛使用1-2。
M a t l a b在数值计算中有着其它软件无法比拟的优势,文献3-5考虑了基于M a t l a b求解常微分方程及在微积分中的一些应用。
本文将介绍如何利用M a t l a b实现线性方程组的迭代解法。
设有线性方程组A x=b,A为非奇异矩阵,首先将A分裂为A=M-N。
其中M一般选择为A的某种近似,且为非奇异矩阵,可称其为分裂矩阵,由分裂矩阵选取的不同,得到不同的迭代法,常见的有雅可比迭代法、高斯-塞德尔迭代法、逐次超松弛迭代法6。
matlab迭代法
matlab迭代法Matlab中,迭代法是一种求解数值方法的算法。
它是通过迭代近似计算来解决数值问题的方法。
下面我将详细介绍Matlab迭代法的原理、应用、优缺点及代码实现。
一、Matlab迭代法的原理Matlab迭代法是通过不断迭代来逼近目标解的方法。
它的基本思想是,把问题转化为不断迭代的公式,从一个初始点开始,一步一步不断逼近目标解。
因为迭代是逐步开始的,所以我们可以通过控制迭代次数来控制精度。
具体的迭代公式因问题而异,但其实现过程是类似的。
二、Matlab迭代法的应用1.求解非线性方程。
非线性方程的求解是很多问题的基础,而解非线性方程的迭代法在很多时候非常有用。
例如,求解多项式方程的实根、解微分方程等问题都可以通过迭代法来实现。
2.最优化问题。
最优化问题是指在一定约束条件下,寻找能够取得最小或者最大值的函数的解。
这个问题在现代科学和工程中有很广泛的应用,例如最小二乘、最小化成本等。
而要解决这类问题,就需要通过迭代来逐步逼近目标值。
3.求解线性方程组。
对于一些简单的线性方程组,例如二维或三维的线性方程组,可以用迭代法来求解。
这类问题的求解需要涉及到矩阵乘法、求逆等知识。
Matlab中内置了很多求解线性方程组的函数,例如linsolve等。
三、Matlab迭代法的优缺点优点:1.可以处理很多无法通过解析的方法求解的问题;2.算法灵活且易于实现。
缺点:1.需要设计正确的迭代公式,否则易产生发散现象;2.收敛速度较慢,需要耗费大量计算资源。
四、Matlab迭代法的代码实现在Matlab中,我们可以使用while循环和if语句来实现迭代法。
例如,对于求解非线性方程f(x)=0的问题,可以使用如下的代码实现:function x = iteration(f,x0)tol = 1e-6; % 设定收敛精度为1e-6iter = 1; % 设定迭代次数的初始值为1dx = 1; % 定义dx值为1while (abs(dx)>tol && iter<1000) % 当dx值与收敛精度的差值大于tol或者迭代次数超过1000次时,退出循环x = f(x0); % 计算迭代公式,求解x值dx = x - x0; % 计算dx值x0 = x; % 将x的值赋给x0,作为下一次迭代的初始值iter = iter + 1; % 迭代次数加1end以上是我对于Matlab迭代法的介绍,希望能够对你有所帮助。
使用Matlab进行迭代计算的方法
使用Matlab进行迭代计算的方法引言:在科学计算和工程领域,迭代计算是一种常用的数值计算方法。
它通过多次迭代逼近解决方案,对于复杂问题具有很高的效率和准确性。
Matlab是一种强大的数值计算软件,具备丰富的工具箱和库,为迭代计算提供了便利。
本文将介绍使用Matlab进行迭代计算的方法,并探讨一些常见的迭代算法。
一、迭代计算的基本原理迭代计算是一种通过逐次逼近解决方案的数值计算方法。
它通常开始于一个近似解,通过多次迭代来逐步改进解的准确性,直到满足收敛条件或达到预设的迭代次数。
迭代计算的基本原理如下:1. 选择合适的初值:迭代计算的结果依赖于初始值的选择。
初值应该接近准确解,以便缩小误差范围。
2. 建立迭代模型:根据问题的特性和数学模型,建立迭代计算的基本形式。
通常,问题可以化为一个方程或者一组方程的求解。
3. 迭代逼近:从初始值开始,通过逐次迭代来逼近准确解。
每一次迭代都会产生一个更加精确的解,直到满足收敛条件。
4. 收敛判断:在每一次迭代之后,需要判断是否满足收敛条件。
常见的收敛条件有解的相对误差小于某个阈值,或者迭代次数达到预设的最大次数。
二、常见的迭代算法Matlab提供了多种迭代算法的函数和工具箱,下面将介绍几种常见的迭代算法以及在Matlab中的应用。
1. 简单迭代法:也称为迭代逼近法,是一种基本的迭代算法。
它适用于函数的连续可导且导数在某个区间内的绝对值小于1的情况。
简单迭代法的公式如下: x(i+1) = g(x(i))其中,g(x)为转化后的原方程,x(i)为第i次迭代的解,x(i+1)为第i+1次迭代的解。
在Matlab中,可以使用fzero函数结合匿名函数实现简单迭代法。
2. 牛顿迭代法:也称为牛顿-拉夫逊方法,是一种高效的迭代算法。
它通过利用函数的局部线性逼近来寻找解的迭代近似。
牛顿迭代法的公式如下: x(i+1) = x(i) - f(x(i))/f'(x(i))其中,f(x)为原方程,f'(x)为f(x)的导数,x(i)为第i次迭代的解,x(i+1)为第i+1次迭代的解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章线性方程组的迭代解法
2015年12月27日17:12
迭代法是目前求解大规模稀疏线性方程组的主要方法之一。
包括定常迭代法和不定常迭代法,定常迭代法的迭代矩阵通常保持不变,包括有雅可比迭代法(Jacobi)、高斯-塞德尔迭代法(Gauss-Seidel)、超松弛迭代法(SOR)
1.雅可比迭代法(Jacobi)
A表示线性方程组的系数矩阵,D表示A的主对角部分,L表示下三角部分,U表示上三角部分。
A=D+L+U
要解的方程变为Dx+Lx+Ux=b
x=D^(-1)(b-(L+U)x)
所以Jocabi方法如下:
Matlab程序
function [x,iter] =jacobi(A,b,tol)
D=diag(diag(A));
L=D-tril(A);
U=D-triu(A);
x=zeros(size(b));
for iter=1:500
x=D\(b+L*x+U*x);
error=norm(b-A*x)/norm(b);
if(error<tol)
break;
end
End
2.高斯-塞德尔迭代法(Guass-Seidel)
在雅可比迭代法中将算出来的的分 马上投入到下一个迭代方程中进行
Matlab程序
function [x,iter]=guass_seidel(A,b,tol)
D=diag(diag(A));
L=D-tril(A);
U=D-triu(A);
x=zeros(size(b));
for iter=1:500
x=(D-L)\(U*x+b);
error=norm(b-A*x)/norm(b);
if(error<tol)
break;
end
end
3.超松弛迭代法(SOR)
GS迭代格式可以改写成
上面等式的右边第二项可以看成修正 ,在修正 之前加参数w(松弛因子),SOR迭代格式为
即
Matlab程序
function [x,iter]=sor(A,b,omega,tol)
D=diag(diag(A));
L=D-tril(A);
U=D-triu(A);
x=zeros(size(b));
for iter=1:500
x=(D-omega*L)\(omega*b+(1-omega)*D*x+omega*U*x);
error=norm(b-A*x)/norm(b);
if(error<tol)
break;
end
end。