Подтвердить что ты не робот

Поиск максимума функции

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

4b9b3361

Ответ 1

Вы можете использовать scipy.optimize.fmin отрицательный результат своей функции.

def f(x): return -2 * x**2 + 4 * x
max_x = scipy.optimize.fmin(lambda x: -f(x), 0)
# array([ 1.])

Ответ 2

Если ваша функция разрешима аналитически, попробуйте SymPy. Я буду использовать пример EMS выше.

In [1]: from sympy import *
In [2]: x = Symbol('x', real=True)

In [3]: f = -2 * x**2 + 4*x

In [4]: fprime = f.diff(x)
In [5]: fprime
Out[5]: -4*x + 4

In [6]: solve(fprime, x) # solve fprime = 0 with respect to x
Out[6]: [1]

Конечно, вам все равно нужно будет проверить, что 1 - это максимизатор, а не минимизатор f

In [7]: f.diff(x).diff(x) < 0
Out[7]: True

Ответ 3

Вы можете попробовать SymPy. SymPy может предоставить вам производную символически, найти нули и т.д.

Ответ 4

Я думаю, что scipy.optimize.minimize_scalar и scipy.optimize.minimize являются предпочтительными способами, которые дают вам доступ к диапазону методов, например.

solution = scipy.optimize.minimize_scalar(lambda x: -f(x), bounds=[0,1], method='bounded')

для одной переменной функции, которая должна находиться между 0 и 1.

Ответ 5

Максимум функции с параметрами.

import scipy.optimize as opt

def get_function_max(f, *args):
    """
    >>> round(get_function_max(lambda x, *a: 3.0-2.0*(x**2)), 2)
    3.0

    >>> round(get_function_max(lambda x, *a: 3.0-2.0*(x**2)-2.0*x), 2)
    3.5

    >>> round(get_function_max(lambda x, *a: a[0]-a[1]*(x**2)-a[1]*x, 3.0, 2.0), 2)
    3.5
    """
    def func(x, *arg):
        return -f(x, *arg)
    return f(opt.fmin(func, 0, args=args, disp=False)[0], *args)

Ответ 6

Если я умножу функцию на -1, функция минимизации включается и максимизируется. Как мне справиться с ограничениями и ограничениями? Насколько я понимаю, я должен умножить ограничения на -1, но пусть границы остаются прежними.