Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

Вычисление кубического корня в sympy

Код:
a = simplify('x**(1/3)') print(a.subs(x, -10).evalf())
Вывод:
1.07721734501594 + 1.86579517236206*I
Почему он с мнимой единицей? Есть же корень кубический из отрицательного числа? Или я что-то забыл? В чём причина?


Ответ

Эта проблема берётся от того, что и стандартно в python, если попытаться вычислить выражение (-10)**(1/3), то получим, как раз то, что у вас и получается. (Так как вычисляется 1/3 приближенно, а для числа 0.333333 никакого истинного корня нет. В документации к cbrt в sympy также явно указано, какой ответ она считает истинным и какой выдаёт, предупреждая что для отрицательных чисел он может отличаться от того, что вы ожидали.
Но вместо возведение в степень (1/3) можно использовать функцию real_root() она как раз делает то, что вам нужно:
>>> a = simplify('real_root(x, 3)') ... print(a.subs(x, -10).evalf())
−2.15443469003188
более того метод root может возвращать и другие корни. В качестве третьего параметра он берёт номер корня, который следует вернуть:
>>>root(-10, 3, 0).evalf() 1.07721734501594+1.86579517236206i >>>root(-10, 3, 1).evalf() −2.15443469003188 >>>root(-10, 3, 2).evalf() 1.07721734501594−1.86579517236206i

Комментариев нет:

Отправить комментарий