向量函数的Python fmin(找到最小值)

时间:2018-02-10 00:19:46

标签: python numpy

我想找到最小的3dvar函数定义为:

J(x)=(x-x_b)B ^ { - 1}(x-x_b)^ T +(yH(x))R ^ { - 1}(yH(x))^ T(乳胶代码)

给出B,H,R,x_b,y。 我想找到argmin(J(x))。然而,似乎python中的fmin不起作用。 (函数J正常工作)

这是我的代码:

import numpy as np

from scipy.optimize import fmin

import math


def dvar_3(x):

    B=np.eye(5)
    H=np.ones((3,5))
    R=np.eye(3)
    xb=np.ones(5)
    Y=np.ones(3)

    Y.shape=(Y.size,1)

    xb.shape=(xb.size,1)


    value=np.dot(np.dot(np.transpose(x-xb),(np.linalg.inv(B))),(x-xb)) +np.dot(np.dot(np.transpose(Y-np.dot(H,x)),(np.linalg.inv(R))),(Y-np.dot(H,x)))    

    return value[0][0]


ini=np.ones(5) #
ini.shape=(ini.size,1) #change initial to vertical vector

fmin(dvar_3,ini) #start at initial vector

我收到此错误:

ValueError: operands could not be broadcast together with shapes (5,5) (3,3) 

我该如何解决这个问题?提前谢谢。

1 个答案:

答案 0 :(得分:1)

在函数x中重构参数dvar_3init fmin()参数需要一个单调数组。

import numpy as np   
from scipy.optimize import fmin   
import math

def dvar_3(x):
    x = x[:, None]
    B=np.eye(5)
    H=np.ones((3,5))
    R=np.eye(3)
    xb=np.ones(5)
    Y=np.ones(3)

    Y.shape=(Y.size,1)

    xb.shape=(xb.size,1)


    value=np.dot(np.dot(np.transpose(x-xb),(np.linalg.inv(B))),(x-xb)) +np.dot(np.dot(np.transpose(Y-np.dot(H,x)),(np.linalg.inv(R))),(Y-np.dot(H,x)))    

    return value[0][0]


ini=np.ones(5) #
fmin(dvar_3,ini) #start at initial vector