Python 简单实现二分法求函数零点

最后更新:7 个月前

用法

引用

So simple! 只需把下面的代码复制到一个 {cute_name}.py ,然后直接在你要用的地方:

1
2
3
4
5
from {cute_name} import getErf

... """获取数据区"""

result = getErf(...)

参数列表

getErf 有四个形参!

g: str 函数表达式

init: list 一个需要两个元素的数值列表,并且满足 init[0]<init[1] ,这是求零点的初始区间,要求 init ∈ g的定义域I

out 放一个函数指针,用来输出信息,默认是不输出,可以填 print 就会把信息打印到控制台

返回值

一个双元列表,或者是一个数字。

若是个双元列表,则是指定精确度后可能的两个零点值(范围)

若是个数字,则是经过计算后得出的精确零点值

懒得写 留白

细心的你在阅读完代码后会发现 toDel 我空着没写, getErf 的最后几个 if 也一样,这是用来舍去计算后多余的位数的。

人生需要留白,写代码也一样,大家可以试着自己完成喵~

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from math import *
#from os import system as cmd

def toDel(i, j):
# 将i的精确度放到j
pass

def getMid(i, j):
return (i+j)/2

def getErf(g: str, init: list, T: float, out = lambda *args, **kwargs: 0):
x=init[0]
res=eval(g)
b=True if res<0 else False

out("Loading...")

while init[1]-init[0]>T:
#cmd("cls")

x = getMid(*init)
res = eval(g)
out(f"f({x})={res}")
if res==0:
init=x
break
elif (res<0)==b:
init[0]=x
else:
init[1]=x
if type(init) is not list: # 应该是个数字
pass
elif type(init) is list:
pass
return init

#print(x, res, b)

if __name__ == "__main__":
g = input("Math Gongshi: f(x)=")
defaulti = input("Init Collection: ")
w, w2 = eval(defaulti if defaulti else "(-1000, 1000)")#(0,1)
init=[w, w2]
T = float(input("Jingquedu: "))

print("Result:", getErf(g, init, T, print))

input("Press Enter to exit...")


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!