Почему я получаю разные результаты при решении одной и той же системы уравнений при использовании GSL и Octave? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь решить систему линейных уравнений Ax = b, где A - NxN-матрица x, а b - векторы длины N. Решение этой проблемы с C, использование GSL lib дает мне другие результаты, чем решение в Octave.

В этом примере (взято из документации GSL) N = 4, но у меня та же проблема с другими значениями N. Результаты, полученные в Octave, аналогичны результатам Matlab, и я попытался разложить LU и QR для решенияэта проблема в C, дала мне один и тот же результат, но отличается от той, что мне дал Octave.

Код октавы:

A = [ 0.18, 0.60, 0.57, 0.96;
      0.41, 0.24, 0.99, 0.5;
      0.14, 0.30, 0.97, 0.66;
      0.51, 0.13, 0.19, 0.85 ];
b = [ 1.0, 2.0, 3.0, 4.0 ]';

x=A\b

A*x

Код C (опущено):

int
main (void)
{
  double a_data[] = { 0.18, 0.60, 0.57, 0.96,
                      0.41, 0.24, 0.99, 0.58,
                      0.14, 0.30, 0.97, 0.66,
                      0.51, 0.13, 0.19, 0.85 } ;
  double m_data[] = { 0.18, 0.60, 0.57, 0.96,
                      0.41, 0.24, 0.99, 0.58,
                      0.14, 0.30, 0.97, 0.66,
                      0.51, 0.13, 0.19, 0.85 } ;

  double b_data[] = { 1.0, 2.0, 3.0, 4.0 };

  gsl_matrix_view m 
    = gsl_matrix_view_array(m_data, 4, 4);
  gsl_matrix_view A
    = gsl_matrix_view_array(a_data, 4, 4);

  gsl_vector_view b
    = gsl_vector_view_array(b_data, 4);

  gsl_vector *x = gsl_vector_alloc (4);
  gsl_vector *workspace = gsl_vector_alloc (4);
  gsl_vector *y = gsl_vector_calloc(4);

  int s;

  gsl_permutation * p = gsl_permutation_alloc (4);
  gsl_permutation_init(p);

  gsl_linalg_LU_decomp (&m.matrix, p, &s);

  gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
  printf("LU x\n");
  gsl_vector_fprintf(stdout, x, "%g");
  gsl_blas_dgemv(CblasNoTrans, 1.0, &A.matrix, x, 0, y);
  printf("LU A*x\n");
  gsl_vector_fprintf(stdout, y, "%g");
  return 0;
}

Я ожидал бы получить одинаковые результаты от обеих программ, но решение этой системы для x в Octave дает

x =

   -2.0376
  -11.0398
    1.9090
    7.1902

, однако использование C и GSL приводит к x, равному:

-4.05205
-12.6056
1.66091
8.69377

Более того, результат A * x в обоих случаях [1, 2, 3, 4] при использовании x, полученного из данного случая. Полный вывод из Octave:

x =

   -2.0376
  -11.0398
    1.9090
    7.1902

ans =

   1.0000
   2.0000
   3.0000
   4.0000

Полный вывод из программы на C:

LU x
-4.05205
-12.6056
1.66091
8.69377
LU A*x
1
2
3
4

Это ошибка или я что-то напутал?

1 Ответ

0 голосов
/ 12 ноября 2019

Продукт A.x равен

1.0000089
1.3045014
3.0000039
4.0000039

для раствора C. Вы можете заподозрить ошибку ввода данных или перезапись некоторых данных.

...