Я пытаюсь решить систему линейных уравнений 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
Это ошибка или я что-то напутал?