从变量中分离出分数

时间:2020-07-23 02:09:09

标签: sympy

使用sympy如何使分数与变量分开

Mul(Fraction(3,5), Pow(K, Integer(2)))


     2          
  3⋅K         
 ──── 
   5          

to 

               
 3  2      
 ─ K
 5 

我知道这个简化的版本还不错,但是当我有很大的方程式时,它就会变得混乱

2 个答案:

答案 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,您需要做两件事才能使这项工作如您所愿:

  1. 创建您想要的单独分数作为自己的表达式。
  2. 当表达式与其他表达式组合时,防止分子或分母被修改。

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

相关问题