求函数的最小值?

2024-09-27 00:12:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个功能:

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

它输出a的最小表面积可以容纳350ml,我的问题是: 我能找到在中使用的r值吗

min(cokeArea(350,r))

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


Tags: import功能numpymatplotlibasnppltarea
2条回答

@汉王的回答很惊人。它既快又容易理解,但我只是想量化它,并提供更多的答案。你知道吗

这是韩的答案的输出时间。你知道吗

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的函数minimize scalar。这个方法是有界的,因为如果我让它无界,它会给我一个被零除的答案。你知道吗

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)

最后,如果出于任何原因运行多变量优化,其中包括volume和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)

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

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

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

取决于r的间隔分辨率。你知道吗

相关问题 更多 >

    热门问题