Как поместить функцию в качестве параметра в существующую функцию - PullRequest
0 голосов
/ 02 мая 2020

для класса программирования нам нужно запрограммировать три метода для вычисления root математической функции, в приведенном ниже коде я использовал «метод деления пополам».

Кажется, что сам код работает уже.

Теперь я хочу получить этот код как функцию, чтобы я мог вводить границы, допустимое отклонение значения y, а также математическую функцию и ее переменную в качестве аргументов.

Но вставка, например, «2 * x + 1» в качестве математической функции и «x» в качестве переменной, конечно, не работает ... Я еще не очень знаком с python и не нашел решения в Интернете, поэтому далеко. Так может ты поможешь мне? :)

from math import *

# Bisection method
def Bisection ( a , b , y_tolerance , f , variable ) :

    # Define function.
    def f ( variable ) :

        return f

    # Mean for bisection.
    mean = ( a + b ) / 2

    # while-loop as long as y-value is bigger than wished tolerance.
    while abs( f ( mean ) ) > 10 ** ( - ( y_tolerance ) ) :

        # Recalculate mean for each iteration.
        mean = ( a + b ) / 2

        # If sign of y-values changes, cut interval in half from left.
        if f ( mean ) * f ( b ) < 0 :

            a = mean

        # If sign of y-values doesn't change, cut interval in half from right.
        elif f( mean ) * f ( b ) > 0 :

            b = mean

    # Print mean as approximation of the first root in the interval.
    else :

        print ( mean )

Bisection ( -1 , 0 , 2 * x + 1 , x )

Спасибо всем, кто готов мне помочь. :)

1 Ответ

1 голос
/ 02 мая 2020

Вы не сконструировали функцию f таким образом, чтобы передать ее в функцию деления на части; бизнес, который вы пытались использовать с f и variable, был творческим, но не имеет никакого сходства с тем, как функции создаются в Python. :)

Вот как это сделать:

from math import fabs
from typing import Callable


def bisect(
    a: float,
    b: float,
    y_tolerance: float,
    f: Callable[[float], float],
) -> float:
    """Bisection method."""

    # Mean for bisection.
    mean = (a + b) / 2

    # while-loop as long as y-value is bigger than wished tolerance.
    while fabs(f(mean)) > 10 ** (-y_tolerance):
        # Recalculate mean for each iteration.
        mean = (a + b) / 2

        # If sign of y-values changes, cut interval in half from left.
        if f(mean) * f(b) < 0:
            a = mean
        # If sign of y-values doesn't change, cut interval in half from right.
        elif f(mean) * f(b) > 0:
            b = mean

    # Return mean as approximation of the first root in the interval.
    return mean


print(bisect(-1, 0, 0.1, lambda x: 2 * x + 1))

В качестве альтернативы lambda x: 2 * x + 1 для построения параметра функции вы также можете сделать:

def f(x: float) -> float:
    return 2 * x + 1

print(bisect(-1, 0, 0.1, f))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...