Python 如何优化变量受限的函数?

Python 如何优化变量受限的函数?,python,optimization,scipy,Python,Optimization,Scipy,我试图优化形状的体积,我的函数返回形状的边长和高度。但是,我的函数返回的是负值,这没有意义 这些负值确实会使体积最大化,但是如果边长和高度为正值,有没有办法使体积最大化 import math from autograd import grad from scipy.optimize import fsolve z = 3 def objective (X): x, y = X return (x*(z**2)*(y))/(4*math.tan(math.pi/z))

我试图优化形状的体积,我的函数返回形状的边长和高度。但是,我的函数返回的是负值,这没有意义

这些负值确实会使体积最大化,但是如果边长和高度为正值,有没有办法使体积最大化

import math
from autograd import grad
from scipy.optimize import fsolve

z = 3


def objective (X):
    x, y = X
    return (x*(z**2)*(y))/(4*math.tan(math.pi/z))


def eq(X):
    x, y = X
    return ((x*(z**2))/(2*math.tan(math.pi/z))) + (x*y*z)-100


def F(L):
    'Augmented Lagrange function'
    x, y, _lambda = L
    return -objective([x, y]) - _lambda * eq([x, y])


dfdL = grad(F, 0)


def obj(L):
    x, y, _lambda = L
    dFdx, dFdy, dFdlam = dfdL(L)
    return [dFdx, dFdy, eq([x, y])]


x, y, _lam = fsolve(obj, [0.0, 0.0, 1.0])
print(f'The answer is at {x, y}')
math.abs()是您想要使用的

x, y, _lam = fsolve(obj, [0.0, 0.0, 1.0])
x, y = math.abs(x), math.abs(y)
math.abs()是您想要使用的

x, y, _lam = fsolve(obj, [0.0, 0.0, 1.0])
x, y = math.abs(x), math.abs(y)

scipy.optimize
有一些方法可以最小化变量受限的函数。例如(截断牛顿算法),这似乎与您的情况完全相关。请看以下示例:

从scipy.optimize导入最小化
def体积(X):
x、 y=x
f=(x-3)**2+(y-4)**2
返回f
def梯度体积(X):
x、 y=x
gx=2*(x-3)
gy=2*(y-4)
返回值[gx,gy]
res=minimize(体积,x0=[1,1],method='TNC',jac=grad_体积,边界=[(0,浮点(“inf”),(0,浮点(“inf”)]))
打印('答案位于{0}'。格式(res['x']))
如果您自己无法估计雅可比矩阵,您可以要求scipy以数值方式近似梯度:

res=minimize(volume,x0=[1,1],method='TNC',jac=None,bounds=[(0,float(“inf”),(0,float(“inf”)]))

scipy.optimize
有一些方法可以最小化变量受限的函数。例如(截断牛顿算法),这似乎与您的情况完全相关。请看以下示例:

从scipy.optimize导入最小化
def体积(X):
x、 y=x
f=(x-3)**2+(y-4)**2
返回f
def梯度体积(X):
x、 y=x
gx=2*(x-3)
gy=2*(y-4)
返回值[gx,gy]
res=minimize(体积,x0=[1,1],method='TNC',jac=grad_体积,边界=[(0,浮点(“inf”),(0,浮点(“inf”)]))
打印('答案位于{0}'。格式(res['x']))
如果您自己无法估计雅可比矩阵,您可以要求scipy以数值方式近似梯度:

res=minimize(volume,x0=[1,1],method='TNC',jac=None,bounds=[(0,float(“inf”),(0,float(“inf”)]))

全局最小值不一定作为最大值存在,全局最小值也不一定作为最大值存在。我不确定这是否可以帮助您:我不确定这是否可以帮助您: