?? sor迭代算法.cpp
字號:
//SOR1迭法算法
//計算機科學與技術(2)班 林山 200530472104 24號
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
void main()
{
int n,M;
double e,W;
cout<<"*****SOR迭代法算法*****"<<endl;
cout<<"請輸入矩陣A的階數n:"<<endl;
cout<<"n= ";
cin>>n;
double **A=new double*[n+1];
for(int i=1;i<=n;i++) { A[i]=new double [n+1]; }
cout<<"請依次輸入矩陣A的各元素:"<<endl;
for(i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
{ cout<<"A["<<i<<"]["<<j<<"]= ";
cin>>A[i][j];
}
}
double *B=new double [n+1];
cout<<"請輸入右端項的各元素:"<<endl;
for(i=1;i<=n;i++)
{ cout<<"b"<<i<<"=\t";
cin>>B[i];
}
double *y=new double [n+1];
cout<<"請輸入初始向量y:"<<endl;
for(i=1;i<=n;i++)
{ cout<<"y["<<i<<"]= ";
cin>>y[i]; }
cout<<"請輸入松弛因子W:"<<endl;
cin>>W;
cout<<"請輸入容許誤差e:"<<endl;
cin>>e;
cout<<"請輸入容許最大迭代次數M:"<<endl;
cin>>M;
int k=1;
double *g=new double [n+1];
double *x=new double [n+1];
for(i=1;i<=n;i++) { x[i]=y[i]; }
for(i=1;i<=n;i++)
{ if(fabs(A[i][i])<e)
{ cout<<"求解失敗!"<<endl;
exit(0);
}
else
{ double T;
T=A[i][i];
for(int j=1;j<=n;j++)
{ A[i][j]=-W*A[i][j]/T;
A[i][i]=1-W;
g[i]=W*B[i]/T;
}
}
}
L: for(i=1;i<=n;i++)
{ double sum=0;
for(int j=1;j<=n;j++)
{ sum+=A[i][j]*x[j]; }
sum-=A[i][i];
x[i]=sum+g[i];
}
double fan=fabs(x[1]-y[1]);
for(int m=2;m<=n;m++)
{ fan=+fabs(x[m]-y[m]); }
if(fan<e)
{ cout<<"所求方程組的解是:"<<endl;
for(int i=1;i<=n;i++) { cout<<"x["<<i<<"]= "<<x[i]<<endl; }
cout<<"運算的迭代次數為 "<<k<<" 次."<<endl;
exit(0);
}
else
{ if(k<M)
{ k++;
for(int i=1;i<=n;i++) { y[i]=x[i]; }
goto L;
}
else
{ cout<<"求解失敗!"<<endl;
cout<<"請減小容許誤差e或增大容許最大迭代次數M的值."<<endl;
exit(0);
}
}
delete []x; delete []y; delete [] g;
delete []A; delete []B;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -