Сочувствую, А не Символически Решаю уравнение при вызове набора решений

#python #sympy

#питон #сочувствую

Вопрос:

Использование Python 3.9.7 в коде VS. Я провожу некоторый анализ стресса на python:

 from math import sin, cos, tan, degrees, radians from operator import eq from sympy import *  x, y, z, a = symbols("x y z a") vm_crit = ((x - y)**2   (y - z)**2   (z - x)**2)**(1/2) -(2**(1/2))*a vm_crit_sub = vm_crit.subs(x, z) vm_crit_solve = solveset(vm_crit_sub,y)  print(vm_crit_solve)   

Я получаю:

 ConditionSet(y, Eq(-1.4142135623731*a   ((-y   z)**2   (y - z)**2)**0.5, 0), Complexes)  

Второй аргумент верен, но по какой-то причине функция не решает для «y». Если я избавлюсь от квадратов:

 x, y, z, a = symbols("x y z a") vm_crit = (x   y   z) - a vm_crit_sub = vm_crit.subs(x, z) vm_crit_solve = solveset(vm_crit_sub,y)  print(vm_crit_solve)  

Я получаю:

 {a - 2*z}  

Это правильно.

В сочувствии вам нужно расширяться, прежде чем решать? Если да, то есть ли способ обойти это?

Спасибо за любую помощь.

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

1. В общем, это плохая идея import from math , когда вы работаете с sympy, так как эти библиотеки плохо сочетаются. (Как math не используется в этом примере кода, это только потенциальная проблема, когда вы расширяете код.) Реальная проблема здесь в том, что sympy путается с поплавками, поскольку они неточны, и sympy ищет точные символические решения. Python немедленно преобразуется 1/2 в float 0.5 . Вы можете обойти это преобразование, написав 1/2 как рациональное или как S(1)/2 (или используя sqrt здесь). Тогда результат таков {-a z, a z} .

2. Спасибо. Первый пункт в результате верен, но второго пункта быть не должно, так как проблема прекрасно сводится к y = z — a. Есть идеи, как устранить второй пункт?

3. Ну, sqrt((y-z)**2) не обязательно равно y-z , так как это может быть отрицательным или даже сложным. Оба решения, по-видимому, правильно вписываются в уравнение.

4. Есть ли способ сказать Симпатии, что z — y gt; 0? Это уменьшит решение до y = z — a.

5. Насколько мне известно, Сочувствие не очень подходит (пока?) для работы с такого рода условиями.