gpt4 book ai didi

python - 将 Scipy minimize (scipy.optimize.minimize) 与大型等式约束矩阵结合使用

转载 作者:行者123 更新时间:2023-12-01 05:10:00 39 4
gpt4 key购买 nike

我需要最小化一个函数,比如五个变量(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]])

因此我们有一个具有 3 个线性约束的 5 变量优化问题。

最佳答案

您可以尝试使用 scipy.optimize.fmin_cobyla 函数,我不知道数字详细信息,因此您应该使用您知道预期答案的值进行检查,看看它是否适用根据您的需求,使用容差参数 rhoendrhobeg 并查看是否得到预期的答案,示例程序可能类似于:

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 等...

关于python - 将 Scipy minimize (scipy.optimize.minimize) 与大型等式约束矩阵结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24380632/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com