我需要最小化五个变量(x [0]到x [4])
的函数要最小化的标量函数由X'*H*X
给出。目标函数看起来与此类似:
def objfun(x):
H = 0.1*np.ones([5,5])
f = np.dot(np.transpose(x),np.dot(H,x))[0][0]
return f
哪个会返回单个标量值。
问题是,我如何实现由下式给出的约束方程:
A*X - b = 0
A和b在每次运行中都可能发生变化。一个随机的例子是:
A =
array([[ 1, 2, 3, 4, 5],
[ 2, 1, 3, 4, 5],
[-1, 2, 3, 0, 0],
[ 0, -5, 6, 3, 2],
[-3, 5, 6, 2, 8]])
B =
array([[ 0],
[ 2],
[ 3],
[-2],
[-7]])
A和B不能硬编码到约束函数中,因为它们在每次运行中可能不同。变量没有界限,无需指定优化方法。
修改
我意识到,对于具有5个变量的优化问题,有5个约束方程,只需通过求解方程就可以得到唯一的解。 那么如何将A定义为:
A =
array([[ 1, 2, 3, 4, 5],
[ 2, 1, 3, 4, 5],
[-1, 2, 3, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]])
B =
array([[ 0],
[ 2],
[ 3],
[ 0],
[ 0]])
所以我们有一个5变量优化问题,有3个线性约束。
答案 0 :(得分:2)
您可以尝试使用scipy.optimize.fmin_cobyla
功能,我不知道数字详细信息,因此您应该使用您知道预期答案的值进行检查,看看它是否适合您的需求,使用公差参数rhoend
和rhobeg
,看看你是否得到了预期的答案,示例程序可能是这样的:
import numpy as np
import scipy.optimize
A = \
np.array([[ 1, 2, 3, 4, 5],
[ 2, 1, 3, 4, 5],
[-1, 2, 3, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]])
B = \
np.array([[0],
[2],
[3],
[0],
[0]])
def objfun(x):
H = 0.1*np.ones([5,5])
f = np.dot(np.transpose(x),np.dot(H,x))
return f
def constr1(x):
""" The constraint is satisfied when return value >=0 """
sol = A*x
if np.allclose(sol, B):
return 0.01
else:
# Return the negative distance between the expected solution
# and the actual solution for a somehow meaningful value
return -np.linalg.norm(B-sol)
scipy.optimize.fmin_cobyla(objfun, [0.0, 0.0, 0.0, 0.0,0.0], [constr1])
#np.linalg.solve(A, b)
请注意,这个给出的示例没有解决方案,请尝试使用的方法。我不完全确定约束函数是否已正确定义,尝试找到适合您的东西。您应该尝试提供一个初步猜测,它是一个实际的解决方案,而不是[0.0, 0.0, 0.0, 0.0,0.0]
,以获得更好的结果。
查看官方文档以获取更多详细信息:http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_cobyla.html#scipy.optimize.fmin_cobyla
编辑:根据您正在寻找的解决方案类型,您可能会形成更好的约束功能,可能允许与预期解决方案相距一定容差距离的值即使不完全准确,并且返回一个高于0的值,它们越接近公差而不是总是0.1,等等......
答案 1 :(得分:0)
NLopt doc
提到了一个简洁的通用方法:
Ax = b
的所有解决方案都具有xany + nullspace(A) z
,
的形式
其中xany
是一个解决方案,dim(z) < dim(x)
因此,与无约束f( xany + nullspace(A) z )
相比,z
最小化。
例如,在3d中,约束x0 + x1 + x2 = 1
具有零空间矩阵
[ 1 0 ] : [z0 z1] -> [z0, -z0 + z1, -z1] -- sum 0
[ -1 1 ]
[ 0 -1 ]
(&#34;在数值计算零空间时需要注意......&#34;)