【发布时间】:2021-07-16 00:12:52
【问题描述】:
我想用 sympy 计算一个符号梯度,例如,
import sympy as sym
x, y, z = sym.symbols("x y z", real=True)
T = sym.cos(x**2+y**2)
gradT = sym.Matrix([sym.diff(T, x), sym.diff(T,y), sym.diff(T,z)])
现在我想用这个表达式创建一个 lamddify 函数:
func = lambdify((x,y,z), gradT,'numpy')
要使用我拥有的功能:
gradT_exact = func(np.linspace(0,2,100), np.linspace(0,2,100), np.linspace(0,2,100))
我收到以下错误:
<lambdifygenerated-3>:2: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
return (array([[-2*x*sin(x**2 + y**2)], [-2*y*sin(x**2 + y**2)], [0]]))
如果我将 T 更改为 x,y,z 的函数,它不会给我带来任何问题... 为什么当 T 仅取决于 x 和 y 并且 z 设置为零时会发出警告。
提前致谢!
【问题讨论】:
-
这是 sympy 中的一个错误:github.com/sympy/sympy/issues/21613
-
@OscarBenjamin,我不明白
lambdify如何调整[0]以准确反映其他术语的可能形状(一般为x,y,z)。跨度> -
一般来说,当将数组的符号替换为矩阵值表达式时,lambdify 不可能知道用户想要什么。额外的数组维度应该去哪里?定义一些合理的东西是可能的,但它可能需要是与 lambdify 不同的函数,该函数将具有控制如何使其工作的参数。
标签: python-3.x sympy lambdify