#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
в float0.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. Насколько мне известно, Сочувствие не очень подходит (пока?) для работы с такого рода условиями.