Non-sequential substitution in SymPy

后端 未结 5 903
醉梦人生
醉梦人生 2021-02-13 14:11

I\'m trying to use [SymPy][1] to substitute multiple terms in an expression at the same time. I tried the [subs function][2] with a dictionary as parameter, but found out that i

5条回答
  •  面向向阳花
    2021-02-13 14:51

    The subs(self,*args) method is defined (in part) this way:

    In [11]: x.subs??
    ...
    sequence = args[0]
    if isinstance(sequence, dict):
        return self._subs_dict(sequence)
    elif isinstance(sequence, (list, tuple)):
        return self._subs_list(sequence)
    

    If you pass subs a dict, you lose control over the order of the substitutions. While if you pass subs a list or tuple, you can control the order.

    This doesn't allow you to do simultaneous substitutions. That would lead to difficulties if the user were to pass stuff like x.subs([(x,y),(y,x)]). So I doubt sympy has a method for doing simultaneous substitutions. Instead I believe all substutions are either unordered (if you pass a dict) or, at best, done by a 1-pass ordered substitution (if you pass a list or tuple):

    In [17]: x.subs([(x,y),(y,z)])
    Out[18]: z
    
    In [19]: x.subs([(y,z),(x,y)])
    Out[19]: y
    

    PS. _subs_list(self, sequence) is defined (in part) like this:

    In [14]: x._subs_list??
    ...
        for old, new in sequence:
            result = result.subs(old, new)
    

    This nails down the order in which the subs are done.

提交回复
热议问题