Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同态中的非序贯代换_Python_Math_Substitution_Symbolic Math_Sympy - Fatal编程技术网

Python 同态中的非序贯代换

Python 同态中的非序贯代换,python,math,substitution,symbolic-math,sympy,Python,Math,Substitution,Symbolic Math,Sympy,我试图使用[SymPy][1]同时替换表达式中的多个术语。我尝试使用字典作为参数的[subs函数][2],但发现它是按顺序替换的 In : a.subs({a:b, b:c}) Out: c 问题是第一次替换产生了一个可以被第二次替换替换的术语,但它不应该(出于我的原因) 你知道如何同时进行替换,而不让它们相互干扰吗 编辑: 这是一个真实的例子 In [1]: I_x, I_y, I_z = Symbol("I_x"), Symbol("I_y"), Symbol("I_z") In [2]

我试图使用[SymPy][1]同时替换表达式中的多个术语。我尝试使用字典作为参数的[subs函数][2],但发现它是按顺序替换的

In : a.subs({a:b, b:c})
Out: c
问题是第一次替换产生了一个可以被第二次替换替换的术语,但它不应该(出于我的原因)

你知道如何同时进行替换,而不让它们相互干扰吗

编辑: 这是一个真实的例子

In [1]: I_x, I_y, I_z = Symbol("I_x"), Symbol("I_y"), Symbol("I_z")

In [2]: S_x, S_y, S_z = Symbol("S_x"), Symbol("S_y"), Symbol("S_z")

In [3]: J_is = Symbol("J_IS")

In [4]: t = Symbol("t")

In [5]: substitutions = (
(2 * I_x * S_z, 2 * I_x * S_z * cos(2 * pi * J_is * t) + I_y * sin(2 * pi * J_is * t)),
(I_x,  I_x * cos(2 * pi * J_is * t) + 2 * I_x * S_z * sin(2 * pi * J_is * t)),
(I_y,  I_y * cos(2 * pi * J_is * t) - 2 * I_x * S_z * sin(2 * pi * J_is * t))
)

In [6]: (2 * I_x * S_z).subs(substitutions)
Out[7]: (I_y*cos(2*pi*J_IS*t) - 2*I_x*S_z*sin(2*pi*J_IS*t))*sin(2*pi*J_IS*t) + 2*S_z*(I_x*cos(2*pi*J_IS*t) + 2*I_x*S_z*sin(2*pi*J_IS*t))*cos(2*pi*J_IS*t)
只有适当的替代才应该发生,在这种情况下,只有第一个。因此,预期输出应如下所示:

In [6]: (2 * I_x * S_z).subs(substitutions)
Out[7]: I_y*sin(2*pi*J_IS*t) + 2*I_x*S_z*cos(2*pi*J_IS*t)
subs(self,*args)
方法的定义(部分)如下:

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)
如果你通过一个dict,你就失去了对替换顺序的控制。 而如果传递
subs
列表或元组,则可以控制顺序

这不允许您同时进行替换。如果用户要传递诸如
x.subs([(x,y),(y,x)])
之类的内容,这将导致困难。所以我怀疑辛皮有没有同时替换的方法。相反,我认为所有的代换要么是无序的(如果你传递了一个dict),要么充其量是通过一次传递的有序代换(如果你传递了一个列表或元组):

PS.
\u subs\u list(self,sequence)
的定义(部分)如下:

In [14]: x._subs_list??
...
    for old, new in sequence:
        result = result.subs(old, new)
这将确定完成接头的顺序。

例如:


回答编辑后的问题

在您的示例中,您可以使用一些临时变量,这些变量不会被重写为后续替换。然后,一旦完成了所有可能重叠的替换,就可以用实际变量替换临时变量

这个例子适用于这个问题,如果您的完整问题包含更复杂的替换,我认为您应该仍然能够创建临时变量以避免重叠替换

from sympy import Symbol, sin, cos, pi

I_x, I_y, I_z = Symbol("I_x"), Symbol("I_y"), Symbol("I_z")
S_x, S_y, S_z = Symbol("S_x"), Symbol("S_y"), Symbol("S_z")
J_is = Symbol("J_IS")
t = Symbol("t")
I_x_temp, I_y_temp, I_z_temp = Symbol("I_x_temp"), Symbol("I_y_temp"), Symbol("I_z_temp")

f = 2*I_x*S_z
answer = I_y*sin(2*pi*J_is*t) + 2*I_x*S_z*cos(2*pi*J_is*t)

subs1a = [
    (2*I_x*S_z, 2*I_x_temp*S_z*cos(2*pi*J_is*t) + I_y_temp*sin(2*pi*J_is*t)),
    (I_x,  I_x_temp*cos(2* pi*J_is*t) + 2*I_x_temp*S_z*sin(2*pi*J_is*t)),
    (I_y,  I_y_temp*cos(2*pi*J_is*t) - 2*I_x_temp*S_z* sin(2*pi*J_is*t))
]

subs_temp = [(I_x_temp, I_x), (I_y_temp, I_y), (I_z_temp, I_z)]

print f
f = f.subs(subs1a)
print f
f = f.subs(subs_temp)
print f
print f == answer # True
注意,您还可以背靠背执行两个替换:

f.subs(subs1a).subs(subs_temp) == answer

Symphy的当前版本提供了关键字Synchronized。前面答案中的复杂操作不再需要:

In [1]: (x*sin(y)).subs([(x,y),(y,x)],simultaneous=True)
Out[1]: y⋅sin(x)

关键字
synchronized
将执行非冲突subs,而不管输入(dict或sequence):


我已经添加了第二个例子,替换的顺序似乎根据一些我不理解的原则而有所不同。你可以使用OrderedDict复制它,谢谢,所以对于普通的dict来说,它有些不可预测,因为它们是未排序的。不幸的是,在我的情况下,顺序并不重要,无论顺序如何,替换都会互相践踏。你能给我一个真实的替换例子,让我看看问题是什么吗。你上面的问题可以通过~unutbu的回答来解决。@PreludeAndFugue我添加了一个真实的例子,我以前的例子太简单了,没有真正的用处。
f.subs(subs1a).subs(subs_temp) == answer
In [1]: (x*sin(y)).subs([(x,y),(y,x)],simultaneous=True)
Out[1]: y⋅sin(x)
>>> x.subs([(x,y),(y,z)],simultaneous=1)
y
>>> x.subs([(y,z),(x,y)],simultaneous=1)
y