我正在使用这个简单的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
答案 0 :(得分:2)
首先,您应该始终格式化您的代码(现在就为您做了一些事情)。其次,C和C ++中的索引从0
开始,因此最大允许索引为D-1
,其中D
是维度。这与例如MATLAB,索引从1
开始。您的代码中有超出范围的访问权限,例如: Mat[1][3]=2.5;
,Mat
被声明为double Mat[2][3];
,因此最大行/列索引分别为1
和2
。 q
显示时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
您的可访问元素具有索引0
,array[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>