用C ++求解线性方程组的程序

时间:2016-06-08 11:52:45

标签: c++

我正在使用这个简单的2方程系统(矩阵形式" Mat [2] [3]")测试此代码来解决线性系统,但是当我执行它时,我获得以下内容结果,这与我在系统矩阵中引入的系数不一致:

CODE:

//Gauss Elimination
#include <iostream>
#include <cmath>
#include <vector>
#include <fstream>
#include <iterator>
#include <string>
#include <iomanip>
using namespace std;

int main() {

    double Mat[2][3];
    vector<double> q(2);
    int Nx = 2, ii, jj, kk;

    Mat[1][1] = 2.0;
    Mat[1][2] = 3.0;
    Mat[1][3] = 2.5;
    Mat[2][1] = 1.3;
    Mat[2][2] = 3.0;
    Mat[2][3] = 2.5;         

    cout << "Matrix: " << endl;     
    for (ii = 0; ii < Nx; ii++) {
        for (jj = 0; jj < Nx + 1; jj++) {
            cout << Mat[ii][jj] << "   ";
            cout << endl;
        }
    }
    // Triangularization
    for (ii = 0; ii < Nx - 1; ii++)
        for (kk = ii + 1; kk < Nx; kk++)
        {
            double t = Mat[kk][ii] / Mat[ii][ii];
            for (jj = 0; jj <= Nx; jj++)
                Mat[kk][jj] = Mat[kk][jj] - t * Mat[ii][jj];
        }   // Resolution
    for (ii = Nx - 1; ii >= 0; ii--)
    {
        q[ii] = Mat[ii][Nx];
        for (jj = Nx - 1; jj > ii; jj--)                        
            q[ii] = q[ii] - Mat[ii][jj] * q[jj];
        q[ii] = q[ii] / Mat[ii][ii];
    }

    cout << "Solution of the system: " << endl;
    cout << q[1] << endl;
    cout << q[2] << endl; ////////////////////////////////////////////////////////////////////////


    return 0;
}

结果:

Matrix: 
0   2.07496e-317   6.95314e-310   
0   2   3   
Solution of the system: 
-nan
0

2 个答案:

答案 0 :(得分:2)

首先,您应该始终格式化您的代码(现在就为您做了一些事情)。其次,C和C ++中的索引从0开始,因此最大允许索引为D-1,其中D是维度。这与例如MATLAB,索引从1开始。您的代码中有超出范围的访问权限,例如: Mat[1][3]=2.5;Mat被声明为double Mat[2][3];,因此最大行/列索引分别为12q显示时q[1]应为q[0]q[2]应为q[1]。您的代码将导致未定义的行为。在打开所有警告的情况下编译代码,即gcc上的-Wall -Wextra很可能会捕获这些错误。另外,请确保您的for循环也不会超出范围。

作为旁注,您还可以直接将矩阵初始化为:

double Mat[2][3] = { {a,b,c}, {d,e,f} }; // where a, b etc are the coefficients

答案 1 :(得分:1)

我强烈建议您仔细阅读此页面。它对用高斯消元https://martin-thoma.com/solving-linear-equations-with-gaussian-elimination/

求解线性方程进行了更深入的分析

您的代码的主要问题是对矩阵的越界访问。数组元素的索引从false开始,这意味着通过pom.xml您的可访问元素具有索引0array[3]0

因此我修改了你的代码编辑:

1

使用Wolfram Alpha计算给定矩阵的结果,结果如下: this
并且2在Y轴上大约等于#include <iostream> using namespace std; int main() { const int Nx = 2; const int Ny = 3; double Mat[Nx][Ny]; double q[2]; Mat[0][0] = 2.0; Mat[0][1] = 3.0; Mat[0][2] = 2.5; Mat[1][0] = 1.3; Mat[1][1] = 3.0; Mat[1][2] = 2.5; cout << "Matrix: " << endl; for (int i = 0; i < Nx; i++) { for (int j = 0; j < Ny; j++) { cout << Mat[i][j] << " "; } cout << endl; } cout << endl; // Triangularization for (int i = 0; i < Nx - 1; i++) for (int h = i + 1; h < Nx; h++) { double t = Mat[h][i] / Mat[i][i]; for (int j = 0; j <= Nx; j++) { Mat[h][j] = Mat[h][j] - t * Mat[i][j]; } } // Resolution for (int i = Nx - 1; i >= 0; i--) { q[i] = Mat[i][Nx]; for (int j = Nx - 1; j > i; j--) { q[i] = q[i] - Mat[i][j] * q[j]; } q[i] = q[i] / Mat[i][i]; } cout << "Solution of the system: " << endl; cout << q[0] << endl; cout << q[1] << endl; return 0; } 。我没有设法在你的算法中找到X轴的错误,因为它返回5/6,这是另一个越界或只是一个数学错误,但希望这会给你一个开始。 / p>