【问题标题】:SymPy: How can I check, if symbol is a constant or a variable?SymPy:我如何检查符号是常量还是变量?
【发布时间】:2021-07-29 18:25:22
【问题描述】:

在 sympy 中,我想创建一个常量,例如来表示光速。 因此我用关键字constant=True初始化c

稍后我想检查一个符号是常量还是变量。 没想到c.is_constant()这个命令输出了False。

c = Symbol( 'c' , constant=True, real=True )
c.is_real       # outputs True as expected.
c.is_constant() # outputs False. This is unexpected !

如何检查符号是常量还是变量?

【问题讨论】:

  • SymPy 已经有一个光速常数,但使用普通符号也可以。为什么要区分常量和变量?它会有什么不同?几乎可以肯定有更好的方法来解决您的实际问题。
  • 查看is_constant 的代码/文档我发现它没有检查assumptions。因此,像您一样设置该假设并没有什么不同。从文档看来,is_constant 在应用于表达式时比应用于单个符号更有意义。假设关键字不受限制。 foobar=True 是允许的,但只有在我添加某种测试时才有意义。
  • @OscarBenjamin :我想使用函数的线性度:f( const*x ) = const*f( x ),但如果我面对两个变量的乘积(不是:@ 987654330@。因此我想检查xyconst 是常量还是变量。
  • @hpaulj :感谢提示 is_constant 属性似乎是为复合表达式定制的!这对我来说很有意义!但我还不了解 SymPy 的假设系统。你能给我一个例子,说明如何为符号提供自定义布尔属性,如 foobar,以及如何使用你提到的假设系统检查它?
  • 我不认为将符号声明为“常量”是做任何你想做的事情的好方法。我认为如果你问一个关于你的实际问题的问题,你可以得到一个更好的答案,即你想做某种操作,因为你知道你的函数 f 可以乘以某些符号而不是其他符号。

标签: python constants sympy linear-algebra symbolic-math


【解决方案1】:

创建一个Quantity 对象而不是创建一个符号应该可以完成这项工作。 下面的代码示例完成了您正在尝试做的事情。

from sympy.physics.units.quantities import Quantity

c = Quantity('c')
print(c.is_constant())

输出:

True

如果您需要其他内容或更多自定义内容,您可以尝试执行类似于 Sympy 对 e 和 pi 等常量值所做的操作,您可以在此处找到相应的源代码:

https://github.com/sympy/sympy/blob/46e00feeef5204d896a2fbec65390bd4145c3902/sympy/core/numbers.py#L3421-L3578

有关is_constant 方法为何返回False 的更多信息,请查看此

https://docs.sympy.org/latest/modules/core.html#sympy.core.expr.Expr.is_constant

【讨论】:

  • 谢谢,Luis,这是一种区分的可能性:变量 = 符号,常量 = 数量,但对我来说使用数量有一个缺点:似乎方程包含数量的 IPython.core.display 在 Spyder 的 IPython 控制台中显示得很丑。对我来说,一个很好的方程式乳胶显示很重要。因此,这对我来说不是一个令人满意的选择。
  • 在这种情况下,您可以尝试我提到的另一件事,即模拟 SymPy 为定义 PI 和 E 所做的事情。它为您的常量创建一个类,就像他们在这里所做的那样:github.com/sympy/sympy/blob/…
【解决方案2】:

看看当我用各种关键字构造一个符号时会发生什么:

In [93]: c = Symbol( 'c' , constant=True, real=True, foobar=True )
In [94]: c._assumptions
Out[94]: 
{'constant': True,
 'real': True,
 'extended_real': True,
 'hermitian': True,
 'commutative': True,
 'imaginary': False,
 'finite': True,
 'complex': True,
 'infinite': False,
 'foobar': True}

这些关键字以及一些默认值都放在dict 中。我包括了你的constant,以及我自己随机选择的foobar。两者都没有特殊含义。

is_constant 方法不寻找这个假设值:

def is_constant(self, *wrt, **flags):
    if not wrt:
        return False
    return not self in wrt

我们必须研究它的文档以了解 wrt 是什么。

指定assumption 是一回事,实际使用它是另一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2017-12-27
    • 2017-10-12
    相关资源
    最近更新 更多