[英]Sympy differentiation, equation is in numpy array?
我有一个已更新的 function - 我正在使用牛顿法和最陡法进行优化。 我是 sympy 的新手,希望能得到一些快速的澄清。
x1,x2 = sym.symbols('x1 x2')
y = 2*x1 + 3*x2**2 + sym.exp(2*x1**2 + x2**2)
gy1 = sym.diff(y,x1)
gy2 = sym.diff(y,x2)
grad1 = sym.lambdify([x1,x2],gy1)(x[0],x[1])
grad2 = sym.lambdify([x1,x2],gy2)(x[0],x[1])
d = np.array([-1*grad1,-1*grad2])
l = sym.symbols('l')
theta = 2*(x[0]+l*d[0]) + 3*(x[1]+l*d[1])**2 + sym.exp(2*(x[0]+l*d[0])**2 + (x[1]+l*d[1])**2)
theta_p = sym.diff(theta,l)
我的 function, y
更新如下: f(x_n) --> f(x_n + lambda*d_n)
-- 调用这个theta(lambda)
我已经如上更新('theta' function)
,当打印到屏幕上时,它给出了一个 numpy 数组:
array([-63.1124487914452*l + 2 + exp([1991.5905962264*(0.0316894691665188 - l)**2])],
dtype=object)
这就是我需要的等式,但现在我想将它与 l 区分开来,我的 lambda。 但是 sympy 不是这样工作的。
当我跑
sym.diff(theta,l)
我得到这个 output:
AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_coeff_Mul'
有任何想法吗?
尝试sym.diff(theta[0], l)
和sym.diff(theta[1], l)
由于某种原因,您最终会得到一个包含 sympy 表达式对象的 ndarray。 打印每个元素的类型以确认。
哦,有嵌套的 ndarray 表达式。 您需要查看传递给 theta 的内容。
你最终应该得到:
-63.1124487914452*l + 2 + exp(1991.5905962264*(0.0316894691665188 - l)**2)
代替
array([-63.1124487914452*l + 2 + exp([1991.5905962264*(0.0316894691665188 - l)**2])],
dtype=object)
用 theta 中的符号替换 x[0] 和 x[1],然后用 x[0] 和 x[1] 进行 diff、lambdify 和评估
如果xx
(您未指定的x
)是 (2,1) 数组:
In [153]: xx = np.array([[1],[1]])
In [154]: grad1 = sym.lambdify([x1,x2],gy1)(xx[0],xx[1])
...: grad2 = sym.lambdify([x1,x2],gy2)(xx[0],xx[1])
...: d = np.array([-1*grad1,-1*grad2])
In [155]: d
Out[155]:
array([[-82.34214769],
[-46.17107385]])
In [156]: theta = 2*(xx[0]+l*d[0]) + 3*(xx[1]+l*d[1])**2 + sym.exp(2*(xx[0]+l*d[0])**2 + (xx[1]+l*d[1])
...: **2)
In [157]: theta
Out[157]:
array([-164.684295385501*l + 6395.30418038233*(0.0216585822397654 - l)**2 + 2 + exp([13560.4585733095*(0.0121444488396316 - l)**2 + 2131.76806012744*(0.0216585822397654 - l)**2])],
dtype=object)
相反,如果它是 (2,) 或简单列表
In [158]: xx = np.array([1,1]) # [1,1]
...
In [160]: d
Out[160]: array([-82.34214769, -46.17107385])
然后theta
是一个简单的sympy
表达式,而不是包含表达式的 object 数组。 然后theta_p
评估良好。
我们可以使用evalf
而不是gy1
在特定的x1
和x2
处评估lambdify
:
In [174]: xsub = {x1:1, x2:1}
In [175]: d = [-1*gy1.evalf(subs=xsub), -1*gy2.evalf(subs=xsub)]
In [176]: d
Out[176]: [-82.3421476927507, -46.1710738463753]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.