使用 sympy 如何将分数与变量分开
Mul(Fraction(3,5), Pow(K, Integer(2)))
2
3⋅K
────
5
to
3 2
─ K
5
我知道这个简化版本还不错,但是当我有很大的方程时,它会变得混乱
我不太熟悉漂亮的打印或 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 中打印,文档建议使用类似 latex(expr1, fold_frac_powers=False)
的内容来纠正此问题。
太糟糕了,我找不到一个优雅的解决方案,例如将
init_printing(div_stack_symbols=False)
放在文档顶部。
要详细说明Maelstrom的答案,您需要做两件事才能使这项工作按您的意愿进行:
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文档所示。然而,这给我们现在的用例带来了不想要的输出:
2
3*K
----
5
这个结果让我感到惊讶;将
evaluate
设置为 False
内的 Mul
应该足以完成我们想要的操作。我对此有一个悬而未决的问题。
详细阐述之前的答案使用
sympify
而不是UnevaluatedExpr
:
from sympy import *
lh_frac = sympify("3/5", evaluate=False)
expr = Mul(lh_frac, Pow(a, Integer(2)), evaluate=False)
pprint(expr)
# 3 2
# ─⋅a
# 5
稍后可以评估表达式
expr*5
# 2
# 3⋅a