使用牛顿迭代法求解一阶导数方程 python

用一个给定边长 4 的正方形来折一个没有盖的纸盒,设纸盒的底部边长为 l,则纸盒的高为 (4-l)/2,那么纸盒的体积为:

170454_zqPj_1474656.png

怎样才能使纸盒的容积最大?也就是在 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()

13172133_hb3q.png

由图可知,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处时,纸盒的体积最大

转载于:https://my.oschina.net/lCQ3FC3/blog/837730

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值