使用sympy如何使分数与变量分开
Mul(Fraction(3,5), Pow(K, Integer(2)))
2
3⋅K
────
5
to
3 2
─ K
5
我知道这个简化的版本还不错,但是当我有很大的方程式时,它就会变得混乱
答案 0 :(得分:1)
我对漂亮的打印或LaTeX打印不是很熟悉,但是我设法提出了一些建议。将UnevaluatedExpr
放在Mul
的每个参数中:
from sympy import *
from fractions import Fraction
K = symbols("K")
expr1 = Mul(UnevaluatedExpr(Fraction(3,5)), UnevaluatedExpr(Pow(K, Integer(2))))
expr2 = Mul(UnevaluatedExpr(pi/5), UnevaluatedExpr(Pow(K, Integer(2))))
expr3 = ((UnevaluatedExpr(S(1)*3123456789/512345679) * UnevaluatedExpr(Pow(K, Integer(2)))))
pprint(expr1)
pprint(expr2)
pprint(expr3)
产生:
2
3/5⋅K
π 2
─⋅K
5
1041152263 2
──────────⋅K
170781893
我找不到一种方法来使它为斜杠3/5
打印堆叠的分数。更长的分数似乎可以工作。但是,如果您使用LaTeX进行打印,则the documentation建议使用类似latex(expr1, fold_frac_powers=False)
的方法来纠正此问题。
太糟糕了,我找不到优雅的解决方案,例如将init_printing(div_stack_symbols=False)
放在文档顶部。
答案 1 :(得分:0)
要详细说明 Maelstrom's Answer,您需要做两件事才能使这项工作如您所愿:
Maelstrom 展示的东西会起作用,但它比实际需要的要复杂得多。这是一个更简洁的解决方案:
from sympy import *
K = symbols("K")
# Step 1: make the fraction
# This seems to be a weird workaround to prevent fractions from being broken
# apart. See the note after this code block.
lh_frac = UnevaluatedExpr(3) / 5
# Step 2: prevent the fraction from being modified
# Creating a new multiplication expression will normally modify the involved
# expressions as sympy sees fit. Setting evaluate to False prevents that.
expr = Mul(lh_frac , Pow(K, 2), evaluate=False)
pprint(expr)
给出:
3 2
-*K
5
做 lh_frac = UnevaluatedExpr(3) / 5
不是通常应该如何创建涉及 2 个文字数字的分数。 通常,你会这样做:
lh_frac = Rational(3, 5)
如sympy docs中所示。但是,这现在为我们的用例提供了不受欢迎的输出:
2
3*K
----
5
这个结果出乎我的意料;在 evaluate
内将 False
设置为 Mul
应该足以做我们想做的事情。我对此有open question。