繁体   English   中英

Sympy 微分,方程在 numpy 数组中?

[英]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在特定的x1x2处评估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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM