如何使用介值定理寻找数学函数的根?

1 投票
3 回答
1678 浏览
提问于 2025-04-18 01:35

根据中间值定理,对于一个给定的函数F(x),我需要写一个函数,这个函数接收一个数学函数、两个数字a和b,以及一个误差范围,然后输出一个数字x,使得这个函数在x处的值接近0,误差不超过epsilon。

举个例子:

>>> 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)

3 个回答

0

你知道的,如果你开始的两个值都是正数或者都是负数,你的程序就找不到根。

这里有个建议,可以用二分查找的方法来加快这个过程:

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

调用 find_root(lambda x : x-1, -10, 10) 这个函数,返回的结果是 1.0009765625。

0

最简单的解决办法就是这个:

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

结果是:

>>>find_root(lambda x: x-1, -10, 10)
0.9999999999998982
>>>find_root(lambda x: x-1, -10, -2)
None
0

使用二分法:

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

撰写回答