使用字符串 subs('x', 'w') 而不是符号 subs(x, w) 的 Sympy 替换
Sympy substitutions using strings subs('x', 'w') instead of symbols subs(x, w)
我正在使用电路模拟器开发一个应用程序 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
我无法在文档中以这种方式找到有关替换的信息。对我来说这似乎是一个错误,但我不知道应该是什么行为。
我建议您在字典中跟踪所有 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
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
我正在使用电路模拟器开发一个应用程序 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
我无法在文档中以这种方式找到有关替换的信息。对我来说这似乎是一个错误,但我不知道应该是什么行为。
我建议您在字典中跟踪所有 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
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