我想求一个复杂函数的导数。不幸的是,当我构造要求导的表达式时,它会将所有子表达式扩展至紧邻的符号。因此,一旦我对最终表达式进行微分,它就会膨胀到难以控制的大小。我曾尝试手动将一些子表达式替换回最终结果中之前的形式,但由于表达式构造过程中的重构,错失了很多简化的机会。
这只是我想要推导的第一阶段,即使尝试替换一些用于构建它的表达式,它已经变得非常臃肿。
from sympy import *
aX, aY, aZ = symbols('aX aY aZ')
rotInc = Matrix(3,1,[aX, aY, aZ])
theta = sqrt((rotInc.T @ rotInc)[0,0])
incQuat = Quaternion.from_axis_angle(rotInc/theta, theta*2)
qX, qY, qZ, qW = symbols('qX qY qZ qW')
baseQuat = Quaternion(qW, qX, qY, qZ)
poseQuat = incQuat * baseQuat
d4 = diff(poseQuat, aX)
d4s = d4.subs({
incQuat.a: symbols('iW'),
incQuat.b: symbols('iX'),
incQuat.c: symbols('iY'),
incQuat.d: symbols('iZ'),
theta: symbols('theta')
})
我知道cse
(公共子表达式消除),这表明存在某种系统可以保留命名的子表达式。我希望 sympycse
在我构造表达式时构建一个类似 returns 的结构,并且只在必要时(例如在微分过程中)用子表达式的组件替换它。这样可以在最终的微分过程中保留大部分这些符号,从而得到更清晰、可立即使用的输出。
是否有这样一种在 sympy 中构造表达式的模式/方法,或者其他可以帮助我保持最终表达式简单的方法?谢谢!