Ответ на отредактированный вопрос.
В вашем примере вы можете использовать некоторые временные переменные, которые не будут перезаписаны при последующих заменах.Затем, как только все потенциально перекрывающиеся замены сделаны, вы можете заменить временные переменные действительными.
Этот пример подходит для вопроса, если ваша полная задача содержит более сложные замены, я думаю, вам следуетпо-прежнему можно создавать временные переменные, чтобы избежать перекрывающихся подстановок.
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