<p>@汉王的回答很惊人。它既快又容易理解,但我只是想量化它,并提供更多的答案。你知道吗</p>
<p>这是韩的答案的输出时间。你知道吗</p>
<pre><code>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)
</code></pre>
<p>因为您只对确定半径感兴趣,所以可以使用Scipy的函数minimize scalar。这个方法是有界的,因为如果我让它无界,它会给我一个被零除的答案。你知道吗</p>
<pre><code>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)
</code></pre>
<p>这种方法显然要慢得多,但它确实提供了一些优势,它应该更准确,这可能是重要的根据您的精度要求。你知道吗</p>
<p>因为你有这些界限,你可以使用<code>minimize_scalar</code>中的有界函数,这要快一点,但是你可以看到,如果Han的答案后面还有一个数量级。你知道吗</p>
<pre><code>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)
</code></pre>
<p>最后,如果出于任何原因运行多变量优化,其中包括volume和r,那么可以使用Scipy的<code>fmin</code>。你知道吗</p>
<pre><code>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)
</code></pre>
<p>虽然这是最慢的,如前所述,您可以尝试找到函数的多个变量的最小值。例如焦炭罐的成本包括材料、形状等。你知道吗</p>