首页 > 解决方案 > 非交换函数乘积的导数

问题描述

如果我在 SymPy 中使用函数并调用 diff 方法,那么交换属性就会被忽略。

h = Function('h',real=True,commutative=False)(t)
R = Function('R',real=True,commutative=False)(t)
print(diff(R*h,t))
# returns:
R(t)*Derivative(h(t), t) + h(t)*Derivative(R(t), t)

我在这里做错了吗?我只希望输出总是在前面有 R ..

标签: pythonsympycommutativity

解决方案


这可以说是 SymPy 中的一个错误,它根据函数的 arguments 确定函数的交换性。另请参阅此评论。它与导数无关:只需打印h*R就会暴露错误(表达式显示为R(t)*h(t))。

在改变这种行为之前,似乎达到预期结果的唯一方法是声明t为不可交换的:

t = Symbol('t', commutative=False)
h = Function('h', real=True)(t)
R = Function('R', real=True)(t)
print(diff(R*h, t))

印刷

R(t)*Derivative(h(t), t) + Derivative(R(t), t)*h(t)

推荐阅读