【问题标题】:Sympy substitutions using strings subs('x', 'w') instead of symbols subs(x, w)使用字符串 subs('x', 'w') 而不是符号 subs(x, w) 的 Sympy 替换
【发布时间】:2015-09-08 10:57:54
【问题描述】:

我正在使用电路模拟器ahkab 开发应用程序,长话短说,我需要用 1j*w 替换某些方程中的拉普拉斯变量 s。对我来说,使用符号名称而不是符号本身来执行这种替换和其他替换要方便得多。我遇到了一些奇怪的行为。

如果你这样做

    >>> x = Symbol('x')
    >>> y = Symbol('y')
    >>> expr = x + y
    x + y
    >>> expr.subs('x', 'w')
    w + y

这似乎按我的预期工作。问题在于符号是用complex = True声明的,这里

    >>> s = Symbol('s', complex = True)
    >>> y = Symbol('y')
    >>> expr = s + y
    s + y
    >>> expr.subs(s, 'w') #Works as expected
    w + y
    >>> expr.subs('s', 'w') #Has no effect, this is my problem.
    s + y

我无法在文档中以这种方式找到有关替换的信息。对我来说,这似乎是一个错误,但我不知道应该是什么行为。

【问题讨论】:

    标签: python scipy sympy symbolic-math


    【解决方案1】:

    subs 在它的参数上调用sympify。例如,请参阅https://github.com/sympy/sympy/blob/master/sympy/core/basic.py#L845。这意味着字符串将被转换为符号,但sympify 无法知道您希望将字符串转换为具有非默认假设的符号。做到这一点的唯一方法是实际传递符号。请注意,具有不同假设的符号不被视为相等。

    In [1]: from sympy import Symbol
    
    In [2]: x = Symbol('s')
    
    In [3]: y = Symbol('s')
    
    In [4]: x == y
    Out[4]: True
    
    In [5]: y = Symbol('s', complex=True)
    
    In [6]: x == y
    Out[6]: False
    

    【讨论】:

      【解决方案2】:

      我建议您跟踪字典中的所有 Symbol 实例。您可以制作专门的字典,例如:

      from sympy import Symbol as _Symbol
      
      class SymbolCollection(dict):
          def __missing__(self, key):
              value = self[key] = _Symbol(key)
              return value
      
      symbs = SymbolCollection()
      def Symbol(key, *args, **kwargs):
          s = _Symbol(key, *args, **kwargs)
          symbs[key] = s
          return s
      

      应用于您的示例:

      >>> s = Symbol('s', complex = True)
      >>> y = Symbol('y')
      >>> expr = s + y
      >>> expr
      s + y
      >>> expr.subs(s, symbs['w'])
      w + y
      >>> expr.subs(symbs['s'], symbs['w'])
      w + y
      

      如果解决方案过于冗长,我建议编写一个专门的 subs 函数并将 expr 作为第一个参数显式传递,而不是依赖方法 .subs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多