Научная библиотека ГНУ (GSL) кубическое полиномиальное расхождение в результатах

GSL полиномиальный решатель дает мне неверный результат. Я попытался решить следующий полином, используя GSL кубический полиномиальный решатель:

x ^ 3-1.96848e20 x ^ 2 + 9.07605e28 x + 9.07605e28 = 0

На Вольфрам Альфа Результаты являются:

  • -1
  • 4.61069e + 8
  • 1.96848e + 20

В моя программа Результаты являются:

  • 2.30531e + 08
  • 2.30531e + 08
  • 1.96848e + 20

код Я использовал:

   #include <iostream>
#include <gsl/gsl_poly.h>

using namespace std;

int main() {
double result[3]={0,0,0};
gsl_poly_solve_cubic(-1.96848e20,9.07605e28,9.07605e28, &result[0], &result[1], &result[2]);
cout << result[0] << endl;
cout << result[1] << endl;
cout << result[2] << endl;
return 0;
}

Что может быть не так?

Изменить: На самом деле, Вольфрамальфа также дает странные ответы

Обновление: оба Wolframalpha не правы (немного ближе к правильному ответу), и мой код неверен.

Вот то же решение в Python (библиотека Numpy)

In [11]: np.roots(p)
Out[11]: array([  1.96848000e+20,   4.61068948e+08,  -9.99999998e-01])

0

Решение

Численный метод, используемый в GSL, в этом случае недостаточно точен.

Используйте, например, Дженкинс-Трауб алгоритм (код Вот)

1

Другие решения


По вопросам рекламы [email protected]