我正在使用带有sympy符号数学库的IPython(Anaconda发行版)。
我有以下表达式:
t⋅(h + l)
───────────────────────
l⋅(h + l⋅sin(θ))⋅cos(θ)
我想根据(h/l)
和(t/l)
对其进行重新排列:
(t/l)⋅((h/l)+1)
─────────────────────
((h/l)+sin(θ))⋅cos(θ)
这很容易手工完成;只需将分数的两边除以l
并重新排列。
到目前为止,我对于sympy的内置函数没有运气。
我尝试使用expand
后跟collect(expr,h/l)
,但它不会更改表达式。我怀疑这不起作用,因为 没有h/l
条款,它首先要收集它。
如何表达同意?
第一个用于节省时间的表达式的Python代码:
t*(h + l)/(l*(h + l*sin(theta))*cos(theta))
答案 0 :(得分:1)
建立在strubbly的想法上:
In [2]: expr = t *(h +l )/(l *(h +l *sin (theta ))*cos (theta ))
In [3]: expr
Out[3]:
t*(h + l)
-------------------------------
l*(h + l*sin(theta))*cos(theta)
In [4]: repl1 = [x-h/l, y-t/l]
In [7]: repl2 = solve(repl1, t, l)
In [8]: repl2
Out[8]:
h h*y
{l: -, t: ---}
x x
In [9]: simplify(expr.subs(repl2)).subs({x: h/l, y: t/l})
Out[9]:
/h \
t*|- + 1|
\l /
-----------------------------
/h \
l*|- + sin(theta)|*cos(theta)
\l /
即,引入两个变量 x 和 y 来替换 h / l 和 t / l (在[4]中,反转等式以获得替换字典(In [7])。替换,简化(摆脱 l ),然后替换 x 和 y 的原始值。一个变量仍然被简化了。
应该告诉 .subs(...)不要在替换后评估表达式。我不知道目前是否支持。
答案 1 :(得分:0)
所以我使用了x = h/l
和y = t/l
并替换了。然后简化。这给了我
x*(y + 1)/((y + sin(theta))*cos(theta))
我认为你想要的是什么。我看不出如何简化“关于”h/l
,但这有效...
答案 2 :(得分:-1)
我真的不知道你是否可以使用正则表达式,但如果可以的话,你可以使用re.sub
将h
的所有实例替换为(h/1)
。或者如果表达式是一个字符串,您可以使用str.replace
来做同样的事情。