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

📄 sor.cpp

📁 这是计算方法上的所有算法
💻 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 + -