【问题标题】:Writing rational number as functions in sympy在 sympy 中将有理数写为函数
【发布时间】:2020-03-04 05:44:44
【问题描述】:

我实际上有 2 个问题(我希望它们是相关的)。如何将 sympy 表达式中的有理数转换为分数。例如“0.25*x+0.5*y”我想变成“1/4*x+1/2*y”。第二个问题:如果我想用分数替换变量符号,分数会自动转换为十进制数。例如,对于 eq = parse_expr("p1*cos(5*x)") 执行 eq = eq.subs("p1",1/5) 给我 0.2cos(5????) 而不是 1/5*0.2cos(5????)。当然,它们在数学上是相同的,但我希望它们具有更好的分数形式。我怎样才能做到这一点?谢谢!

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    因为您使用的是 Python,所以您编写的每个表达式都通过 Python 语义。所以1/5 在 SymPy 可以用它做任何事情之前变成了0.25。这在文档中的“gotchas.rst”文件中有介绍。

    您会遇到这种情况的唯一情况是当您在一个产品中有两个前导数字彼此分开时,如1/5*x 但不是x*1/5。在这种情况下,您可以通过将其中一个包裹在 S() 中以使其成为 SymPy 编号而不是 Python 编号来防止它们成为浮点数,例如S(1)/5*x。在您单独使用数字分数或作为产品中的第一个因素的所有情况下,都需要此主动步骤

    >>> x.subs(x, 1/5)
    0.2
    >>> x.subs(x, S(1)/5)
    1/5
    

    如果您碰巧有一个表达式要将浮点数转换回 Rationals,您可以使用nsimplify(..., rational=True)

    >>> nsimplify(0.25*x + 0.5*y, rational=True)
    x/4 + y/2
    

    【讨论】:

      【解决方案2】:

      您可以使用Rational。在第一种情况下,写

      Rational(0.25)*x + Rational(0.5)*y
      

      Rational(1, 4)*x + Rational(1, 2)*y
      

      给你x/4 + y/2。第二种情况,

      eq.subs("p1", Rational(1, 5))  # cos(5*x)/5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-23
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多