📄 20036127002姜永洪(sor).cpp
字号:
#include<iostream.h>
#include<math.h>
void revolve(double **A,int n,double**E)
{
int i,j,k,l;
double**X,t,temp,*g,d;
X=new double*[n];
g=new double[n];
for(i=0;i<n;i++)
{
X[i]=new double[n];
}
for(i=0;i<n;i++) //设置单位阵
{
for(j=0;j<n;j++)
{
if(i==j)
X[i][j]=1;
else
X[i][j]=0;
}
}
for(k=0;k<n;k++) //选主元
{
l=k;
d=A[k][k];
for(j=k;j<n;j++)
{
if(fabs(A[k][j])>fabs(d))
{
d=A[k][j];
l=j;
}
}
if(l!=k) //交换行
{
for(j=k;j<n;j++)
{
t=A[k][j];
A[k][j]=A[l][j];
A[l][j]=t;
}
for(j=0;j<n;j++)
{
temp=X[k][j];
X[k][j]=X[l][j];
X[l][j]=temp;
}
}
for(i=0;i<n;i++) //计算乘数
{
if(i!=k)
{
g[i]=-A[i][k]/A[k][k];
}
else
{
g[i]=1/A[k][k];
}
}
for(i=0;i<n;i++)
{
if(i!=k)
{
for(j=k+1;j<n;j++)
{
A[i][j]+=g[i]*A[k][j];
}
for(j=0;j<n;j++)
{
X[i][j]+=g[i]*X[k][j];
}
}
}
for(j=k;j<n;j++)
{
A[k][j]*=g[k];
}
for(j=0;j<n;j++)
{
X[k][j]*=g[k];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
E[i][j]=X[i][j];
}
}
}
// 矩阵乘法
void multiply(double**A,double**B,double **H,int n)
{
int i,j,k;
double t;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
t=0;
for(k=0;k<n;k++)
{
t+=A[i][k]*B[k][j];
H[i][j]=t;
}
}
}
}
void main ()
{
int i,j,n,k=0,Max;
double **A,*B,**L,**D,**U,**E,*Q,**H,**F;
double*X1,*X2,w=1.45,eps,t,temp;
cout<<"Input the n:\n";
cin>>n;
A=new double*[n];
E=new double*[n];
F=new double*[n];
H=new double*[n];
L=new double*[n];
D=new double*[n];
U=new double*[n];
Q=new double[n];
X1=new double[n];
X2=new double[n];
B=new double[n];
for(i=0;i<n;i++) //申请2维空间
{
A[i]=new double[n];
E[i]=new double[n];
F[i]=new double[n];
H[i]=new double[n];
L[i]=new double[n];
D[i]=new double[n];
U[i]=new double[n];
}
cout<<"输入加速因子 w:"<<endl;
cin>>w;
cout<<"迭代精度 eps:"<<endl;
cin>>eps;
cout<<"迭代最大值 Max:"<<endl;
cin>>Max;
cout<<"迭代的初值:"<<endl;
for(i=0;i<n;i++)
{
cout<<"X1["<<i+1<<"]=";
cin>>X1[i];
// X1[i]=1;
}
cout<<"input the matrixa:"<<endl; //输入矩阵
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<"]["<<j+1<<"]=";
cin>>A[i][j];
}
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) // D
{
if(i!=j)
D[i][j]=0;
else
D[i][i]=A[i][i];
}
for(j=0;j<n;j++) // U
{
if(i>j||i==j)
U[i][j]=0;
else
U[i][j]=A[i][j];
}
for(j=0;j<n;j++) //L
{
if(i<j||i==j)
L[i][j]=0;
else
L[i][j]=A[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
E[i][j]=D[i][j]+w*L[i][j];
}
B[i]=B[i]*w;
}
revolve(E,n,F); //函数调用 求逆
for(i=0;i<n;i++)
{
t=0;
for(j=0;j<n;j++)
{
U[i][j]=(1-w)*D[i][j]-w*U[i][j];
}
for(j=0;j<n;j++)
{
t+=F[i][j]*B[j];
Q[i]=t;
}
}
multiply(F,U,H,n); //函数调用 矩阵乘法
do
{
k++;
t=0;
for(i=0;i<n;i++)
{
temp=0;
for(j=0;j<n;j++)
{
temp+=H[i][j]*X1[j];
X2[i]=Q[i]+temp;
}
t+=fabs(X2[i]-X1[i]);
}
/* for(i=0;i<n;i++)
{
t=0;
temp=fabs(X2[i]-X1[i]);
if(temp>t)
t=temp;
}*/
for(i=0;i<n;i++)
{
X1[i]=X2[i];
}
}while(t>eps && k<Max);
cout<<"输出结果:"<<endl;
for(i=0;i<n;i++)
{
cout<<"X["<<i+1<<"]="<<X1[i];
cout<<endl;
}
cout<<"迭代次数:"<<endl;
cout<<k<<endl;
cout<<"迭代精度:"<<endl;
cout<<t<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -