Страницы

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

среда, 13 марта 2019 г.

Sympy: найти только реальные корни уравнения (мнимые корни - проигнорировать)

Привет всем. Если я хочу решить уравнение с одной переменной, я делаю так:
x = sympy.symbols('x') ans = sympy.solve(a)#Где а-строка с уравнением
Однако, часто значение такого уравнения имеют вид:
X1=-4
X2=2
X3=1 - sqrt(7)*I
X4=1 + sqrt(7)*I
Но это еще нормально(На самом деле, не совсем, ближе ниже спрошу почему). А вот это не нормально:
X1=-1/4 - sqrt(-22/(9*(-95/108 + sqrt(3369)/36)**(1/3)) + 11/12 + 2*(-95/108 + sqrt(3369)/36)**(1/3))/2 - sqrt(-3/(4*sqrt(-22/(9*(-95/108 + sqrt(3369)/36)**(1/3)) + 11/12 + 2*(-95/108 + sqrt(3369)/36)**(1/3))) - 2*(-95/108 + sqrt(3369)/36)**(1/3) + 11/6 + 22/(9*(-95/108 + sqrt(3369)/36)**(1/3)))/2
А таких 4 корня... Так вот, вопросы: 1)В первом примере, в 3 и 4-м корне есть символ I(После *). Что это за символ? Я думал в сторону мнимой единицы(простите меня, математики). Но мне кажется, что это не она. Что же это? 2)Как можно избавиться от всего этого? От всяких I, всяких огромных корней... Можно ли вывести примерное значение в sympy? Спасибо за время, потраченное на чтение поста


Ответ

Попробуйте указать real=True
Все корни:
In [10]: from sympy import *
In [11]: x = symbols('x')
In [12]: solve(Eq(x**4-(x-2)**2, 0), x) Out[12]: [-2, 1, 1/2 - sqrt(7)*I/2, 1/2 + sqrt(7)*I/2]
Только реальные:
In [13]: x = symbols('x', real=True)
In [14]: solve(Eq(x**4-(x-2)**2, 0), x) Out[14]: [-2, 1]
Альтернативное решение:
# все корни In [23]: solve('x**4-(x-2)**2') Out[23]: [-2, 1, 1/2 - sqrt(7)*I/2, 1/2 + sqrt(7)*I/2]
# выбираем только реальные корни In [24]: [r for r in solve('x**4-(x-2)**2') if r.is_real] Out[24]: [-2, 1]
PS I - это мнимая единица, т.е. такое число, квадрат которого равен -1

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

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