Я пытаюсь написать функцию, которая может принимать любую функцию и возвращать параметр, который, если ввести в функцию, вернет ответ, близкий к 0 (близко к эпсилону), функция будет выглядеть примерно так:

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

x0, x1 - это диапазон, в котором нужно искать ответ. еще я знаю, что это применимо только к функции, которая может быть как положительной, так и отрицательной (например, f (X) = x ^ 2 + 1 не является хорошей функцией для решения).

Я нашел здесь ответ Метод деления пополам

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

редактировать: Все идет нормально. теперь у меня есть основная функция, которую мне нужно написать - функция, которая дает почитаемое значение функции. сама функция получает функцию, которую нужно перевернуть, и эпсилон, ответ на который предположительно должен быть близок к.

, например, для 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 = обратное (g (100)) = обратное (102) печать (minus_func) необходимо вернуть

100 потому что внутри "решения" функция 102-f (x) и, конечно же, "решить" может найти правильное значение для этого.

, и я попробовал это в своем коде, и он работает нормально, но недостаточно хорошо. для некоторых функций работает нормально. но для других это вообще не работает. для функций:

math.e**x
x**-3

и, возможно, другие, не работает. у кого-то есть идеи, как это решить?.

p.s - Я пишу код на python, поэтому будет здорово, если ответ тоже будет на python. но все остальное в порядке (я также знаю java, и все, что объясняет логику, конечно, отлично)

спасибо!

Dvir Itzko

Ответов: 2

Ответы (2)

Попробуйте эту реализацию двоичного поиска:

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

Не стесняйтесь задавать вопросы по этому поводу.

Условие

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

не имеет смысла. Почему 0 исключен как возможный корень? При начальных значениях по умолчанию метод завершится ошибкой в ​​первом цикле. И если значения функции настолько близки, они либо имеют одинаковый знак, который был исключен, либо они представляют собой корень функции, поскольку оба значения достаточно малы.

Заменить на отсутствующий

if abs(x1-x0) < epsilon:
    return mid

2022 WebDevInsider