#python #scipy #newtons-method
#python #scipy #метод ньютонов
Вопрос:
Вот мой код:
def obj_function(x):
val= 8*(x[0]**4) 3*(x[1]**2)- 6*x[0]*x[1] 2*x[1]
return np.asmatrix(val)
def obj_function_prime(x):
val=[32*(x[0]**3)-6*x[1], 6*x[1]-6*x[0] 2]
return np.asmatrix(val)
def hess_obj_function(x):
a= 96*(x[0]**2)
b= -6
c= -6
d= 6
val=[[a,b], [c,d]]
return np.asmatrix(val)
tol= 10**(-6)
mu= 0.2
xk= np.asmatrix([1,1])
xold= np.asmatrix([0,0])
while np.linalg.norm(obj_function_prime(xk))> tol:
xold=xk
alpha=1.0
while obj_function(xk- alpha*obj_function_prime(xk))> (obj_function(xk)- mu*alpha*np.dot(obj_function_prime(xk), obj_function(xk))):
alpha=0.5* alpha
xk= xk-alpha*obj_function_prime(xk)
print(" The minimum of the function occurs at", xk)
И это выдает мне ошибку:
*
Трассировка LinAlgError (последний последний вызов
)
в
20 xold= np.matrix([0,0])
21
—> 22 в то время как np.linalg.norm(obj_function_prime(xk))> tol:
23 xold= xk
24 альфа = 1.0
<ipython-input-3-c0704e734bdd> in obj_function_prime(x) 4 5 def obj_function_prime(x): ----> 6 val=[32*(x[0]**3)-6*x[1], 6*x[1]-6*x[0] 2] 7 return np.matrix(val) 8 ~anaconda3libsite-packagesnumpymatrixlibdefmatrix.py in __pow__(self, other) 231 232 def __pow__(self, other): --> 233 return matrix_power(self, other) 234 235 def __ipow__(self, other): <__array_function__ internals> in matrix_power(*args, **kwargs) ~anaconda3libsite-packagesnumpylinalglinalg.py in matrix_power(a, n) 620 a = asanyarray(a) 621 _assert_stacked_2d(a) --> 622 _assert_stacked_square(a) 623 624 try: ~anaconda3libsite-packagesnumpylinalglinalg.py in _assert_stacked_square(*arrays) 211 m, n = a.shape[-2:] 212 if m != n: --> 213 raise LinAlgError('Last 2 dimensions of the array must be square') 214 215 def _assert_finite(*arrays): LinAlgError: Last 2 dimensions of the array must be square
Что означает эта ошибка и как я могу ее устранить? Как мне преобразовать матрицу в квадратную, если она не определена таким образом?
Комментарии:
1. Это означает, что последние два измерения должны быть одинаковыми. Полная трассировка может помочь точно определить, в чем проблема. Кроме того, я бы посоветовал избавиться от
asmatrix
вызовов. Попробуйте заставить это работать с обычными массивами numpy (они могут быть 2d, как np.matrix).2. @hpaulj Я отредактировал вопрос и добавил трассировку стека. Пожалуйста, проверьте, спасибо!
3. Что
x[0]**3
предполагается делать? Как вы думаетеx[0]
, что такое (форма, тип, dtype?). Соответствует ли это тому, что есть на самом деле?
Ответ №1:
Использование np.matrix
вызывает проблемы.
Давайте создадим небольшую матрицу:
In [273]: x = np.asmatrix([0,0])
In [274]: x
Out[274]: matrix([[0, 0]])
обратите внимание, что при индексации оно не меняется. Он выбирает первую «строку», но being np.matrix
по-прежнему 2d.
In [275]: x[0]
Out[275]: matrix([[0, 0]])
И **
np.matrix
, по сути, матрица квадратная x@x
.
In [276]: x[0]**2
Traceback (most recent call last):
File "<ipython-input-276-3908b7334115>", line 1, in <module>
x[0]**2
File "/usr/local/lib/python3.8/dist-packages/numpy/matrixlib/defmatrix.py", line 231, in __pow__
return matrix_power(self, other)
File "<__array_function__ internals>", line 5, in matrix_power
File "/usr/local/lib/python3.8/dist-packages/numpy/linalg/linalg.py", line 621, in matrix_power
_assert_stacked_square(a)
File "/usr/local/lib/python3.8/dist-packages/numpy/linalg/linalg.py", line 204, in _assert_stacked_square
raise LinAlgError('Last 2 dimensions of the array must be square')
LinAlgError: Last 2 dimensions of the array must be square
Я не собираюсь пытаться выяснить, что вы пытаетесь сделать, но очевидно, что использование asmatrix
— это не путь — по крайней мере, не понимая, как ведет себя такой массив.