0

我正在尝试编写一个可以接受任何函数并返回 a 参数的函数,如果将其放入函数中,将返回接近 0 的答案(接近 epsilon),该函数将如下所示:

def solve(f, x0=-10000, x1=10000, epsilon=EPSILON):

x0, x1 是寻找答案的范围。我知道的另一件事是它仅适用于可以是正数和负数的函数(例如 f(X) = x^2+1 不是一个很好的函数来解决)。

我在这里找到了答案Bisection method

def solve(f, x0=-10000, x1=10000, epsilon=EPSILON):
""" return the solution to f in the range between x0 and x1\
use an algorithm to check if a solution can be found so f(x)<epsilon
iterates in a while loop until either a solution is found or if the abs
the value of the midpoint is smaller than epsilon (return None)"""

# make sure the function is in the type that can be solved 
if (f(x1) * f(x0)) >= 0:
    return None

while True:
    mid = (x0 + x1) / 2
    sol = f(mid)
    if abs(sol) < epsilon:
        return mid
    if mid == 0 or (abs(f(x1) - f(x0)) / 2) < epsilon:
        return None
    elif sol * f(x0) < 0:
        x1 = mid
    elif sol * f(x1) < 0:
        x0 = mid

编辑: 到目前为止一切顺利。现在我有了我需要编写的主要函数——一个为函数提供崇高价值的函数。函数本身获取需要反转的函数和答案假设接近的 epsilon。

例如,对于 f(x) = x+2,我希望inverse_func(f(100))返回 100。我得到的提示是我可以使用我展示的 prev 函数。我试着这样做:

def inverse(g, epsilon=EPSILON):
"""return f s.t. f(g(x)) = x"""

def ret_function(x):
    return find_x(x, g, epsilon)

return ret_function


def find_x(x, g, epsilon):
    x0, x1 = -10000, 1001
    g_sol = x
    sent_epsilone = EPSILON
    while True:
        def f(x):
            g_val = g(x)
            ans = g_sol - g_val
            return ans

        sol = solve(f, x0, x1, sent_epsilone)
        if sol == None:
            pass
        else:
            return sol
        x0, x1 = x0 * 10, x1 * 10

我试图赋予“解决”功能来为我解决问题。我给它一个函数,该函数从 f(x) 减去求解函数需要找到的值计算给定值。

例如对于 f(x) = x+2,然后调用

minus_func = inverse(g(100)) =inverse(102) print(minus_func) 应该返回

100 因为“solve”中的函数是 102-f(x),当然“solve”可以为此找到正确的值。

我在我的代码中尝试了这个,它工作正常,但还不够好。对于某些功能,它工作正常。但对其他人来说,它根本不起作用。对于功能:

math.e**x
x**-3

可能还有其他人,它不起作用。有人知道如何解决这个问题吗?

ps - 我正在用 python 编写代码,所以如果答案也在 python 中,那就太好了。但其他一切都可以(我也知道java,任何可以解释逻辑的东西当然都很棒)

谢谢!

4

2 回答 2

1

条件

if mid == 0 or (abs(f(x1) - f(x0)) / 2) < epsilon:
    return None

没有意义。为什么 0 被排除为可能的根?使用默认初始值,该方法将在第一个循环中失败。如果函数值非常接近,它们要么具有相同的符号,被排除在外,要么它们代表函数的根,因为两个值都足够小。

应该用缺失的来代替

if abs(x1-x0) < epsilon:
    return mid
于 2016-01-01T16:58:31.520 回答
0

试试这个二分搜索的实现:

def solve(f, x0=-10000, x1=10000, epsilon=EPSILON):
    if f(x0) * f(x1) > 0:  # predicate of binary search
        return None

    while x1 - x0 > epsilon:  # while search interval is bigger than EPS
        mid = (x0 + x1) / 2  # take middle of interval
        sol = f(mid)  # take function value in mid point
        if sol * f(x0) > 0:  # one of roots is located in [mid, x1] interval
            x0 = mid
        else:  # one of roots is located in [x0, mid] interval
            x1 = mid
    return (x0 + x1) / 2

随时提出有关它的问题。

于 2016-01-01T17:15:27.060 回答