Используйте Ньютона-Рафсона через scipy.optimize.newton . Он находит корни уравнения, т. Е. Значения x , для которых f ( x ) = 0. В примере вы можете привести задачу к поиску корня функции f ( x ) = x & sup2; - y . Если вы предоставляете лямбду, которая вычисляет y , вы можете предоставить общее решение следующим образом:
def inverse(f, f_prime=None):
def solve(y):
return newton(lambda x: f(x) - y, 1, f_prime, (), 1E-10, 1E6)
return solve
Использовать эту функцию довольно просто:
>>> sqrt = inverse(lambda x: x**2)
>>> sqrt(2)
1.4142135623730951
>>> import math
>>> math.sqrt(2)
1.4142135623730951
В зависимости от функции входа может потребоваться настроить параметры на newton()
. Текущая версия использует начальное предположение 1, допуск 10 -10 и максимальное число итераций 10 6 .
Для дополнительного ускорения вы можете указать производную функции:
>>> sqrt = inverse(lambda x: x**2, lambda x: 2*x)
Фактически, без нее функция фактически использует секущий метод вместо Ньютона-Рафсона, который полагается на знание производной.