Simply 未检测带有 subs 的基本替换。
我有以下分数:
d₂⋅n₁⋅n₂
──────── + m₂⋅n₁ + mm₂⋅n₂
nc
─────────────────────────
nc
写为
cm2 = (d2*n1*n2/nc + m2*n1 + mm2*n2)/nc
现在我想替换n1/nc = np1和n2/nc = np2。所以我写了:
cm2.subs({n1/nc : symbols("np1"), n2/nc: symbols("np2")})
结果是:
d₂⋅np1⋅n₂ + m₂⋅n₁ + mm₂⋅n₂
──────────────────────────
nc
相反,我希望 sympy 能够找出其他替换和输出:
d2⋅np1⋅np2 + m2⋅np1 + mm2⋅np2
我在这里缺少什么?
subs
大部分是字面意思,因此在第一次替换后,说 n1/nc->n1p
,然后 n2/nc
不再出现,因此无法替换。但没有必要重新排列表达式以使其达到替换所需的形式,您可以使用 solve
为您解决所有问题:
>>> eqs
(Eq(cm2, (d2*n1*n2/nc + m2*n1 + mm2*n2)/nc), Eq(n1/nc, np1), Eq(n2/nc, np2))
>>> solve(eqs,cm2,n1,n2, dict=True)
[{cm2: d2*np1*np2 + m2*np1 + mm2*np2, n1: nc*np1, n2: nc*np2}]
subs
在将一个表达式转换为另一个表达式时可能会遇到问题,特别是如果它们没有按字面意思出现在源表达式中。它也可能非常含糊。当目标是所有
n1
和
n2
从
cm2
消失时,替换可以用不同的方式编写:
from sympy import symbols
d2, n1, n2, nc, m2, mm2, n = symbols("d2 n1 n2 nc m2 mm2 n")
np1, np2 = symbols("np1 np2")
cm2 = (d2 * n1 * n2 / nc + m2 * n1 + mm2 * n2) / nc
cm2.subs({n1: np1 * nc, n2: np2 * nc}).simplify()
结果:d2*np1*np2 + m2*np1 + mm2*np2