【问题标题】:Gauss-Seidel Method To Solve Non-Linear Equations求解非线性方程的 Gauss-Seidel 方法
【发布时间】:2014-04-25 20:09:37
【问题描述】:

[已解决,谢谢] 我在 C++ 中开发了以下代码,以利用 Gauss-Seidel 方法求解线性方程,但在填充我无法弄清楚的数组时,我似乎在运行时遇到了问题。这是我的代码...

#include<stdio.h>
int main(void)
{
    float a[10][10],b[10],x[10],y[10];
    int n=0,m=0,i=0,j=0;
    printf("Enter size of 2d array(Square matrix) : ");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("Enter values no. %d %d :",i,j);
            scanf("%f",&a[i][j]);
        }
    }
    printf("\nEnter Values to the right side of equation\n");
    for(i=0;i<n;i++)
    {
            printf("Enter values no. %d :",i,j);
            scanf("%f",&b[i]);
    }
    printf("Enter initial values of x\n");
    for(i=0;i<n;i++)
    {
        printf("Enter values no. %d :",i);
        scanf("%f",&x[i]);
    }
    printf("\nEnter the no. of iteration : " );
    scanf("%d",&m);
    while(m>0)
    {
        for(i=0;i<n;i++)
        {
            y[i]=(b[i]/a[i][i]);
            for(j=0;j<n;j++)
            {
                if(j==i)
                    continue;
                y[i]=y[i]-((a[i][j]/a[i][i])*x[j]);
                x[i]=y[i];
            }
            printf("x%d = %f    ",i+1,y[i]);
        }
        printf("\n\n");
        m--;
    }
    return 0;

【问题讨论】:

  • 这不会编译。在我设法编译运行失败后。你能发布没有运行时错误的工作解决方案吗?
  • @privatedatapublicchannel2 先生,我正在努力解决 :(

标签: c++ linear-algebra equation


【解决方案1】:

您没有为EquationHolder 分配第二个维度。由于是二维矩阵,因此您还必须分配第二维。将您的双 for 循环更改为以下内容:

float ** EquationHolder=new float *[3];
for (int i=0; i<NumEquations; i++)
{
    EquationHolder[i] = new float[3];
    cout<<"Please Enter The Information Of Equation ("<<i+1<<")...\n";
    for (int j=0; j<NumEquations; j++)
    {
        cout<<"X"<<j+1<<": ";
        cin>>EquationHolder[i][j];
    }
}

但是我建议使用 std::vector&lt;std::vector&lt;double&gt;&gt; 而不是 C 原始数组,它更安全。

【讨论】:

  • 谢谢先生...非常感谢:)
【解决方案2】:

第一件事:

为所有数组分配存储空间:

int NumEquations=3;
// Equation Holder...
float ** EquationHolder= new float *[3];
for (int i=0; i<NumEquations; i++)
{
    EquationHolder[ i] = new float[3];
     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    cout<<"Please Enter The Information Of Equation ("<<i+1<<")...\n";
    for (int j=0; j<NumEquations; j++)
    {
        cout<<"X"<<j+1<<": ";
        cin>>EquationHolder[i][j];
    }
}

另外主程序有错误:

#include <iostream>
using namespace std;

void GaussSeidel(int Iterations, float **EquationHolder, 
                                   float *EquationResultHolder) {
    int InitialGuess = 0;
    float x1 = 0, x2 = 0, x3 = 0;
    while (InitialGuess < Iterations) {
        x1 = (1 / EquationHolder[0][0])* (EquationResultHolder[0]-
                ((EquationHolder[0][1]) * x2)-((EquationHolder[0][2]) * x3));
        x2 = (1 / EquationHolder[1][1])*(EquationResultHolder[1]-
                ((EquationHolder[1][0]) * x1)-((EquationHolder[1][2]) * x3));
        x3 = (1 / EquationHolder[2][2])*((EquationResultHolder[2]-
               ((EquationHolder[2][0]) * x1)-((EquationHolder[2][1]) * x2)));
        InitialGuess += 1;
        cout << "---------------------Iteration #" << InitialGuess 
                                     << "---------------------" << std::endl;
        cout << "X1: " << x1 << "\t" << x2 << "\t" << x3 << std::endl;
    }
}

用法:

int main() {
    int NumEquations = 3;
    // Equation Holder...
    float ** EquationHolder = new float *[3];
    for (int i = 0; i < NumEquations; i++) {
        EquationHolder[ i] = new float[3];
        cout << "Please Enter The Information Of Equation(" << i + 1 << ")...\n";
        for (int j = 0; j < NumEquations; j++) {
            cout << "X" << j + 1 << ": ";
            cin >> EquationHolder[i][j];
        }
    }
    //... as before

    for ( int i = 0; i < NumEquations; i++) {   // deallocate storage
        delete [] EquationHolder[ i];
    }
    delete [] EquationHolder;

    return 0;
}

输出:

(...)

请输入所需的迭代次数:9

----------迭代#1----------

X1:4 -2 1.42857

----------迭代#2----------

X1:4.14286 -2.83333 2.10204

(...)

----------迭代#9----------

X1:3.81631 -3.03054 2.36438

【讨论】:

  • 谢谢先生...非常感谢:)
【解决方案3】:

您没有初始化 EquationHolder 的行。添加这个:

float ** EquationHolder = new float *[3];
for(int i=0; i<NumEquations; i++)     // ADD
    EquationHolder[i] = new float[3]; // ADD

此外,我建议您使用 double 而不是 floatdouble 更精确,并且不易出现数字错误)。

【讨论】:

  • 谢谢先生...非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
相关资源
最近更新 更多