sympy - подставить указанную c степень - PullRequest
0 голосов
/ 17 января 2020

У меня есть это равенство.

import sympy as sp
D, L, V = sp.symbols("D, L, V", real=True, positive=True)
Veq = sp.Eq(V, sp.pi * D**3 / 4 * (sp.Rational(2, 3) + L / D))

Я хотел бы решить Veq для D**3. Если я попробую прямой подход, sp.solve(Veq, D**3) вычисление займет некоторое время, в конечном итоге дающее мне чрезвычайно длинный результат (бесполезный для меня).

Моя попытка: попытка заменить D**3 новым символом , то решай за это. К сожалению, замена также собирается заменить другие D в равенстве:

t = sp.symbols("t")
print(Veq.subs(D**3, t))

>>> Eq(V, pi*t*(L/t**(1/3) + 2/3)/4)

Обратите внимание на термин L/t**(1/3). Я хотел бы, чтобы это было L/D после замены. До сих пор мне удалось манипулировать выражением и достичь своей цели с помощью этого кода:

res = sp.Mul(*[a.subs(D**3, sp.symbols("t")) if a.has(D**3) else a for a in asd.args[1].args])
Veq = sp.Eq(V, res)
print(Veq)

>>> Eq(V, pi*t*(2/3 + L/D)/4)

Мне интересно, есть ли какой-нибудь флаг для subs, который я могу использовать для достижения своей цели? Или какой-то другой метод?

1 Ответ

2 голосов
/ 17 января 2020

Если вы хотите, чтобы подстановка была точной, вы можете использовать флаг exact:

>>> var('D V L')
(D, V, L)
>>> Veq = sp.Eq(V, sp.pi * D**3 / 4 * (sp.Rational(2, 3) + L / D))
>>> Veq.subs(D**3,y,exact=True)
Eq(V, pi*y*(2/3 + L/D)/4)
>>> solve(Veq.subs(D**3,y,exact=True),y)
[12*D*V/(pi*(2*D + 3*L))]

Флаг exact, по-видимому, игнорируется, когда даются предположения:

>>> D, L, V = symbols("D, L, V", real=True, positive=True)
>>> (D**3+D).subs(D**3,y,exact=True)
y**(1/3) + y
>>> D, L, V = symbols("D, L, V")
>>> (D**3+D).subs(D**3,y,exact=True)
D + y

Вы можете использовать replace для вашей ситуации:

>>> D, L, V = symbols("D, L, V", real=True, positive=True)
>>> (D**3+D).replace(D**3,y)
D + y

Но так как ваше выражение является Реляционным, вы должны использовать замену аргументов, а не Реляционное (иначе вы получите ошибку):

>>> eq = Eq(D**3, D - 1)
>>> eq.func(*[a.replace(D**3,y) for a in eq.args])
Eq(y, D - 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...