用一个给定边长 4 的正方形来折一个没有盖的纸盒,设纸盒的底部边长为 l,则纸盒的高为 (4-l)/2,那么纸盒的体积为:
怎样才能使纸盒的容积最大?也就是在 l>0,4-l>0 的限制条件下,函数 V(l) 的最大值是多少?
1、绘图
import numpy as np
import matplotlib.pyplot as plt
l = np.linspace(0,4,100)
V = lambda l: 0.5*l**2*(4-l)
plt.plot(l,V(l))
plt.show()
由图可知,f(x)只存在一个极值,并且是改点为所求的极大值点,即相当于求解方程f'(x)=0
PS D:\yunke\script\test> cat .\test_niu.py
import numpy as np
h=0.0001
def get_num(x,maxiter=10): //默认使用牛顿法迭代10次
#f=lambda x: x**2-c
#f=lambda x: x**2-2*x-4
F=lambda x: 0.5*x**2*(4-x)
def df(x,f=F): //使用导数定义法求解导数
return (f(x+h)-f(x))/h
for i in range(maxiter):
#x=x-F(x)/df(x) //计算一阶导数,即是求解 f(x)=0
x=x-df(x)/df(x,df) //计算二阶导数,即是求解 f'(x)=0
print i+1,x
return x
print get_num(10)
##############################
输出结果
1 5.7692303736
2 3.75166276899
3 2.91004604198
4 2.68541477646
5 2.66674802777
6 2.66661667775
7 2.66661666635
8 2.66661666635
9 2.66661666635
10 2.66661666635
2.66661666635
#######################################
还可以使用 sympy进行求解
详见:http://www.cnblogs.com/NaughtyBaby/p/5427779.html
from sympy.abc import l
V = 0.5*l**2*(4-l)
# 看看一次导函数:
print V.diff(l)
# output is : -0.5*l**2 + 1.0*l*(-l + 4)
# 一次导函数的定义域为(-oo,oo),因此关键点为V'(l)=0的根
cp = sympy.solve(V.diff(l),l)
print cp
# output is: [0.0, 2.66666666666667]
# 找到关键点后,使用二次导数测试:
for p in cp:
print V.diff(l,2).subs(l,p)
# output is: 4, -4
# 因此知道在l=2.666666处时,纸盒的体积最大