Страницы

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

воскресенье, 9 февраля 2020 г.

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

#python_3x #sympy


Код:

a = simplify('x**(1/3)')
print(a.subs(x, -10).evalf())


Вывод:

1.07721734501594 + 1.86579517236206*I


Почему он с мнимой единицей? Есть же корень кубический из отрицательного числа? Или
я что-то забыл? В чём причина?
    


Ответы

Ответ 1



Эта проблема берётся от того, что и стандартно в 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

Ответ 2



В том, что этих корней среди комплексных чисел три. И это вправду один из них. Полный список: 1.07721734501594 + 1.86579517236206*I # ваш 1.07721734501594 - 1.86579517236206*I # симметричный относительно оси вещественных -2.154434690031884 # то, что вы искали Комплексные корни из вещественных чисел целой степени 3 и более образуют на комплексной плоскости правильный многоугольник, в данном случае это равносторонний треугольник. См. формулу Муавра. Вам нужно ограничиться вещественными результатами. Чтобы получить все результаты, можно решить уравнение y = x**(1/3), если при этом ещё объявить y как вещественное, то комплексные результаты отвалятся. Но может быть решение и получше, которое я не знаю, т. к. с SymPy не работал.

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

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