The following iterative methods are used to solve the equations of linear systems
4-1 0-1 0) 0 0
-1 4-1 0-1 0 5
0-1 4-1 0-1-2
-1 0-1 4-1 0 5
0-1 0-1 4-1-2
0 0-1 0-1) 4 6
The convergence of the, and for the Mission | | xk+1-xk| | The approximate solution of 2<=0.0001 and the corresponding number of iterations.
(1) Jacobian iterative method;
(2) Gauss-Delphi iterative method;
(3) Sor iterative method (W in turn take 1.334,1.95,0.95)
Numerical calculation method of the operation, to the three iterations of the implementation of programming, so I followed the book on the formula knocked a bit, the function is basically realized.
Test data:
Input
6
4-1 0-1 0 0
-1 4-1 0-1 0
0-1 4-1 0-1
-1 0-1 4-1 0
0-1 0-1 4-1
0 0-1 0-1 4
0 5-2 5-2 6
The initial value of x is arbitrarily assigned.
#include <iostream> #include <stdio.h> #include <math.h> #include <stdlib.h> #include < string> #include <string.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <stack> #include <iomanip>using namespace std;typedef long long LL; const int Inf=0x7fffffff;const int MAXN=1000;CONST double wucha=0.0001;const int max_count=500;double A[MAXN][MAXN]; Double B[MAXN];d ouble CURX[MAXN];d ouble lastx[maxn];int n,count;double w;void init () {printf ("Enter unknown Number:"); cin>>n; printf ("Input equation set matrix a:\n"); for (int i=1;i<=n;i++) {for (int j=1;j<=n;j++) {cin>>a[i][j]; }} printf ("Input b vector: \ n"); for (int i=1;i<=n;i++) {cin>>b[i]; } Cout<<endl;} void Initx () {//Memset (curx,-1,sizeof (CurX)); cout<< "Please assign an initial value to x:" <<endl; for (int i=1;i<=n;i++) {cin>>curx[i]; }}bool judge () {double sum=0; for (int i=1;i<=n;i++) {sum+= (Curx[i]-lastx[i]) * (Curx[i]-lastx[i]); } sum=sqrt (sum); if (Sum<=wucha) return 1; else return 0;} void Shuchux () {cout<< "Iteration count:" <<Count<<endl; cout<< "Approximate solution for:"; for (int i=1;i<=n;i++) {cout<<curx[i]<< ""; } Cout<<endl<<endl;} void Jacobi () {//x Initial value is set to 0 cout<< "Jacobian iterative method:" <<endl; INITX (); int flag=0; Double sum; for (int. k=1;k<max_count;k++) {for (int i=1;i<=n;i++) {lastx[i]=curx[i]; } for (int i=1;i<=n;i++) {sum=0; for (int j=1;j<=n;j++) {if (i==j) continue; SUM+=A[I][J]*LASTX[J]; } curx[i]= (B[i]-sum)/a[i][i]; } if (judge ()) {flag=1; Count=k; Shuchux (); Break }} if (flag==0) cout<< "error! "<<endl<<endl;} void Gaisi_saideer () {cout<< "Gauss-Delphi Iteration Method:"<<endl; INITX (); int flag=0; Double sum; Double T; for (int k=1;k<max_count;k++) {double e=0; for (int i=1;i<=n;i++) {t=curx[i]; sum=0; for (int j=1;j<=n;j++) {if (i==j) continue; SUM+=A[I][J]*CURX[J]; } curx[i]= (B[i]-sum)/a[i][i]; if (Fabs (curx[i]-t) <=e) {} else {e=fabs (curx[i]-t); }} if (E<wucha) {flag=1; Count=k; Shuchux (); Break }} if (flag==0) cout<< "error! "<<endl<<endl;} void SOR () {cout<< "Successive hyper-relaxation iterative method (SOR):" <<endl; INITX (); cout<< "Input Relaxation factor W:" <<endl; cin>>w; int flag=0; Double sum1,sum2; for (int. k=1;k<max_count;k++) {for (int i=1;i<=n;i++) {lastx[i]=curx[i]; if (k==1) curx[i]=0; } for (int i=1;i<=n;i++) {sum1=0,sum2=0; for (int j=1;j<=i-1;j++) {sum1+=a[i][j]*curx[j];//cout<<curx[j]<< ""; }//cout<<endl; for (int j=i;j<=n;j++) {sum2+=a[i][j]*lastx[j]; } curx[i]= (B[I]-SUM1-SUM2) *w/a[i][i]+lastx[i]; } if (judge ()) {flag=1; Count=k; Shuchux (); Break }} if (flag==0) cout<< "error! "<<endl<<endl;} int main () {while (1) {init (); Jacobi (); Gaisi_saideer (); SOR (); SOR (); SOR (); } return 0;}
Three iterative solutions of equations (Jacobian Jacobi, Gaussian-gaisi_saideer, successive hyper-relaxation Sor)