Симпийное дифференцирование, уравнение в массиве numpy? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть функция, которая обновляется - я оптимизирую, используя метод Ньютона и самый крутой. Я новичок в симпати и надеюсь получить быстрое разъяснение.

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)

моя функция, 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)

Это уравнение, которое мне нужно, но теперь я хочу дифференцировать его по отношению Я, моя лямбда. Но Симпи так не работает.

Когда я запускаю

sym.diff(theta,l)

, я получаю такой вывод:

AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_coeff_Mul'

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Если 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])
* Тогда 1008 * и theta - это простое выражение sympy, а не массив объектов, содержащий выражение. Тогда theta_p оценивает отлично.

Мы можем оценить gy1 по специфике c x1, x2 с evalf вместо 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]
0 голосов
/ 27 апреля 2020

Попробуйте sym.diff(theta[0], l) и sym.diff(theta[1], l)

По какой-то причине у вас есть ndarray, содержащий объекты, которые являются выражениями симпатии. Напечатайте тип каждого элемента для подтверждения.

О, есть вложенные выражения ndarray. Вам необходимо проверить, что вы передаете в тета.

В итоге вы должны получить:

-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)

Замените x [0] и x [1] символами в тэте, затем diff, lambdify и оценить с помощью x [0] и x [1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...