1

我按照算法写了代码,结果不正确。根据算法,我们必须标明矩阵的维数并手动填写主矩阵A和向量B。我们需要生成一个LU矩阵。它已生成,但编号错误。最后,我们必须得到带有解的向量 X。这是在窗口模式下。 https://imgur.com/TSsjMXp

int N = 1; // matrix dimension
double R = 0;
typedef double Matrix [6][6];
typedef double Vec [6];
.
.
.
void Decomp (Matrix A, int N, int &Change)
{
int i, j, k ;
double R, L, U;
Change = 1;
R = Math::Abs(A[1][1]);
for(j=2; j<=N; j++)
    if (Math::Abs(A[j][1])>= R)
    {
        Change = j;
    R = Math::Abs(A[j][1]);
    }
    if (R<= 1E-7) 
    {
      MessageBox::Show("The system is degenerate");
    }
    if (k!=1)
    {
     for(i=1; i<=N; i++)
         { 
              R = A[Change][i];
              A[Change][i] = A[1][i];
               A[1][i] = R;
          }
    }
     for(i=2; i<=N; i++)
A[1][i] = A[1][i]/A[1][1];
for(i=2; i<=N; i++)
{
  for(k=i; k<=N; k++);
  {
    R = 0;
    for ( j=1; j<=(i-1); j++)
    R = R + A[k][j] * A[j][i];
    A[k][i] = A[k][i] - R;
  }
  if (A[i][i]<= 1E-7) 
    {
      MessageBox::Show("The system is degenerate[enter image description here][1]");
    }
  for(k = i+1; k<=N; k++)
  {
    R = 0;
    for (j=1; j<=(i-1); j++)
      R = R + A[i][j] * A[j][k];
    A[i][k] = (A[i][k] - R) / A[i][i];
  }
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
C_matrix_dgv->Rows[i]->Cells[j] -> Value = Convert::ToString(A[i+1][j+1]);
}
    }

void Solve (Matrix A, Vec b, Vec x, int Change, int N)
{
int i = 0,j = 0;
double R;
if (Change!=1)
{
  R = b[Change];
  b[Change] = b[1];
  b[1] = R;
}
b[1] = b[1]/A[1][1];
for(i=2; i<=N; i++)
{
  R = 0;
  for( j=1; j<=(i-1); j++)
    R = R + A[i][j] * b[j];
  b[i] = (b[i] - R) / A[i][i];
}
x[N] = b[N];
for( i=1; i<=(N-1); i++)
{
  R = 0;
  for(j = (N+1-i); j<=N; j++)
    R = R + A[N - i][j] * x[j];
  x[N - i] = b[N - i] - R;
}
}
4

1 回答 1

1
int N = 1; // matrix dimension

如果您在其余代码中使用它,您将无法获得正确的结果。矩阵的维数为6x6。使用 a std::arrayor std::vectorso 您不需要将大小保存在单独的变量中。

于 2019-11-29T18:43:47.707 回答