📄 1.cpp
字号:
# include <stdio.h>
# include <math.h>
# include <malloc.h>
float **a,*b,*x,e,w;
int n,c,k=1;
/*雅可比迭代法*/
void Jacobi(float y[])
{
int i,j;
float t=0.0,s=0.0,*x;
x=(float *)malloc(sizeof(float)*(n+1));
for(i=1;i<n+1;i++)
{
float t=0.0;
for(j=1;j<n+1;j++)
{
if(j==i)
continue;
t=t+a[i][j]*y[j];
}
x[i]=(b[i]-t)/a[i][i];
}
t=0.0;
for(i=1;i<n+1;i++)
{
s=fabs(x[i]-y[i]);
s=s*s;
t+=s;
}
t=sqrt(t);
for(i=1;i<n+1;i++)
y[i]=x[i];
if(t>e)
{
k++;
Jacobi(y);
}
else printf("\n实际迭代次数为%d次\n",k);
}
/*高斯-赛德尔代法*/
void Gauss_Siedel(float y[])
{
int i,j;
float t=0.0,s=0.0,*x;
x=(float *)malloc(sizeof(float)*(n+1));
for(i=1;i<n+1;i++)
{
t=0.0;
s=0.0;
for(j=1;j<i;j++)
t=t+a[i][j]*x[j];
for(j=i+1;j<n+1;j++)
s=s+a[i][j]*y[j];
x[i]=(b[i]-t-s)/a[i][i];
}
t=0.0;
for(i=1;i<n+1;i++)
{
s=fabs(x[i]-y[i]);
s=s*s;
t+=s;
}
t=sqrt(t);
for(i=1;i<n+1;i++)
y[i]=x[i];
if(t>e)
{
k++;
Gauss_Siedel(y);
}
else printf("\n实际迭代次数为%d次\n",k);
}
/*SOR迭代法*/
void SOR(float y[])
{
int i,j;
float t=0.0,s=0.0,*x;
x=(float *)malloc(sizeof(float)*(n+1));
for(i=1;i<n+1;i++)
{
t=0.0;
s=0.0;
for(j=1;j<i;j++)
t=t+a[i][j]*x[j];
for(j=i;j<n+1;j++)
s=s+a[i][j]*y[j];
x[i]=y[i]+w*(b[i]-t-s)/a[i][i];
}
t=0.0;
for(i=1;i<n+1;i++)
{
s=fabs(x[i]-y[i]);
s=s*s;
t+=s;
}
t=sqrt(t);
for(i=1;i<n+1;i++)
y[i]=x[i];
if(t>e)
{
k++;
SOR(y);
}
else
printf("\n实际迭代次数为%d次\n",k);
}
void main()
{
int i,j,choice;
printf("输入未知数个数:\n");
scanf("%d",&n);
a=(float **)malloc(sizeof(float)*(n+1));
for(i=0;i<n+1;i++)
a[i]=(float *)malloc(sizeof(float)*(n+1));
printf("\n\n输入系数:\n");
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
scanf("%f",&a[i][j]);
b=(float *)malloc(sizeof(float)*(n+1));
printf("\n输入右边项:\n");
for(i=1;i<n+1;i++)
scanf("%f",&b[i]);
x=(float *)malloc(sizeof(float)*(n+1));
printf("\n输入初始值:\n");
for(i=1;i<n+1;i++)
scanf("%f",&x[i]);
printf("\n输入精度:\n");
scanf("%f",&e);
printf("\n\n输入最大迭代次数:\n");
scanf("%d",&c);
printf("\n\n选择迭代方式\n\n");
printf("[1]雅可比迭代法\n");
printf("[2]高斯-赛德尔代法\n");
printf("[3]SOR迭代法\n\n");
scanf("%d",&choice);
if(choice==3)
{
printf("\n输入松弛因子w:\n");
scanf("%f",&w);
SOR(x);
}
if(choice==1)
Jacobi(x);
if(choice==2)
Gauss_Siedel(x);
printf("\n方程解为:\n");
for(i=1;i<n+1;i++)
printf("%f\n",x[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -