Arrays (2,2)数组的scipy极小化

Arrays (2,2)数组的scipy极小化,arrays,optimization,numpy,matrix,Arrays,Optimization,Numpy,Matrix,给定矩阵a=[[1,2],[3,1]]我试图最小化函数平方范数 对于a*x,其中x应该是(2,2)数组——这只是一个玩具示例--- 通过使用下面的代码。但是,我从控制台获得以下信息 错误消息: " return np.linalg.norm(np.dot(a, x))**2 ValueError: matrices are not aligned " 我将非常感谢你的解释。谢谢 import numpy as np from scipy.optimize import minimize

给定矩阵
a=[[1,2],[3,1]]
我试图最小化函数平方范数 对于a*x,其中x应该是(2,2)数组——这只是一个玩具示例--- 通过使用下面的代码。但是,我从控制台获得以下信息 错误消息:

"    return np.linalg.norm(np.dot(a, x))**2 
ValueError: matrices are not aligned "
我将非常感谢你的解释。谢谢

import numpy as np
from scipy.optimize import minimize

a = np.array([[1, 2],[3, 1]])

def func_obj(x):
    return np.linalg.norm(np.dot(a, x))**2 


def func_deriv(x):
     """ Derivative of objective function """
     result = np.zeros([2, 2])
     for i in range(2):
        for j in range(2):
            for k in range(2):
                result[i,j] = result[i, j] + 2*(np.dot(a[k,:],x[:,j]))*a[k,i]
     return result


res = minimize(func_obj, [[1, -1],[-1,1]], jac = func_deriv, 
               method = 'SLSQP', options = {'disp':True})

print (res.x)

您的问题是最小化函数希望参数作为1D列表。你给它一个2x2矩阵,并期望它给你一个回来。 添加简单的
reformate()
调用来解压参数可以解决以下问题:

def func_obj(x):
    x = x.reshape(2,2)
    return np.linalg.norm(np.dot(a, x))**2 


def func_deriv(x):
     """ Derivative of objective function """
     x = x.reshape(2,2)
     result = np.zeros([2, 2])
     for i in range(2):
        for j in range(2):
            for k in range(2):
                result[i,j] = result[i, j] + 2*(np.dot(a[k,:],x[:,j]))*a[k,i]
     return result

x0 = np.array([[1, -1],[-1,1]]).reshape(-1)
res = minimize(func_obj, x0, jac = func_deriv, 
               method = 'SLSQP', options = {'disp':True})

谢谢你的回答