我正在尝试编写一个可以接受任何函数并返回 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,任何可以解释逻辑的东西当然都很棒)
谢谢!