雅克比迭代法和高斯-赛德尔法解线性方程组(C++)

合集下载

雅可比迭代法和高斯塞德尔迭代法对比

雅可比迭代法和高斯塞德尔迭代法对比

雅可比迭代法和高斯塞德尔迭代法对比引言雅可比迭代法和高斯塞德尔迭代法是数值分析中常用的迭代求解线性方程组的方法。

它们都是通过迭代更新变量的值,逐渐逼近方程组的真实解。

本文将详细讨论这两种迭代法的原理、特点和适用情况,并给出一些比较和应用实例。

雅可比迭代法(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是严格对角占优或对称正定的,高斯塞德尔迭代法一定收敛。

优缺点•优点:相较于雅可比迭代法,收敛速度更快,对于条件数较大的问题也有较好的效果。

•缺点:实现稍微复杂一些,每次迭代的计算依赖于之前已更新的变量值,无法并行计算。

雅可比迭代法和高斯塞德尔迭代法的比较收敛速度在一些特定的问题中,雅可比迭代法可以比高斯塞德尔迭代法更快地收敛。

雅克比迭代法与高斯-赛德尔

雅克比迭代法与高斯-赛德尔

实验三 线性方程组的迭代法班级:**计本 ** 班 姓名:** 座号: ** 时间:2010/6/2一、 实验目的(1) 熟悉VC++开发平台和开发语言。

(2) 掌握雅可比及高斯-塞德尔迭代法解方程组的迭代法,并能根据给定的精度要求计算(包括迭代过程);比较两种方法的优劣。

(3) 培养编程和上机调试能力。

二、 实验设备一台PC 机,XP 操作系统,VC++软件三、 实验内容用雅可比迭代法和高斯-塞德尔迭代法解方程组1231231238322041133631236x x x x a x x x x x -+=⎧⎪+-=⎨⎪++=⎩,其精度为10-5。

四、 算法描述1. 雅克比迭代法公式:X[0][k+1] = ( 1 / a[0][0] )*[ b[0] –a[0][1]*X[1][k] – a[0][2]*X[2][k] ]; X[1][k+1] = ( 1 / a[1][1] )*[ b[1] –a[0][0]*X[0][k] – a[0][2]*X[2][k] ]; X[2][k+1] = ( 1 / a[2][2] )*[ b[2] –a[0][0]*X[0][k] – a[0][1]*X[1][k] ];2. 高斯-赛德尔迭代法公式:X[0][k+1] = ( 1 / a[0][0] )*[ b[0] –a[0][1]*X[1][k] – a[0][2]*X[2][k] ]; X[1][k+1] = ( 1 / a[1][1] )*[ b[1] –a[0][0]*X[0][k+1] – a[0][2]*X[2][k] ]; X[2][k+1] = ( 1 / a[2][2] )*[ b[2] –a[0][0]*X[0][k+1] – a[0][1]*X[1][k+1] ];3. 流程图雅克比流程图高斯-赛德尔流程图五、程序代码/*雅克比方法类Jacobi.h*/#ifndef A#define A#define MAX_SIZE 50class Jacobi{public:void Solve(int n,double a[MAX_SIZE][MAX_SIZE],double b[MAX_SIZE],intMAX_XunHuan,double e,int pre);};#endif/*雅克比方法类方法实现Jacobi.cpp*/#ifndef B#define B#include "Jacobi.h"#include "iostream"#include "math.h"#include "iomanip"using namespace std;double X[MAX_SIZE][MAX_SIZE]={0};double E[MAX_SIZE];void Jacobi::Solve(int n,double a[MAX_SIZE][MAX_SIZE],double b[MAX_SIZE],int MAX_XunHuan,double e,int pre){int i,j=1,z;double s=0;int flag=1;cout<<"请输入初始值X[i][0]:";for (i=0;i<n;i++){cin>>X[i][0];}for (j=1;j<MAX_XunHuan&&flag;j++){flag=0;for (i=0;i<n;i++){s=0;for (z=0;z<n;z++){if (i!=z){s+=a[i][z]*X[z][j-1];}}X[i][j]=1.0/a[i][i]*(b[i]-s);}E[j]=fabs(X[0][j]-X[0][j-1]);for (i=1;i<n;i++){if(fabs(X[i][j]-X[i][j-1])>E[j])E[j]=fabs(X[i][j]-X[i][j-1]);}if (E[j]>e){flag=1;}}if(flag==0){for (i=0;i<n;i++){cout<<" X"<<i<<"(k) ";}cout<<" 误差"<<endl;for (i=0;i<j;i++){cout<<setiosflags(ios::left)<<setiosflags(ios::fixed)<<setprecision(pre)<<X[0][i]<<" "<<X[1][i]<<" "<<X[2][i]<<" ";if(i>0){if(i!=j-1)cout<<E[i]<<endl;elsecout<<E[i]<<" < "<<e<<endl;}elsecout<<" ∞"<<endl;}}elsecout<<"没有结果,最大循环次数不够\n";cout<<"迭代次数为"<<j<<endl;}#endif/*/*高斯-赛德尔方法类Gauss.h*/#ifndef C#define C#define MAX_SIZEG 50class Gauss{public:void Solve(int n,double a[MAX_SIZEG][MAX_SIZEG],double b[MAX_SIZEG],int MAX_XunHuan,double e,int pre);};#endif/*高斯-赛德尔方法类方法实现Gauss.cpp*/#ifndef D#define D#include"Gauss.h"#include "math.h"#include "iostream"#include "iomanip"using namespace std;double XG[MAX_SIZEG][MAX_SIZEG]={0};double EG[MAX_SIZEG];void Gauss::Solve(int n,double a[MAX_SIZEG][MAX_SIZEG],double b[MAX_SIZEG],int MAX_XunHuan,double e,int pre){int i,j=1,z;double s=0;int flag=1;cout<<"请输入初始值XG[i][0]:";for (i=0;i<n;i++){cin>>XG[i][0];}for (j=1;j<MAX_XunHuan&&flag;j++){flag=0;for (i=0;i<n;i++){s=0;for (z=0;z<n;z++){if (i!=z){if(z>i)s+=a[i][z]*XG[z][j-1];elses+=a[i][z]*XG[z][j];}}XG[i][j]=1.0/a[i][i]*(b[i]-s);}EG[j]=fabs(XG[0][j]-XG[0][j-1]);for (i=1;i<n;i++){if(fabs(XG[i][j]-XG[i][j-1])>EG[j])EG[j]=fabs(XG[i][j]-XG[i][j-1]);}if (EG[j]>e){flag=1;}}if(flag==0){for (i=0;i<n;i++){cout<<" XG"<<i<<"(k) ";}cout<<" 误差"<<endl;for (i=0;i<j;i++){cout<<setiosflags(ios::left)<<setiosflags(ios::fixed)<<setprecision(pre)<<XG[0][i]<<" "<<XG[1][i]<<" "<<XG[2][i]<<" ";if(i>0){if(i!=j-1)cout<<EG[i]<<endl;elsecout<<EG[i]<<" < "<<e<<endl;}elsecout<<" ∞"<<endl;}}else cout<<"没有结果,最大循环次数不够\n";cout<<"迭代次数为"<<j<<endl;}#endif/*主函数Main*/#include "iostream"#include "Jacobi.h"#include "Jacobi.cpp"#include "Gauss.h"#include "Gauss.cpp"using namespace std;int main(){Jacobi J;Gauss G;int key;int i,j;int pre;double a[MAX_SIZE][MAX_SIZE]={0};double b[MAX_SIZE]={0};int n,MAX_XunHuan;double e;do{cout<<"请输入方程组的阶数:";cin>>n;cout<<"请输入系数矩阵A:";for (i=0;i<n;i++){for (j=0;j<n;j++){cin>>a[i][j];}}cout<<"请输入常数矩阵B:";for (i=0;i<n;i++){cin>>b[i];}cout<<"请输入最大循环次数:";cin>>MAX_XunHuan;cout<<"请输入最小误差:";cin>>e;cout<<"请输入精度输出控制(小数点后的位数)"; cin>>pre;cout<<"结束0:\n雅克比迭代法求解1:\n高斯-赛德尔求解2:";cin>>key;if (key==1){J.Solve(n,a,b,MAX_XunHuan,e,pre);}if (key==2){G.Solve(n,a,b,MAX_XunHuan,e,pre);}} while (key);return 0;}六、实验结果1.这次试验很简单,主要是公式问题,做得很顺利。

《数值分析》-雅格比法与高斯-赛德尔迭代法解线性方程组

《数值分析》-雅格比法与高斯-赛德尔迭代法解线性方程组

4. 线性方程组求解4.用雅格比法与高斯-赛德尔迭代法解下列方程组Ax =b ,研究其收敛性,上机验证理论分析是否正确,比较它们的收敛速度,观察右端项对迭代收敛有无影响。

(1)A 行分别为A 1=[6,2,-1],A 2=[1,4,-2],A 3=[-3,1,4]; b 1=[-3,2,4]T , b 2=[100,-200,345]T ,(2) A 行分别为A 1=[1,0.8,0.8],A 2=[0.8,1,0.8],A 3=[0.8,0.8,1];b 1=[3,2,1] T , b 2=[5,0,-10]T ,(3)A 行分别为A 1=[1,3],A 2=[-7,1];b =[4,6]T , (1)雅可比法A 为所求方程组的系数矩阵,将系数矩阵()n n ij A a R ⨯=∈分为三部分,即111212221211000000n n nn n n a a a a a a A a a a --⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪=-- ⎪ ⎪ ⎪ ⎪⎪ ⎪--⎝⎭⎝⎭⎝⎭D L U ≡--构造迭代方程,选取M 为A 的对角元素部分,即选取M D =,A D N =-,由此构造得到解AX b =的雅可比迭代法如下:()()()01,,0,1,,k k x xBx f k +⎧⎨=+=⎩ 初始向量(4-1)其中()111B I D A D L U J f D b ---=-=+≡=,,J 为雅可比迭代矩阵。

若A 为n 阶矩阵,迭代公式如下:()()()()()()()00001211,,,()/1,2,,;0,1,T n n k k ii ij j ii j j ix x x x x b a x a i n k +=≠⎧=⎪⎪⎪=-⎨⎪⎪==⎪⎩∑初始向量表示迭代次数(4-2) 在运行程序时首先需要手动输入矩阵A ,阶数n 、向量b 和初始向量x 0,根据式(4-2)不断迭代可求解得近似解。

分别用 jacobi 迭代法和 gauss-seidel 迭代法,求解方程组

分别用 jacobi 迭代法和 gauss-seidel 迭代法,求解方程组

分别用 jacobi 迭代法和 gauss-seidel 迭代法,求解方程组【jacobi 迭代法和 gauss-seidel 迭代法分别应用于方程组的求解】1. 引言在数学领域中,方程组的求解一直是一个重要的课题。

为了解决复杂的线性方程组,人们提出了各种迭代方法,其中 jacobi 迭代法和gauss-seidel 迭代法是两种常见的方法。

本文将探讨这两种迭代方法在求解方程组中的应用。

2. jacobi 迭代法的原理和应用jacobi 迭代法是一种基于逐次逼近的迭代方法。

对于线性方程组AX=B,其中 A 是系数矩阵,X 是未知数向量,B 是已知向量。

我们可以通过以下公式进行逐次逼近:X(k+1) = D^(-1)*(B - (L+U)X(k))其中,D、L、U 分别是 A 的对角线、下三角和上三角矩阵。

jacobi 迭代法的优点在于易于理解和实现,但在收敛速度上较慢,需要进行多次迭代才能得到精确解。

在实际应用中,需要根据实际情况选择合适的迭代次数。

3. gauss-seidel 迭代法的原理和应用与 jacobi 迭代法类似,gauss-seidel 迭代法也是一种基于逐次逼近的迭代方法。

不同之处在于,gauss-seidel 迭代法在计算 X(k+1) 时利用了已经得到的 X(k) 的信息,即:X(k+1)_i = (B_i - Σ(A_ij*X(k+1)_j,j≠i))/A_ii这种方式使得 gauss-seidel 迭代法的收敛速度较快,通常比 jacobi 迭代法更快,尤其是对于对角占优的方程组。

4. 分别用 jacobi 迭代法和 gauss-seidel 迭代法求解方程组为了更具体地说明 jacobi 迭代法和 gauss-seidel 迭代法的应用,我们分别用这两种方法来求解以下方程组:2x1 + x2 = 9x1 + 3x2 = 11我们将该方程组写成矩阵形式 AX=B:|2 1| |x1| |9||1 3| * |x2| = |11|我们根据 jacobi 迭代法和 gauss-seidel 迭代法的原理,依次进行迭代计算,直到满足收敛条件。

线性方程组的几种求解方法

线性方程组的几种求解方法

线性方程组的几种求解方法1.高斯消元法高斯消元法是求解线性方程组的一种常用方法。

该方法的基本思想是通过对方程组进行一系列简化操作,使得方程组的解易于求得。

首先将方程组表示为增广矩阵,然后通过一系列的行变换将增广矩阵化为行简化阶梯形,最后通过回代求解出方程组的解。

2.列主元高斯消元法列主元高斯消元法是在高斯消元法的基础上进行改进的方法。

在该方法中,每次选取主元时不再仅仅选择当前列的第一个非零元素,而是从当前列中选取绝对值最大的元素作为主元。

通过选取列主元,可以避免数值稳定性问题,提高计算精度。

3.LU分解法LU分解法是一种将线性方程组的系数矩阵分解为一个下三角矩阵L 和一个上三角矩阵U的方法。

首先进行列主元高斯消元法得到行阶梯形矩阵,然后对行阶梯形矩阵进行进一步的操作,得到L和U。

最后通过回代求解出方程组的解。

4.追赶法(三角分解法)追赶法也称为三角分解法,适用于系数矩阵是对角占优的三对角矩阵的线性方程组。

追赶法是一种直接求解法,将系数矩阵分解为一个下三角矩阵L和一个上三角矩阵U,然后通过简单的代数运算即可求得方程组的解。

5.雅可比迭代法雅可比迭代法是一种迭代法,适用于对称正定矩阵的线性方程组。

该方法的基本思想是通过不断迭代求解出方程组的解。

首先将方程组表示为x=Bx+f的形式,然后通过迭代计算不断逼近x的解。

6.高斯-赛德尔迭代法高斯-赛德尔迭代法是雅可比迭代法的改进方法。

该方法在每一次迭代时,使用已经更新的解来计算新的解。

相比于雅可比迭代法,高斯-赛德尔迭代法的收敛速度更快。

7.松弛因子迭代法松弛因子迭代法是一种对高斯-赛德尔迭代法的改进方法。

该方法在每一次迭代时,通过引入松弛因子来调节新解与旧解之间的关系。

可以通过选择合适的松弛因子来加快迭代速度。

以上是一些常用的线性方程组求解方法,不同的方法适用于不同类型的线性方程组。

在实际应用中,根据问题的特点和要求选择合适的求解方法可以提高计算的效率和精度。

雅可比迭代法和高斯-塞德尔迭代法求解线性方程组

雅可比迭代法和高斯-塞德尔迭代法求解线性方程组

实验报告内容一 实验目的与要求(实验题目)1.分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组使得误差不超过 2.用不动点迭代法求方程的实根:02010223=-++x x x二 模型建立(相关主要计算公式)1. 雅可比迭代法⎩⎨⎧[],...,,k ,n ,...,i x a b a x n i j j )k (j j i i ii )k (i 21021111==∑-=≠=+ 其中()()()()()T n x ,...x ,x x 002010=为初始向量.2.高斯-塞德尔迭代法⎩⎨⎧[],...,,k ,n ,,i x a x a b a x i j n i j )k (j ij )k (j ij i ii )k (i 21021111111==∑∑--=-=+=++3.不动点迭代法• ...1,0),(1==+k x xk k ϕ三、 实验过程、步骤(程序)1. 雅可比迭代法#include "stdio.h"#include "math.h"#include "string.h"main(){⎪⎩⎪⎨⎧=++=-+=+-3612363311420238321321321x x x x x x x x x 410-int i,j,k;float m1=0.0,m2=0.0;float a[3][4]={8,-3,2,20,4,11,-1,33,6,3,12,36};float x[3]={0.0,0.0,0.0};for(k=1;k<=10;){for(i=0;i<=2;i++){for(j=0;j<i;j++)m1=m1+a[i][j]*x[j];for(j=i+1;j<=2;j++)m2=m2+a[i][j]*x[j];x[i]=(a[i][3]-m1-m2)/a[i][i];m1=0,m2=0;}k++;}printf("雅可比迭代法计算结果为:\n");for(i=0;i<=2;i++)printf("x[%2d]=%8.9f\n",i+1,x[i]);}2高斯-塞德尔迭代法#include<stdio.h>#include<math.h># define n 3void main(){int i,j,k=1;float x[n]={0,0,0},m[n]={0,0,0},s=1;float a[n][n]={8,-3,2,4,11,-1,6,3,12},d[n]={20,33,36}; printf("高斯-塞德尔迭代法运算结果为:\n");for(k=0;fabs(s-x[0])>1e-6;k++){s=x[0];for(i=0;i<n;i++){m[i]=0;for(j=0;j<n;j++) m[i]=m[i]-a[i][j]*x[j];m[i]=m[i]+d[i]+a[i][i]*x[i];x[i]=m[i]/a[i][i];}printf("Y1=%f Y2=%f Y3=%f\n",x[0],x[1],x[2]); }getchar() ;}3.#include <stdio.h>#include <math.h>double f( double x ){return x * x * x + 2 * x * x + 10 * x - 20;}double fdx( double x ){return 3 * x * x + 18.4 * x + 16.7;}int main( ){int t1 = 0, t2 = 1;double x[ 2 ], ep = 1e-8;x[ 0 ] = 0;do{t1 = 1 - t1;t2 = 1 - t2;x[ t1 ] = x[ t2 ] - f( x[ t2 ] ) / fdx( x[ t2 ] );}while( fabs( x[ t1 ] - x[ t2 ] ) > ep );printf("解得x=%lf\n", x[ t1 ]);return 0;}四.实验结果:1.雅可比迭代法:2.高斯-塞德尔迭代法:.3.不动点迭代法:五.实验小结通过这次上机,学会了用Jacobis迭代法,高斯-塞德尔迭代法求解线性方程组,算法程序比较复杂,特别是要多次使用数组条件及for循环语句。

线性方程组的四种数值解法

线性方程组的四种数值解法

线性方程组的四种数值解法(电子科技大学物理电子学院,四川 成都 610054)摘要:本文介绍了四种求解线性方程组的数值解法: 雅克比迭代法、高斯赛德尔迭代法、高斯消去法和改进的平方根法的基本原理和算法流程,通过求解具体方程,对四种求解方法进行了对比。

对于雅克比迭代法和高斯赛德尔迭代法,研究了两种算法对求解同一方程组的迭代效率差异,结果表明高斯赛德尔迭代法达到同样精度所需迭代次数较少。

对于高斯消去法,通过选择列主元的方法提高算法的准确度,计算结果表明高斯消去法计算精确,且运算复杂度也不是很高。

对于改进的平方根法,其运算复杂度低,但对于给定的方程组有着严苛的要求。

关键词:雅克比迭代法;高斯赛德尔迭代法;高斯消去法;改进的平方根法;线性方程组引言线性方程组的求解在日常生活和科研中有着极其重要的应用,但在实际运算中,当矩阵的维数较高时,用初等方法求解的计算复杂度随维数的增长非常快,因此,用数值方法求解线性方程组的重要性便显现出来。

经典的求解线性方程组的方法一般分为两类:直接法和迭代法。

前者例如高斯消去法,改进的平方根法等,后者的例子包括雅克比迭代法,高斯赛德尔迭代法等。

这些方法的计算复杂度在可以接受的范围内,因此被广泛采用。

一般来说,直接法对于阶数比较低的方程组比较有效;而后者对于比较大的方程组更有效。

在实际计算中,几十万甚至几百万个未知数的方程组并不少见。

在这些情况下,迭代法有无可比拟的优势。

另外,使用迭代法可以根据不同的精度要求选择终止时间,因此比较灵活。

在问题特别大的时候,计算机内存可能无法容纳被操作的矩阵,这给直接法带来很大的挑战。

而对于迭代法,则可以将矩阵的某一部分读入内存进行操作,然后再操作另外部分。

本文使用上述四种算法求解对应的方程组,验证各种算法的精确度和计算速度。

1 算法介绍1.1 雅克比迭代法 1.1.1 算法理论设线性方程组(1)b Ax的系数矩阵A 可逆且主对角元素 均不为零,令并将A 分解成(2)从而(1)可写成令其中. (3)以B 1为迭代矩阵的迭代法(公式)(4)称为雅克比(Jacobi)迭代法(公式),用向量的分量来表示,(4)为(5)其中为初始向量.1.1.2 算法描述 1给定迭代初始向量X 0以及误差要求delta 2根据雅克比迭代公式计算出下一组向量3判断X 是否满足误差要求,即||X k+1 – X k || < delta4若误差满足要求,则停止迭代返回结果;若否,则返回第二步进行下一轮迭代1.2 高斯赛德尔迭代法nna ,...,a ,a 2211()nna ,...,a ,a diag D 2211=()D D A A +-=()b x A D Dx +-=11f x B x +=b D f ,A D I B 1111--=-=()()111f x B x k k +=+⎩⎨⎧[],...,,k ,n ,...,i x a ba xnij j )k (j j i iii)k (i21021111==∑-=≠=+()()()()()Tn x ,...x ,x x 002010=1.2.1 算法理论由雅克比迭代公式可知,在迭代的每一步计算过程中是用的全部分量来计算的所有分量,显然在计算第i 个分量时,已经计算出的最新分量没有被利用,从直观上看,最新计算出的分量可能比旧的分量要好些.因此,对这些最新计算出来的第次近似的分量加以利用,就得到所谓解方程组的高斯—塞德尔(Gauss-Seidel )迭代法.把矩阵A 分解成(6)其中,分别为的主对角元除外的下三角和上三角部分,于是,方程组(1)便可以写成即其中(7)以为迭代矩阵构成的迭代法(公式)(8)称为高斯—塞德尔迭代法(公式),用变量表示的形式为(9)1.2.2 算法描述 1给定迭代初始向量X 0以及误差要求delta2根据高斯赛德尔迭代公式计算出下一组向量()k x ()1+k x ()1+k ix ()()1111+-+k i k x ,...,x 1+k()1+k x()1+k jx U L D A --=()nna ,...,a ,a diag D 2211=U ,L --A ()b Ux x L D +=-22f x B x +=()()b L D f ,U L D B 1212---=-=2B ()()221f x B x k k +=+⎩⎨⎧[],...,,k ,n ,,i x a x a b a xi j n i j )k (j ij )k (j ij i ii)k (i21021111111==∑∑--=-=+=++3判断X是否满足误差要求,即||X k+1– X k|| < delta4若误差满足要求,则停止迭代返回结果;若否,则返回第二步进行下一轮迭代1.3 高斯消去法1.3.1 算法理论下面三种变换称为初等行变换:1.对调两行;2.以数k≠0乘某一行中的所有元素;3.把某一行所有元素的k倍加到另一行对应的元素上去。

雅克比迭代法和高斯-赛德尔法解线性方程组(C++)

雅克比迭代法和高斯-赛德尔法解线性方程组(C++)

作业:①分别用J 法和G -S 法求解下列方程,并讨论结果。

123122*********x x x -⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪= ⎪⎪ ⎪ ⎪⎪ ⎪⎝⎭⎝⎭⎝⎭#include<iostream>using namespace std;//J 法解线性方程int main(){int m,n,i,j,times=0,mtimes;double s,sum,max;cout<<"请输入系数矩阵行数m 、列数n :"<<endl; cin>>m>>n;if(m<n)cout<<"方程组无唯一解!"<<endl;double **A=new double *[m];for (i=0; i<m; i++) {A[i] =new double [n];}double *B=new double [m];double *X=new double [m];double *T=new double [m];double *S=new double [m];cout<<"请输入系数矩阵A :"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>A[i][j];cout<<"请输入常数向量B :"<<endl;for(i=0;i<m;i++)cin>>B[i];cout<<"请输入最大允许误差s:"<<endl; cin>>s;cout<<"请输入最大迭代次数:"<<endl;cin>>mtimes;cout<<"请输入一零级向量X:"<<endl;for(i=0;i<m;i++){cin>>X[i];T[i]=X[i];//T[]存放上一次迭代结果 }do{for(i=0;i<m;i++){sum=0;for(j=0;j<n;j++)if(j!=i)sum+=A[i][j]*T[j];X[i]=(B[i]-sum)/A[i][i];S[i]=(T[i]-X[i])*(T[i]-X[i]);}for(i=0;i<m;i++)T[i]=X[i];times++;max=S[0];for(i=1;i<m;i++)if(S[i]>max)max=S[i];}while((max>s*s)&&(times<mtimes));cout<<"该方程组的解为:"<<endl;for(i=0;i<m;i++)cout<<X[i]<<" ";cout<<endl<<"迭代次数为:"<<times<<endl;for (i=0; i<m; i++){delete[] A[i];A[i]=NULL;}delete[] A; A=0;delete[] B; B=0;delete[] T; T=0;delete[] X; X=0;delete[] S; S=0;return 0;}#include<iostream>using namespace std;//G-S法解线性方程int main(){int m,n,i,j,times=0,mtimes;double s,sum,sum1,max;cout<<"请输入系数矩阵行数m、列数n:"<<endl;cin>>m>>n;if(m<n)cout<<"方程组无唯一解!"<<endl;double **A=new double *[m];for (i=0; i<m; i++) {A[i] =new double [n];}double *B=new double [m];double *X=new double [m];double *T=new double [m];double *S=new double [m];cout<<"请输入系数矩阵A:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++)cin>>A[i][j];cout<<"请输入常数向量B:"<<endl;for(i=0;i<m;i++)cin>>B[i];cout<<"请输入最大允许误差s:"<<endl;cin>>s;cout<<"请输入最大迭代次数:"<<endl;cin>>mtimes;cout<<"请输入一零级向量X:"<<endl;for(i=0;i<m;i++){cin>>X[i];T[i]=X[i];//T[]存放上一次迭代结果}do{for(i=0;i<m;i++){sum=sum1=0;for(j=0;j<i;j++)sum+=A[i][j]*X[j];for(j=i+1;j<n;j++)sum1+=A[i][j]*T[j];X[i]=(B[i]-sum-sum1)/A[i][i];S[i]=(T[i]-X[i])*(T[i]-X[i]);}for(i=0;i<m;i++)T[i]=X[i];times++;max=S[0];for(i=1;i<m;i++)if(S[i]>max)max=S[i];}while((max>s*s)&&(times<mtimes));cout<<"该方程组的解为:"<<endl;for(i=0;i<m;i++)cout<<X[i]<<" ";cout<<endl<<"迭代次数为:"<<times<<endl;for (i=0; i<m; i++){delete[] A[i];A[i]=NULL;}delete[] A; A=0;delete[] B; B=0;delete[] T; T=0;delete[] X; X=0;delete[] S; S=0;return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

作业:①
分别用J 法和G -S 法求解下列方程,并讨论结果。

123122*********x x x -⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪= ⎪⎪ ⎪ ⎪⎪ ⎪⎝⎭⎝⎭⎝⎭
#include<iostream>
using namespace std;
//J 法解线性方程
int main(){
int m,n,i,j,times=0,mtimes;
double s,sum,max;
cout<<"请输入系数矩阵行数m 、列数n :"<<endl; cin>>m>>n;
if(m<n)
cout<<"方程组无唯一解!"<<endl;
double **A=new double *[m];
for (i=0; i<m; i++) {
A[i] =new double [n];
}
double *B=new double [m];
double *X=new double [m];
double *T=new double [m];
double *S=new double [m];
cout<<"请输入系数矩阵A :"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>A[i][j];
cout<<"请输入常数向量B :"<<endl;
for(i=0;i<m;i++)
cin>>B[i];
cout<<"请输入最大允许误差s:"<<endl; cin>>s;
cout<<"请输入最大迭代次数:"<<endl;
cin>>mtimes;
cout<<"请输入一零级向量X:"<<endl;
for(i=0;i<m;i++){
cin>>X[i];
T[i]=X[i];//T[]存放上一次迭代结果 }
do{
for(i=0;i<m;i++){
sum=0;
for(j=0;j<n;j++)
if(j!=i)
sum+=A[i][j]*T[j];
X[i]=(B[i]-sum)/A[i][i];
S[i]=(T[i]-X[i])*(T[i]-X[i]);
}
for(i=0;i<m;i++)
T[i]=X[i];
times++;
max=S[0];
for(i=1;i<m;i++)
if(S[i]>max)
max=S[i];
}while((max>s*s)&&(times<mtimes));
cout<<"该方程组的解为:"<<endl;
for(i=0;i<m;i++)
cout<<X[i]<<" ";
cout<<endl<<"迭代次数为:"<<times<<endl;
for (i=0; i<m; i++){
delete[] A[i];
A[i]=NULL;
}
delete[] A; A=0;
delete[] B; B=0;
delete[] T; T=0;
delete[] X; X=0;
delete[] S; S=0;
return 0;
}
#include<iostream>
using namespace std;
//G-S法解线性方程
int main(){
int m,n,i,j,times=0,mtimes;
double s,sum,sum1,max;
cout<<"请输入系数矩阵行数m、列数n:"<<endl;
cin>>m>>n;
if(m<n)
cout<<"方程组无唯一解!"<<endl;
double **A=new double *[m];
for (i=0; i<m; i++) {
A[i] =new double [n];
}
double *B=new double [m];
double *X=new double [m];
double *T=new double [m];
double *S=new double [m];
cout<<"请输入系数矩阵A:"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>A[i][j];
cout<<"请输入常数向量B:"<<endl;
for(i=0;i<m;i++)
cin>>B[i];
cout<<"请输入最大允许误差s:"<<endl;
cin>>s;
cout<<"请输入最大迭代次数:"<<endl;
cin>>mtimes;
cout<<"请输入一零级向量X:"<<endl;
for(i=0;i<m;i++){
cin>>X[i];
T[i]=X[i];//T[]存放上一次迭代结果}
do{
for(i=0;i<m;i++){
sum=sum1=0;
for(j=0;j<i;j++)
sum+=A[i][j]*X[j];
for(j=i+1;j<n;j++)
sum1+=A[i][j]*T[j];
X[i]=(B[i]-sum-sum1)/A[i][i];
S[i]=(T[i]-X[i])*(T[i]-X[i]);
}
for(i=0;i<m;i++)
T[i]=X[i];
times++;
max=S[0];
for(i=1;i<m;i++)
if(S[i]>max)
max=S[i];
}while((max>s*s)&&(times<mtimes));
cout<<"该方程组的解为:"<<endl;
for(i=0;i<m;i++)
cout<<X[i]<<" ";
cout<<endl<<"迭代次数为:"<<times<<endl;
for (i=0; i<m; i++){
delete[] A[i];
A[i]=NULL;
}
delete[] A; A=0;
delete[] B; B=0;
delete[] T; T=0;
delete[] X; X=0;
delete[] S; S=0;
return 0;
}。

相关文档
最新文档