首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对变量受限的函数进行优化?

如何对变量受限的函数进行优化?
EN

Stack Overflow用户
提问于 2020-07-27 05:07:32
回答 2查看 87关注 0票数 1

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

这些负值确实最大化了体积,但在边长和高度为正的情况下,有没有办法获得最大的体积?

代码语言:javascript
复制
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}')
EN

回答 2

Stack Overflow用户

发布于 2020-07-27 05:13:50

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

代码语言:javascript
复制
x, y, _lam = fsolve(obj, [0.0, 0.0, 1.0])
x, y = math.abs(x), math.abs(y)
票数 0
EN

Stack Overflow用户

发布于 2020-07-27 06:47:17

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

代码语言:javascript
复制
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在数值上近似梯度:

代码语言:javascript
复制
res = minimize(volume, x0=[1, 1], method='TNC', jac=None, bounds=[(0,float("inf")),(0,float("inf"))])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63105708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档