GSL полиномиальный решатель дает мне неверный результат. Я попытался решить следующий полином, используя GSL кубический полиномиальный решатель:
x ^ 3-1.96848e20 x ^ 2 + 9.07605e28 x + 9.07605e28 = 0
На Вольфрам Альфа Результаты являются:
В моя программа Результаты являются:
код Я использовал:
#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])
Численный метод, используемый в GSL, в этом случае недостаточно точен.
Используйте, например, Дженкинс-Трауб алгоритм (код Вот)