【问题标题】:How to optomize a function with variables subject to bounds?如何优化具有边界变量的函数?
【发布时间】:2020-07-26 21:07:31
【问题描述】:

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

这些负值确实使体积最大化,但是考虑到边长和高度为正值,有没有办法获得最大体积?

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}')

【问题讨论】:

标签: python optimization scipy


【解决方案1】:

math.abs() 是你想要使用的

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

【讨论】:

  • 全局最小值不一定也存在最大值
【解决方案2】:

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"))])

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 2016-10-11
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2018-09-01
    • 2023-03-10
    相关资源
    最近更新 更多