我们来看一个例子:在一块边长为的正方形金属箔片的四个角上都剪去一个边长为的小正方形,做成一个容积为的无盖长方体盒子,如图所示,问:的值是多少?
(题目引自 沪教版普通高中教科书 数学必修第一册)
读完题目我们便可列出方程:,因为是一例实际问题,那么应有定义域为:.
令 , , 上述方程的实根就是函数的零点,使用绘图软件可绘制出该函数对的图像,如下图:
如图可得出,在区间与中各有一个与轴的交点,接下来我们将使用二分法求这两个零点。二分法定理如下图所示:
思路:将区间设定为两个变量后除以2,得出二分点,然后再求当时对应的函数值,两两比较其正负性,如果一正一负,则零点在该新区间中,相反则不再该区间中。重复上面的方法,进一步缩小误差,扩大精度。
解决代码如下:
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