首页 > 解决方案 > sympy - 替代特定的力量

问题描述

我有这个平等。

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可以用来实现我的目标?还是别的什么方法?

标签: pythonsympy

解决方案


如果您希望替换准确,您可以使用该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)

推荐阅读