⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 迭代法求解方程组,包括雅可比迭代法
💻 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 + -