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

📄 sor方法

📁 SOR法解线性方程组(逐次超松弛法)是Gauss-Seidel的改进方法
💻
字号:
#include<iostream>
#include<iomanip>
#include<cmath> // fabs();
using namespace std;

void SolveEquation(const int &dim)
{
      double *Arr = new double[dim*dim]; //方程矩阵
   double *B   = new double[dim];  //方程右端系数
  double *X   = new double[dim];  //初始解 
   double *dX  = new double[dim];
   double e;      //解的精度
   double w;      //w==1时,为GS迭代  
   double S, S1; 
   const int N  = 5000;    //最大叠代次数,防止死机
   bool  hasSolved = false;
   cout << endl << "初始化方程组左端系数矩阵!" << endl;
   for (int i=0; i<dim; i++)
   {
     for (int j=0; j<dim; j++){
       cout << "Arr[" << i << "][" << j << "]: ";
       cin  >> Arr[i*dim+j];
     }
   }
   cout << "初始化方程组右端系数矩阵!" << endl;
   for (i=0; i<dim; i++)
   {
    cout << "B[" << i << "]: ";
     cin  >> B[i];
   }  
   system("cls");
   cout << "方程组如下: " << endl << endl;
   for (i=0; i<dim; i++)
   {
     for (int j=0; j<dim; j++)
     {
       cout << setw(8) << Arr[i*dim+j] << " X" << j+1;
       if  (j < dim-1) cout << " + ";
       else if (j == dim-1) cout << " = ";
     }
     cout << setw(8) << B[i] << endl;
   }
   cout << endl << "设置解的精度要求:(比如1e-6)" << endl;
   cin  >> e;

LOOP:   
   cout << endl;
   cout << "输入初始向量!" << endl;
   for (i=0; i<dim; i++){
     cout << "X[" << i+1 << "]: ";
     cin  >> X[i];
   }
   cout << endl << "设置参数 ω ( 0<ω<2 )!" << endl;
   cin  >> w;
   for (int k=0; k<N; k++)  //3-8
   {
     S = 0.0;
     for (i=0; i<dim; i++) //5-7
     {
       double sum = 0.0;
       for (int j=0; j<dim; j++){
         sum += Arr[i*dim+j]*X[j];
       }
       if (fabs(Arr[i*dim+i]) < 1e-10){
         cout << "被零除!" << endl << Arr[i*dim+i] << endl;
         exit(0);
       }   
       dX[i] = w * (B[i] - sum) / Arr[i*dim+i];
       S1 = dX[i];
       if (fabs(S1) > fabs(S)) S = S1;
       X[i] = X[i] + S1;
     }  
     if (fabs(S) <= e)
     {
       hasSolved = true;
       system("cls");
       cout << "线性方程组的解为:" << endl;
       for (int t=0; t<dim; t++)
         cout << "X" << t+1 << "=" << X[t] << "\t";
       cout << endl;
       break;
     }
   }
   if (!hasSolved) {
      cout << "初始向量或 ω 不合理, 请重新设置!" << endl;
      goto LOOP;  
   }
   delete[] Arr;
   delete[] B;
   delete[] X;
   delete[] dX;
}

void main()
{
   int  dim; 
   cout << "输入线性方程组未知数个数: ";
   cin  >> dim; 
   SolveEquation(dim);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -