【Python】用二分法求函数零点坐标

我们来看一个例子:在一块边长为13cm的正方形金属箔片的四个角上都剪去一个边长为x cm的小正方形,做成一个容积为140cm^3无盖长方体盒子,如图所示,问:x的值是多少?

(题目引自 沪教版普通高中教科书 数学必修第一册)

 读完题目我们便可列出方程:x(13-2x)^2=140,因为是一例实际问题,那么x应有定义域为:x\in (0, \frac{13}{2} ).

令 f(x)=x(13-2x)^2-140,  x\in (0, \frac{13}{2} ),  上述方程的实根就是函数y=f(x)的零点,使用绘图软件可绘制出该函数对的图像,如下图:

 如图可得出,在区间[1,2][3,4]中各有一个与x轴的交点,接下来我们将使用二分法求这两个零点。二分法定理如下图所示:

 思路:将区间设定为两个变量后除以2,得出二分点,然后再求当x时对应的函数值,两两比较其正负性,如果一正一负,则零点在该新区间中,相反则不再该区间中。重复上面的方法,进一步缩小误差,扩大精度。

解决代码如下:

def f_x(x):
    y = x*pow(13-2*x, 2)-140
    # print(y)
    return y

limit = int(input("LIMIT(RECOMMAND:7): "))
start =timeit.default_timer()
val_left = 1
val_right = 2
in_x=(val_left+val_right)/2

while abs(f_x(in_x)) > pow(10, -limit):
    if f_x(val_left)*f_x(in_x) < 0:
        val_right = in_x
        in_x = (val_left+val_right)/2

    elif f_x(val_right)*f_x(in_x) < 0:
        val_left = in_x
        in_x = (val_left+val_right)/2

    else:
        break

print('{:.6f}'.format(in_x))

 尝试在LIMIT后输入7,代码返回为:

LIMIT(RECOMMAND:7): 7
1.288841

以下是两个区间内的零点函数值的输出:

①interval:[1, 2]

LIMIT(RECOMMAND:7): 7
>>> 1.288841

②interval:[3, 4]

LIMIT(RECOMMAND:7): 7
>>> 3.185067

当然,若用户定义了一个没有零点的区间,代码输出将如下:

③interval:[9, 10]

LIMIT(RECOMMAND:7): 7
>>> 9.500000

经程序测算,程序运行时间约为:

Running time: 9.489999999989784e-05 Seconds

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值