* Если вы делаете intro2cs в ЕУИ быть осторожным ... Я знаю, почему ты здесь *Попытка построить обратную функцию
Я пытаюсь создать функцию, которая получит функцию (предположим, непрерывность монотонного) в качестве аргумента и возврат его обратной функции. Из математики я знаю, что мне нужно отразить функцию до y=x
. , но это не очень хорошо.
Я написал кое-что, что даст мне x0
, что делает f(x0)=0
.
def solve(f, x0=-10000, x1=10000, epsilon=EPSILON):
"""return the solution to f in the range between x0 and x1"""
while x1-x0>EPSILON:
if (f(x0)*f((x1+x0)/2))<0:
x1=((x1+x0)/2)
elif (f(x0)*f((x1+x0)/2))>0:
x0=((x1+x0)/2)
elif (f(x0)*f(x1))==0:
if f(x0)==0:
return x0
else:
return x1
if f(x0)*f(x1)<0:
return (x1+x0)/2
else:
return None
Проблема в том, что я не знаю, какой будет вход диапазона в функции. Мне кажется, мне нужно сначала работать с небольшим диапазоном, и если я не найду решение, я буду расширять диапазон экспоненциально.
Любые идеи?
UPDATE: нормально, так что я пытался писать как @Spektre
предложил и мне удастся:
def inverse(g, epsilon=EPSILON):
"""return f s.t. f(g(x)) = x"""
def helper(y):
x0=-2
x1=2
while x1<10000:
if solve((lambda x:g(x)-y),x0,x1,epsilon):
return solve((lambda x:g(x)-y),x0,x1,epsilon)
else:
x0=math.pow(x0,3)
x1=math.pow(x1,3)
return helper
Неэффективно выполнять одни и те же вызовы функций несколько раз; Python не будет оптимизировать их для вас. Вы можете получить некоторые идеи по улучшению кода из статьи Википедии по методу [bisection method] (https://en.wikipedia.org/wiki/Bisection_method). FWIW, чтобы выполнить инверсию функции, вы можете использовать метод Ньютона или тесно связанный [secant method] (https://en.wikipedia.org/wiki/Secant_method). –
Для ускоренного использования в скобках используйте метод regula falsi - false position с модификацией Anti-stall от Illinois. Это намного быстрее, чем деление пополам и только умеренно медленнее, чем связанный с ним метод. – LutzL