Python 如何利用中值定理求数学函数的根?

Python 如何利用中值定理求数学函数的根?,python,function,Python,Function,根据给定函数F(x)的中值定理, 我应该写一个函数,它得到一个数学函数,两个数字a和b,以及一个误差范围,它给出一个数字x作为输出,对于这个数字,函数的值接近0,直到ε。 示例: >>> find_root(lambda x : x - 1 , -10, 10) 1.0009765625 >>> find_root(lambda x : x**2 , -10, 10) >>> #returned None 这是我到目前为止写的代码,我认为

根据给定函数F(x)的中值定理, 我应该写一个函数,它得到一个数学函数,两个数字a和b,以及一个误差范围,它给出一个数字x作为输出,对于这个数字,函数的值接近0,直到ε。 示例:

>>> find_root(lambda x : x - 1 , -10, 10)
1.0009765625 
>>> find_root(lambda x : x**2 , -10, 10)
>>> #returned None
这是我到目前为止写的代码,我认为我的方法是正确的,但是我不知道循环什么,我没有用这段代码得到正确的答案。 那么我应该在它里面做些什么呢

def find_root(f, a, b, EPS=0.001):
    if (f(a)*f(b))<0:
        for i in range(a,b):
            if f(i)<EPS:
                return (i)
    else:
        return (None)
def find_root(f,a,b,EPS=0.001):
如果(f(a)*f(b))使用二分法:

def find_root(f, a, b, EPS=0.0001):
  if f(a)==0 : return a
  if f(b)==0 : return b
  if f(a)*f(b)>0 : return None
  c=(a+b)/2
  while(abs(f(c))>EPS) :
    if f(a)*f(c)<0 : b=c
    else : a=c
    c=(a+b)/2
  return c
def find_root(f,a,b,EPS=0.0001):
如果f(a)==0:返回a
如果f(b)==0:返回b
如果f(a)*f(b)>0:返回无
c=(a+b)/2
而(abs(f(c))>EPS:

如果f(a)*f(c)最简单的解决方案是:

def find_root(f, a, b, EPS=0.001):
    #assuming a < b
    x = a
    while x <= b:
        if abs(f(x)) < EPS:
            return x
        else:
            x += EPS

如您所知,如果初始值均为正值或均为负值,则过程无法找到根

以下是如何使用二进制搜索来实现它的建议,以加速该过程:

def find_root(f, a, b, EPS=0.001):
    fa = f(a)
    fb = f(b)
    if fa*fb > 0: # both positive or both negative
        return None
    while abs(fa) > EPS and abs(fb) > EPS:
        c = (a+b)/2.0
        fc = f(c)
        if fa*fc >= 0:
            a = c
            fa = fc
        else:
            b = c
            fb = fc
    if abs(fa) <= EPS:
        return a
    else:
        return b
def find_root(f,a,b,EPS=0.001):
fa=f(a)
fb=f(b)
如果fa*fb>0:#均为正或均为负
一无所获
而abs(fa)>每股收益和abs(fb)>每股收益:
c=(a+b)/2.0
fc=f(c)
如果fa*fc>=0:
a=c
fa=fc
其他:
b=c
fb=fc

如果abs(fa)
526667901021
不是
X-1
的根,并且不在区间
[-10,10]
内。你能用文字解释一下这个过程应该如何工作吗?我知道,它应该返回1.0009765625,这就是为什么我发布了我的问题,我不知道该在其中修复什么!如果您不知道该过程应该如何工作,那么您不应该(也不能)修复代码,您应该修复缺少想法的问题。不适用于
lambda x:x**2-3
。应该返回1.7左右的值,返回
None
@Dunno如果使用中间值定理,则必须提供
a
b
,以便
f(a)*f(b)
def find_root(f, a, b, EPS=0.001):
    fa = f(a)
    fb = f(b)
    if fa*fb > 0: # both positive or both negative
        return None
    while abs(fa) > EPS and abs(fb) > EPS:
        c = (a+b)/2.0
        fc = f(c)
        if fa*fc >= 0:
            a = c
            fa = fc
        else:
            b = c
            fb = fc
    if abs(fa) <= EPS:
        return a
    else:
        return b