📄 sor.cpp
字号:
#include "math.h"
#include "stdio.h"
#include "conio.h"
#define N 4
#define MaxK 100
#define EPS 0.5e-5
static double aa[N][N]={{-4,1,1,1},{1,-4,1,1},{1,1,-4,1},{1,1,1,-4}};
static double bb[N]={1,1,1,1};
void main()
{
int i,j;
double x[N+1];
double a[N+1][N+1],b[N+1];
int Sor(double a[][N+1],double b[],double w,double x[]);
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
a[i][j]=aa[i-1][j-1];
b[i]=bb[i-1];
x[i]=0;
}
if(Sor(a,b,1.7,x)==1)
{
printf("the roots is:");
for(i=1;i<=N;i++)
printf(" x[%d]=%f ",i,x[i]);printf("\n");
}
else printf("\nthe G-S method failed!\n");
getch();
}
int Sor(double a[][N+1],double b[],double w,double x[])
//a传入系数矩阵(有效元素为a[1,1]...a[n,n]),b为方程组右边常数列
//x传入迭代初值并返回解向量(有效值为x[1]...x[n])
{int i,j,k=1;
double S,xx,p0,p;
while(true)
{printf("k=%d",k);
for(i=1;i<=N;i++){if(a[i][i]==0)
return 0;//存在元素akk为0
S=0.0;
for(j=1;j<=N;j++)
S+=a[i][j]*x[j];
xx=w*(b[i]-S)/a[i][i];
x[i]+=xx;
printf(" x[%d]=%f ",i,x[i]);}
printf("\n");
p0=0.0;
for(i=1;i<=N;i++){S=0.0;
for(j=1;j<=N;j++)
S+=a[i][j]*x[j];
p=b[i]-S;
if(fabs(p)>fabs(p0))
p0=p;}
if(fabs(p0)<=EPS)
return 1;//正常结束
if(k<MaxK)
k++;
else
return -2;//迭代次数越界
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -