使用字符串subs(' x',' w')代替符号subs(x,w)的Sympy替换

时间:2015-06-22 20:33:11

标签: python scipy sympy symbolic-math

我正在处理一个带有电路模拟器ahkab的应用程序,长话短说我需要用1j * w替换某些方程中的laplace变量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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

我建议您跟踪字典中的所有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