Matlab 数值分析 Gauss_Seidel高斯赛德尔迭代法
- 格式:docx
- 大小:13.45 KB
- 文档页数:1
标题:深入探讨MATLAB中的高斯-赛德尔迭代法一、概述MATLAB是一种强大的数学计算软件,被广泛应用于科学、工程和金融等领域。
在数值分析中,迭代法是解决非线性方程组和矩阵方程组的重要方法之一。
高斯-赛德尔迭代法是其中的一种,其在求解线性方程组时具有较好的收敛性和效率。
本文将深入探讨MATLAB中高斯-赛德尔迭代法的原理和实现方法。
二、高斯-赛德尔迭代法原理高斯-赛德尔迭代法是一种求解线性方程组的迭代法。
给定线性方程组Ax=b,其中A为系数矩阵,b为常数向量,迭代法的基本思想是通过不断逼近方程组的解x。
高斯-赛德尔迭代法的迭代公式如下:\[ x^{(k+1)} = D^{-1} (b - (L+U)x^{(k)}) \]其中,D、L和U分别为系数矩阵A的对角线、严格下三角部分和严格上三角部分。
迭代法的初始值可以任意选择,通常选取一个与解接近的初值,然后通过迭代逼近真实解。
三、MATLAB中高斯-赛德尔迭代法的实现MATLAB提供了丰富的数值计算函数和工具箱,使得高斯-赛德尔迭代法的实现变得非常简单。
下面我们将介绍如何在MATLAB中使用高斯-赛德尔迭代法求解线性方程组。
1. 设置参数在使用高斯-赛德尔迭代法之前,我们首先需要设置一些参数,如系数矩阵A、常数向量b、迭代步数等。
在MATLAB中可以通过定义变量来实现这些参数的设置。
2. 编写迭代函数接下来,我们需要编写高斯-赛德尔迭代法的迭代函数。
通过编写一个MATLAB函数来实现迭代公式的计算和迭代过程的控制。
3. 调用函数求解完成迭代函数的编写后,我们就可以通过调用该函数来求解线性方程组。
在MATLAB中,可以使用循环语句控制迭代步数,并在每一步更新迭代值,直到满足收敛条件为止。
四、案例分析为了更好地理解高斯-赛德尔迭代法在MATLAB中的应用,我们以一个具体的案例来进行分析和实践。
假设我们需要求解以下线性方程组:\[ \begin{cases} 4x_1 - x_2 + x_3 = 8 \\ -x_1 + 4x_2 - x_3 = 9 \\2x_1 - x_2 + 5x_3 = 7 \end{cases} \]我们可以通过MATLAB编写高斯-赛德尔迭代法的函数,并调用该函数来求解以上线性方程组。
二维Gauss-Seidel迭代法是解线性方程组的一种常用方法,通过迭代求解,能够快速且精确地得到方程组的解。
在MATLAB中,可以使用简洁的代码实现二维Gauss-Seidel迭代法,下面我们将介绍该方法的原理以及在MATLAB中的具体实现。
一、Gauss-Seidel迭代法原理1. Gauss-Seidel迭代法是一种逐次逼近的方法,通过不断迭代更新方程组中的未知数,最终得到方程组的解。
其基本思想是利用已知的未知数值不断逼近更精确的解。
2. 对于线性方程组Ax=b,可以将其表示为x(k+1)=Tx(k)+c的形式,其中T为迭代矩阵,c为常量向量,x为未知数向量。
Gauss-Seidel 迭代法通过不断更新x(k)的值,逐步逼近方程组的解。
3. 迭代矩阵T和常量向量c的具体计算方式为:首先将系数矩阵A分解为下三角矩阵L、对角矩阵D和上三角矩阵U,然后得到T=-L*(D^-1)*U,c=L*(D^-1)*b。
4. 通过不断迭代更新x(k)的值,直到满足一定的精度要求或者迭代次数达到设定值,即可得到方程组的解。
二、MATLAB实现二维Gauss-Seidel迭代法在MATLAB中,可以很方便地实现二维Gauss-Seidel迭代法,以下是具体的实现代码:```matlabfunction [x, k] = gauss_seidel(A, b, x0, tol, max_iter)A为系数矩阵,b为常量向量,x0为初始解向量,tol为精度要求,max_iter为最大迭代次数返回x为方程组的解,k为实际迭代次数n = length(b);x = x0;k = 0;err = tol + 1;L = tril(A, -1); 下三角矩阵U = triu(A, 1); 上三角矩阵D = diag(diag(A)); 对角矩阵T = -L*(D\U);c = L*(D\b);while err > tol k < max_iterx_old = x;x = T*x + c;err = norm(x - x_old, inf);k = k + 1;endend```三、代码说明1. 函数gauss_seidel接受系数矩阵A、常量向量b、初始解向量x0、精度要求tol和最大迭代次数max_iter作为输入参数,返回方程组的解x和实际迭代次数k。
数值分析编程作业2012年12月第二章14.考虑梯形电阻电路的设计,电路如下:电路中的各个电流{i1,i2,…,i8}须满足下列线性方程组:121232343454565676787822/252025202520252025202520250i i V R i i i i i i i i i i i i i i i i i i i i -=-+-=-+-=-+-=-+-=-+-=-+-=-+=这是一个三对角方程组。
设V=220V ,R=27Ω,运用追赶法,求各段电路的电流量。
Matlab 程序如下:function chase () %追赶法求梯形电路中各段的电流量 a=input('请输入下主对角线向量a='); b=input('请输入主对角线向量b='); c=input('请输入上主对角线向量c='); d=input('请输入右端向量d='); n=input('请输入系数矩阵维数n='); u(1)=b(1); for i=2:nl(i)=a(i)/u(i-1); u(i)=b(i)-c(i-1)*l(i); endy(1)=d(1); for i=2:ny(i)=d(i)-l(i)*y(i-1); endx(n)=y(n)/u(n); i=n-1; while i>0x(i)=(y(i)-c(i)*x(i+1))/u(i); i=i-1;end x输入如下: >> chase请输入下主对角线向量a=[0,-2,-2,-2,-2,-2,-2,-2]; 请输入主对角线向量b=[2,5,5,5,5,5,5,5];请输入上主对角线向量c=[-2,-2,-2,-2,-2,-2,-2,0]; 请输入方程组右端向量d=[220/27,0,0,0,0,0,0,0]; 请输入系数矩阵阶数n=8 运行结果如下:x = 8.1478 4.0737 2.0365 1.0175 0.5073 0.2506 0.1194 0.0477第三章14.试分别用(1)Jacobi 迭代法;(2)Gauss-Seidel 迭代法解线性方程组1234510123412191232721735143231211743511512x x x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=--⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥---⎣⎦⎣⎦⎣⎦ 迭代初始向量(0)(0,0,0,0,0)T x =。
【题目】:Gauss-Seidel迭代法及Matlab代码实例【内容】:1. Gauss-Seidel迭代法介绍Gauss-Seidel迭代法是一种用于解线性方程组的数值方法,基于逐次逼近的思想,通过不断迭代逼近线性方程组的解。
该方法通常用于求解大型稀疏线性方程组,其收敛速度相对较快。
2. 迭代公式推导假设有如下线性方程组:$$Ax=b$$其中A为系数矩阵,b为常数向量,x为未知向量。
Gauss-Seidel迭代法的迭代公式为:$$x^{(k+1)}=(D+L)^{-1}(b- Ux^{(k)})$$其中,D为A的对角矩阵,L为A的严格下三角矩阵,U为A的严格上三角矩阵,k为迭代次数。
3. Matlab代码实现下面给出Gauss-Seidel迭代法的Matlab代码实例:```matlabfunction [x, k] = gaussSeidel(A, b, x0, tol, maxIter)A: 系数矩阵b: 常数向量x0: 初始解向量tol: 容差maxIter: 最大迭代次数x: 解向量k: 迭代次数n = length(b);x = x0;k = 0;while k < maxIterx_old = x;for i = 1:nx(i) = (b(i) - A(i,1:i-1)*x(1:i-1) - A(i,i+1:n)*x_old(i+1:n)) / A(i,i); endif norm(x - x_old, inf) < tolreturnendk = k + 1;enddisp('迭代次数达到最大值,未达到容差要求'); end```4. 应用实例假设有如下线性方程组:$$\begin{cases}2x_1 - x_2 + x_3 = 5\\-x_1 + 2x_2 - x_3 = -2\\x_1 - x_2 + 2x_3 = 6\end{cases}$$系数矩阵A为:$$\begin{bmatrix}2 -1 1\\-1 2 -1\\1 -1 2\end{bmatrix}$$常数向量b为:$$\begin{bmatrix}5\\-2\\6\end{bmatrix}$$取初始解向量x0为:$$\begin{bmatrix}0\\0\\\end{bmatrix}$$容差tol为1e-6,最大迭代次数maxIter为100。
数值分析第二次作业学院:电子工程学院基于matlab平台的三种迭代法求解矩阵方程组求解系数矩阵由16阶Hilbert方程组构成的线性方程组的解,其中右端项为[2877/851,3491/1431,816/409,2035/1187,2155/1423,538/395,1587/1279,573/502,947 /895,1669/1691,1589/1717,414/475,337/409,905/1158,1272/1711,173/244].要求:1)Gauss_Sedel迭代法;2)最速下降法;3)共轭梯度法;4)将结果进行分析对比。
解:根据题目要求,编写了对应算法的matlab程序,求解结果如下:(求解精度为10e-4,最大迭代次数1000)1、方程的解:如下图1所示图1 三种方法求解的结果对比图2 Gause_Sedel算法收敛特性图3 最速下降法收敛特性图3 共轭梯度法收敛特性从图中可以看到,在相同的最大迭代次数和预设求解精度条件下,共轭梯度算法仅需要4次迭代便可求出方程组的解,耗时0.000454秒,而且求出解的精度最高;Gauss_Sedel方法需要465次迭代,耗时0.006779秒,求解精度最差;最速下降法需要398次迭代,耗时0.007595秒,求解精度与共轭梯度算法差不多,因此两者求出的解也几乎相同。
从中可以得出结论,共轭梯度算法无论从求解精度还是求解速度上都优于其他两种,最速下降法在求解精度上几乎与共轭梯度算法持平,但求解速度更慢。
Gauss_Sedel方法在求解精度和速度两方面都最差。
具体的解为:Gauss_Sedel迭代法:(共需465次迭代,求解精度达到9.97e-5) X=[0.995328360833192 1.01431732497804 1.052861239300110.934006974137998 0.931493373808838 0.9665081384030661.00661848511341 1.03799789809258 1.051806903036541.06215849948572 1.04857676431223 1.028561990411131.01999170162638 0.971831831519515 0.9525261666348130.916996019179182].最速下降法:(共需398次迭代,求解精度达到9.94e-5)X=[0.998835379744322 1.01507463472900 0.9825890937201850.980191460759243 0.991245169713628 1.003780222253291.01350884374478 1.01928337905816 1.020859096651941.01930314197028 1.01444777381651 1.007040589892970.998384452250809 0.987399404644377 0.9757678149709120.963209150871750].共轭梯度法:(共需4次迭代,求解精度达到3.98e-5)X=[0.996472751179456 1.02707840189049 0.9776233734098530.973206695321590 0.986133032967607 1.001289025642341.01322158496914 1.02047386502293 1.023009050605651.02163015083975 1.01678089454399 1.009203108638740.999772406055155 0.988443827498859 0.9760941924969490.962844741655005].Matlab程序主程序:clc;clear;%% 本程序用于计算第二次数值分析作业,关于希尔伯特矩阵方程的解,用三种方法,分析并比较,也可推广至任意n维的矩阵方程%%A=hilb(16); %生成希尔伯特系数矩阵b=[2877/851;3491/1431;816/409;2035/1187;2155/1423;538/395;1587/1279;573/502;947/895;166 9/1691;1589/1717;414/475;337/409;905/1158;1272/1711;173/244]; %右端向量M=1000; %最大迭代次数err=1.0e-4; %求解精度[x,n,xx,cc,jingdu]=yakebi_diedai(A,b,err,M); % 雅克比算法求解tic;[x1,n1,xx1,cc1,jingdu1]=gauss_seidel(A,b,err,M); % gauss_seidel算法求解toc;tic;[x2,n2,xx2,jingdu2]=zuisuxiajiangfa(A,b,err,M); % 最速下降法求解toc;tic;[x3,flag,jingdu3,n3]=bicg(A,b,err); % matlab内置双共轭梯度算法求解toc;tic;[x4,xx4,n4,jingdu4]=con_grad(A,b,err,M); % 教材共轭梯度算法求解toc;%% 计算相应结果,用于作图%%num=[1:16]';jie=[num,x1,x2,x4]; % 三者的解对比% 三者的收敛情况对比num1=[1:n1]';fit1=[num1,jingdu1'];num2=[1:n2]';fit2=[num2,jingdu2'];num4=[1:n4]';fit4=[num4,jingdu4'];子函数1(Gause_Sedel算法):function [x,n,xx,cc,jingdu] = gauss_seidel(A,b,err,M)% 利用迭代方法求解矩阵方程这里是高斯赛尔得迭代方法% A 为系数矩阵b 为右端向量err为精度大小返回求解所得向量x及迭代次数% M 为最大迭代次数cc 迭代矩阵普半径jingdu 求解过程的精度n 所需迭代次数xx 存储求解过程中每次迭代产生的解for ii=1:length(b)if A(ii,ii)==0x='error';break;endendD=diag(diag(A));L=-tril(A,-1);U=-triu(A,1);B=(D-L)\U;cc=vrho(B); %迭代矩阵普半径FG=(D-L)\b;x0=zeros(length(b),1);x=B*x0+FG;k=0;xx(:,1)=x;while norm(A*x-b)>errx0=x;x=B*x0+FG;k=k+1;xx(:,k+1)=x;if k>=Mdisp('迭代次数太多可能不收敛!');break;endjingdu(k)=norm(A*x-b);endend子函数2(最速下降算法):function [x,n,xx,jingdu]=zuisuxiajiangfa(A,b,eps,M)% 利用迭代方法求解矩阵方程这里是最速下降迭代方法% A 为系数矩阵b 为右端向量err为精度大小返回求解所得向量x及迭代次数% % M 为最大迭代次数jingdu 求解过程的精度n 所需迭代次数xx 存储求解过程中每次迭代产生的解x0=zeros(length(b),1);r0=b-A*x0;t0=r0'*r0/(r0'*A*r0);x=x0+t0*r0;r=b-A*x;xx(:,1)=x;k=0;while norm(r)>epsr=r;x=x;t=r'*r/(r'*A*r);x=x+t*r;r=b-A*x;k=k+1;xx(:,k+1)=x;if k>=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(r);endend子函31(共轭梯度法):function [x,xx,n,jingdu]=con_grad(A,b,eps,M)% 利用迭代方法求解矩阵方程这里是共轭梯度迭代方法% A 为系数矩阵b 为右端向量err为精度大小返回求解所得向量x及迭代次数% M 为最大迭代次数jingdu 求解过程的精度n 所需迭代次数xx 存储求解过程中每次迭代产生的解x0=zeros(length(b),1);r0=b-A*x0;p0=r0;% t0=r0'*r0/(r0'*A*r0);% x=x0+t0*r0;% xx(:,1)=x;k=0;x=x0;r=r0;p=p0;while norm(r)>epsx=x;r=r;p=p;afa=r'*r/(p'*A*p);x1=x+afa*p;r1=r-afa*A*p;beta=r1'*r1/(r'*r);p1=r1+beta*p;x=x1;r=r1;p=p1;k=k+1;xx(:,k)=x;if k>=Mdisp('迭代次数太多可能不收敛!');break;endn=k;jingdu(k)=norm(r);endend。
Gauss-Seidel迭代法是解线性方程组的一种常用方法,它通过不断迭代更新解向量,逐步逼近方程组的精确解。
在实际应用中,我们往往需要判断迭代法是否收敛,以保证计算结果的准确性和可靠性。
本文将以matlab为例,介绍如何利用数值计算软件对Gauss-Seidel迭代法的收敛性进行判断,并对其进行详细分析和讨论。
一、Gauss-Seidel迭代法简介Gauss-Seidel迭代法是一种逐次迭代的线性代数方法,用于求解线性方程组Ax=b的解向量x。
它的迭代更新公式为:xn+1i=1/aii(bi-∑(j=1,j≠i)n aijxj)其中,i=1,2,...,n;n为方程组的阶数;aii为系数矩阵A的第i行第i 列元素;bi是方程组右端的常数;xj为解向量x的第j个分量;∑(j=1,j≠i)n aijxj为除去第i个分量的求和。
通过不断迭代更新解向量的各个分量,最终可以逼近线性方程组的解。
二、Gauss-Seidel迭代法的收敛性判断针对Gauss-Seidel迭代法的收敛性判断,我们可以利用数值计算软件matlab进行分析。
在matlab中,可以使用以下命令进行Gauss-Seidel迭代法的计算:function[x,k]=GaussSeidel(A,b,x0,tol,maxk)n=length(b);x=x0;for k=1:maxkx0=x;for i=1:nx(i)=1/A(i,i)*(b(i)-A(i,:)*x+x(i));endif norm(x-x0,inf)<tolreturn;endenderror('达到最大迭代次数,方法未收敛');end在上述matlab代码中,A为系数矩阵,b为右端常数向量,x0为初始解向量,tol为迭代精度,maxk为最大迭代次数。
在函数中,我们设定了最大迭代次数以及迭代精度的条件,当满足这些条件时,算法将停止迭代。
三、Gauss-Seidel迭代法的收敛性分析Gauss-Seidel迭代法的收敛性与系数矩阵A的性质有关。
matlab中的迭代算法迭代算法在matlab中的应用迭代算法是一种通过多次重复计算来逼近解的方法,它在matlab中得到了广泛的应用。
在本文中,我们将介绍一些常见的迭代算法,并探讨它们在matlab中的实现和应用。
1. 二分法二分法是一种简单而直观的迭代算法,它通过将问题的解空间一分为二,并根据中间点的取值来确定解所在的子空间。
在matlab中,可以使用while循环来实现二分法。
首先,需要指定解空间的上下界,然后通过计算中间点的值来判断解所在的子空间,并更新解空间的上下界。
重复这个过程,直到解的精度满足要求为止。
2. 牛顿迭代法牛顿迭代法是一种用于求解方程的迭代算法,它利用函数的局部线性近似来逼近方程的解。
在matlab中,可以使用while循环来实现牛顿迭代法。
首先,需要给定一个初始点,然后根据函数的一阶和二阶导数来计算下一个点的值。
重复这个过程,直到解的精度满足要求为止。
3. 高斯-赛德尔迭代法高斯-赛德尔迭代法是一种用于求解线性方程组的迭代算法,它通过不断更新近似解来逼近方程的解。
在matlab中,可以使用while循环和矩阵运算来实现高斯-赛德尔迭代法。
首先,需要给定一个初始解向量,然后根据方程组的系数矩阵和常数向量来计算下一个解向量的值。
重复这个过程,直到解的精度满足要求为止。
4. 迭代法求特征值迭代法也可以用于求解矩阵的特征值和特征向量。
在matlab中,可以使用while循环和矩阵运算来实现迭代法求特征值。
首先,需要给定一个初始特征向量,然后根据矩阵的幂来计算下一个特征向量的值。
重复这个过程,直到特征向量的变化小于某个阈值为止。
5. 迭代法求最优化问题除了求解方程和矩阵相关的问题,迭代算法还可以用于求解最优化问题。
在matlab中,可以使用while循环和梯度计算来实现迭代法求最优化问题。
首先,需要给定一个初始解向量,然后根据目标函数的梯度来计算下一个解向量的值。
重复这个过程,直到解的精度满足要求为止。
佛山科学技术学院实 验 报 告课程名称 数值分析实验项目 迭代法专业班级 机械工程 姓 名 余红杰 学 号 2111505010指导教师 陈剑 成 绩 日 期 月 日一. 实验目的1、 在计算机上用Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组 。
2、 在计算机上用二分法和Newton 迭代法求非线性方程 的根。
二. 实验要求1、按照题目要求完成实验内容;2、写出相应的Matlab 程序;3、给出实验结果(可以用表格展示实验结果);4、分析和讨论实验结果并提出可能的优化实验。
5、写出实验报告。
三. 实验步骤1、用Matlab 编写Jacobi 迭代法和Gauss-Seidel 迭代法求线性方程组Ax b =的程序。
2、用Matlab 编写二分法和Newton 法求非线性方程()0f x =的根程序。
3、设⎪⎪⎪⎭⎫ ⎝⎛--=212120203A ,T b )1,3,1(=,对于线性方程组b Ax =,考虑如下问题: (1)分别写出Jacobi 迭代矩阵和Gauss-Seidel 迭代矩阵(2)用Jacobi 迭代法和Gauss-Seidel 迭代法解该方程时,是否收敛?谁收敛的更快?(3)用实验步骤1编好的两种迭代法程序进行实验,通过数值结果验证(2)的结论。
4、用调试好的二分法和Newton 迭代法程序解决如下问题求020sin 35=-+-x x e x 的根,其中控制精度810-=eps ,最大迭代次数50=M 。
四. 实验结果1.%Jacob.mfunction [x,B] = Jacob(A,b,n)%Jacobi迭代求解方程组Ax=b,系数矩阵A,迭代次数n%求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);J = D^(-1)*(L+U);B = J;f = D^(-1)*b;%初始化x即启动值:x = zeros(m,1);%根据x(k+1)=Jx(k)+f进行矩阵运算:for i=1:nx = J*x + f;end%GauSeid.mfunction [x,G] = GauSeid(A,b,n)%Gauss-Seidel迭代求解方程组Ax=b,系数矩阵A,迭代次数n %求解的准备工作,构建各迭代系数阵等:m = length(A);D = diag(diag(A));L = -tril(A,-1);U = -triu(A, 1);G = inv(D-L)*U;f = inv(D-L)*b;%初始化矩阵:%根据x(k+1)=Gx(k)+f进行矩阵运算:x = zeros(m,1);for i = 1:nx = G*x + f;end2.%Dichotomy.mfunction x=Dichotomy(x1,x2,p,n)%利用二分法求根,区间[x1,x2]%p为精度a = x1;b = x2;%进行n次二分:%第一个条件判断根在a,b区间内%第二个条件判断是否中间点就是根,是则迭代终止;%第三个条件判断二分后根在中点左侧还是右侧;%第四个条件判断精度是否达标,用区间长度代替for i=1:nif f(a)*f(b)<0x0 = (a+b)/2;p0 = (b-a)/(2^i);if f(x0)==0x = x0;elseif f(a)*f(x0)<0b = x0;else a= x0;endendendif p0>pcontinue;elsex = x0;break;endend%NewIterat.mfunction x=NewIterat(x0,p,n)%利用牛顿迭代法求根;%x0为启动点,估计的靠近根的值,p为精度,n为迭代次数;syms x1;%设置一个自变量x1,方便后面的求导:f1 = diff(f(x1));%进行n次迭代,精度达标会提前终止;%第一个判断是根据控制条件来确定真实误差是选绝对还是相对误差;%第二个判断是确定精度是否满足要求for i=1:nx1 = x0;x = x0-f(x0)/eval(f1);if x<1RealDiv = abs(x-x0);else RealDiv = abs(x-x0)/abs(x); endif RealDiv>px0 = x;else break;endend3.run43.mclc,clear;A = [3 0 -2;0 2 1;-2 1 2];b = [1;3;1];n1 = 50;n2 =100;%输入A,b矩阵,设置迭代次数为50次;%调用迭代函数,返回迭代矩阵;[x,B] = Jacob(A,b,n1);xj50 = x;f1 = max(abs(eig(B)))%显示谱半径,确定收敛性;[x,B] = GauSeid(A,b,n1);xg50 = x;f2 = max(abs(eig(B)))%谱半径;xj100 = Jacob(A,b,n2);xg100 = GauSeid(A,b,n2); Jacobi= [xj50,xj100]%对比迭代50次和100次的结果GauSei= [xg50,xg100]%很容易看出准确解为[1;1;1]4.f.mfunction y = f(x)%所有f(x)=0中f(x)函数;y = exp(5*x)-sin(x)+x^3-20; 下页是具体解时的程序:%run44.mclc,clear;%很容易看出在[0,1]间有解;x = Dichotomy(0,1,10^(-8),50)x = NewIterat(0,10^(-8),50)五. 讨论分析4.3实验中的迭代矩阵在上个部分,分别为J 和G ;对于收敛性,看下图中的f1,f2,也就是迭代矩阵的谱半径,都是小于1的,但是可以看出后者的谱半径更小,就是说它的收敛速度更快;最终求x 的值,每种迭代方法分别迭代50次(第一列)和100次(第二列); 实际值为[1;1;1]可以看出用高斯赛德尔迭代更精确,速度更快。
matlab中应用的高斯-赛德尔迭代程序主程序如下:function X=gsdddy(A,b,X0,P,wucha,max1)D=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如下:')elsediso('请注意:高斯-赛德尔迭代的结果没有达到给定的精度,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jx和迭代X如下:')X=X';jX=kX';endendX=X';D;U;L;jX=jX';在主窗口框中输入以下例子>> A=[10 3 1;2 -10 3;1 3 10];>> b=[14;11;20];X0=[0 0 0]';>> X=gsdddy(A,b,X0,inf,0.001,100)请注意:因为对角矩阵D非奇异,所以此方程组有解。
X =1.2820 -0.2592 1.9496欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
gauss-seidel迭代法
高斯-赛德尔迭代法(Gauss-Seidel Iteration Method)是一种迭代法,用于解决线性方程组的数值解。
它是一种基于拉格朗日乘子法的迭代法,可以求解线性方程组的近似解。
算法的基本思想是:每次迭代时,将一个未知变量的值替换为它的最新估计值,即用当前的迭代步骤中的其他变量的最新估计值更新每个未知变量的值。
这样,每次迭代后,所有未知变量的值都会有所改变,直到所有变量的值收敛到一个满足方程组的解。
算法的具体步骤如下:
(1) 选取初始猜测值,即给定一组初始的估计值,用于替换每个未知变量的值。
(2) 对于每个未知变量,使用它的当前估计值和其他变量的最新估计值,求出它的新估计值。
(3) 将新估计值代替旧估计值,重复步骤2,直到所有未知变量的估计值收敛到一个满足方程组的解。
一、实验目的及题目1.1 实验目的:(1)学会用高斯列主元消去法,LU 分解法,Jacobi 迭代法和Gauss-Seidel 迭代法解线性方程组。
(2)学会用Matlab 编写各种方法求解线性方程组的程序。
1.2 实验题目:1. 用列主元消去法解方程组:1241234123412343421233234x x x x x x x x x x x x x x x ++=⎧⎪+-+=⎪⎨--+=-⎪⎪-++-=⎩2. 用LU 分解法解方程组,Ax b =其中4824012242412120620266216A --⎛⎫⎪-⎪= ⎪ ⎪-⎝⎭,4422b ⎛⎫ ⎪ ⎪= ⎪- ⎪-⎝⎭ 3. 分别用Jacobi 迭代法和Gauss-Seidel 迭代法求解方程组:1232341231234102118311210631125x x x x x x x x x x x x x -+=-⎧⎪-+=-⎪⎨-+=⎪⎪-+-+=⎩二、实验原理、程序框图、程序代码等2.1实验原理2.1.1高斯列主元消去法的原理Gauss 消去法的基本思想是一次用前面的方程消去后面的未知数,从而将方程组化为等价形式:1111221122222n n n n nn n nb x b x b x g b x b x g b x g +++=⎧⎪++=⎪⎨⎪⎪=⎩这个过程就是消元,然后再回代就好了。
具体过程如下: 对于1,2,,1k n =-,若()0,k kk a ≠依次计算()()(1)()()(1)()()/,,1,,k k ik ik kk k k k ij ij ik kjk k k i i ik k m a a a a m a b b m b i j k n++==-=-=+然后将其回代得到:()()()()()1/()/,1,2,,1n n n n nn n k k k k k kj j kk j k x b a x b a x a k n n =+⎧=⎪⎨=-=--⎪⎩∑以上是高斯消去。
使用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次迭代的解。
matlab中应用的高斯-赛德尔迭代程序主程序如下:function X=gsdddy(A,b,X0,P,wucha,max1)D=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如下:')elsediso('请注意:高斯-赛德尔迭代的结果没有达到给定的精度,并且迭代次数已经超过最大迭代次数max1,方程组的精确解jx和迭代X如下:')X=X';jX=kX';endendX=X';D;U;L;jX=jX';在主窗口框中输入以下例子>> A=[10 3 1;2 -10 3;1 3 10];>> b=[14;11;20];X0=[0 0 0]';>> X=gsdddy(A,b,X0,inf,0.001,100)请注意:因为对角矩阵D非奇异,所以此方程组有解。
X =1.2820-0.25921.9496(注:文档可能无法思考全面,请浏览后下载,供参考。