Код:
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
Комментариев нет:
Отправить комментарий