正在寻找函数的最小值?

问题描述 投票:1回答:2

我具有此功能:

import numpy as np ### imports numpy
import matplotlib.pyplot as plt ### imports plotting

def cokeArea(Volume, radius):
    Area = 2 * (Volume / radius + np.pi * np.power(radius,2)) ### re-arranged formula
    return Area


r = np.linspace(1,15,100)
plt.plot(r,cokeArea(350,r))
print("The optimal Solution is:")
print("Area:", min(cokeArea(350,r)))

它输出一个可以容纳350ml的罐子的最小表面积,我的问题是:我可以找到用于

的r值吗?
min(cokeArea(350,r))

我需要它以最小的表面积输出罐的半径。谢谢:)

python function numpy scipy min
2个回答
3
投票

一个接近最佳的解决方案是

r[np.argmin(cokeArea(350, r))]

取决于您的r的间隔分辨率。


0
投票

@@ Han Wang的回答令人惊讶。它快速且易于理解,但我只想对其进行量化并提供更多答案。

这里是韩文的答题时间输出。

r = np.linspace(1,15,100)
%timeit r[np.argmin(cokeArea(350,r))]

6.56 µs ± 106 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

由于您仅对确定半径感兴趣,因此可以使用Scipy的函数,即最小化标量。该方法是有界的,因为如果我不加限制,它将得到零分。

from scipy import optimize

def cokeArea(radius):
    Volume = 350
    Area = 2 * (Volume / radius + np.pi * np.power(radius,2)) ### re-arranged formula
    return Area

%timeit result = optimize.minimize_scalar(cokeArea, bracket=(1, 15), method = "brent")

543 µs ± 22.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

此方法显然要慢得多,但是它确实提供了一些优点,应该更加准确,根据您对精度的要求,这可能很重要。

由于您确实具有这些界限,因此可以在minimize_scalar中使用有界函数,这会更快一些,但是您可以看到,是否仍然比Han的答案低一个数量级。

from scipy import optimize

def cokeArea(radius):
    Volume = 350
    Area = 2 * (Volume / radius + np.pi * np.power(radius,2)) ### re-arranged formula
    return Area

%timeit result = optimize.minimize_scalar(cokeArea, bounds=(1, 15), method = "bounded")

259 µs ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

最后,如果出于任何原因要运行包含变量和r的多变量优化,则可以使用Scipy的fmin

from scipy import optimize

def cokeArea(radius):
    Volume = 350
    Area = 2 * (Volume / radius + np.pi * np.power(radius,2)) ### re-arranged formula
    return Area

%timeit result = optimize.fmin(cokeArea, 1,disp=False)

718 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

虽然这是最慢的,但是如前所述,您可以尝试查找一个函数的多个变量的最小值。例如,一罐焦炭的成本包括材料,形状等。

© www.soinside.com 2019 - 2024. All rights reserved.