我正在尝试优化形状的体积,我的函数返回形状的边长和高度。然而,我的函数返回负值,这是没有意义的。
这些负值确实最大化了体积,但在边长和高度为正的情况下,有没有办法获得最大的体积?
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}')发布于 2020-07-27 05:13:50
math.abs()是您想要使用的
x, y, _lam = fsolve(obj, [0.0, 0.0, 1.0])
x, y = math.abs(x), math.abs(y)发布于 2020-07-27 06:47:17
scipy.optimize有一些方法可以最小化变量受限制的函数。例如,TNC (截断牛顿算法)似乎与您的情况完全相关。请看下面的示例:
from scipy.optimize import minimize
def volume(X):
x,y = X
f = (x-3)**2+(y-4)**2
return f
def grad_volume(X):
x,y = X
gx = 2*(x-3)
gy = 2*(y-4)
return [gx,gy]
res = minimize(volume, x0=[1, 1], method='TNC', jac=grad_volume, bounds=[(0,float("inf")),(0,float("inf"))])
print('The answer is at {0}'.format(res['x']))如果你不能自己估计雅可比,你可以让scipy在数值上近似梯度:
res = minimize(volume, x0=[1, 1], method='TNC', jac=None, bounds=[(0,float("inf")),(0,float("inf"))])https://stackoverflow.com/questions/63105708
复制相似问题