Как найти максимум функции питон

How do I find the maximum of a function in Python? I could try to hack together a derivative function and find the zero of that, but is there a method in numpy (or other library) that can do it for me?

asked Apr 13, 2012 at 19:13

Nick T's user avatar

2

You can use scipy.optimize.fmin on the negative of your function.

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

Nick T's user avatar

Nick T

25.5k11 gold badges80 silver badges121 bronze badges

answered Apr 13, 2012 at 19:17

ely's user avatar

elyely

74k34 gold badges146 silver badges226 bronze badges

5

If your function is solvable analytically try SymPy. I’ll use EMS’s example above.

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]

Of course, you’ll still need to check that 1 is a maximizer and not a minimizer of f

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

answered Apr 19, 2012 at 13:54

MRocklin's user avatar

MRocklinMRocklin

55.1k21 gold badges155 silver badges233 bronze badges

I think scipy.optimize.minimize_scalar and scipy.optimize.minimize are the preferred ways now, that give you access to the range of techniques, e.g.

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

for a single variable function that must lie between 0 and 1.

Boris Zagoruiko's user avatar

answered Dec 3, 2014 at 9:41

phasor's user avatar

You could try SymPy. SymPy might be able to provide you with the derivative symbolically, find its zeros, and so on.

answered Apr 13, 2012 at 20:50

zarthur's user avatar

zarthurzarthur

5215 silver badges10 bronze badges

Maximum of a function with parameters.

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)

answered Dec 5, 2014 at 16:16

rusnasonov's user avatar

rusnasonovrusnasonov

7522 gold badges12 silver badges23 bronze badges

The bounds argument goes [(lower1,upper1),(lower2,upper2)], not [(lower1,lower2),(upper1,upper2)]. If you look at your result (max_x) you will see «ERROR: NO FEASIBLE SOLUTION», which I am guessing is because your bounds specify an empty set.

Here is a correct way to call the function. I assume the square root is just an example. I used -x**2 instead.

import scipy.optimize as opt
import scipy
from numpy import *
def f(x):
    print x
    return -x**(2)

max_x = opt.fmin_l_bfgs_b(lambda x: -f(x), 1.0, bounds=[(-9,9)],approx_grad=True)

Because you are not specifying a gradient function, you need to set approx_grad=True. The 1.0 is my initial guess for the maximum (although it is obviously zero for this example). I added a print statement so I can see each time the function is called, but that’s normally not necessary. For more details on different ways to call fmin_l_bfgs_b, see here.

The above code results in:

[ 1.]
[ 1.]
[ 1.00000001]
[-0.99999999]
[-0.99999999]
[-0.99999998]
[ 0.001]
[ 0.001]
[ 0.00100001]
[ -5.01108742e-09]
[ -5.01108742e-09]
[  4.98891258e-09]

And max_x looks like this:

(array([ -5.01108742e-09]),
 array([  2.51109971e-17]),
 {'funcalls': 4,
  'grad': array([ -2.21748344e-11]),
  'task': 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL',
  'warnflag': 0})

Автор оригинала: Python Examples.

Функция Python Max () используется для нахождения максимума заданного потенциала или двух или более аргументов.

Мы можем предоставить либо имеющуюся итеративное; или два или более предметов в качестве аргументов к функции max (), но не смешивают, и другие элементы.

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

Синтаксис – max ()

Синтаксис функции max ()

max(iterable, *[, key, default])
# or
max(arg1, arg2, *args[, key])

Мы также можем предоставить значение по умолчанию, которое будет возвращено, если в неразрешении нет элементов.

Пример 1: Найти максимум с намерением

В этом примере мы возьмем список номеров и нахожу наибольшее количество в списке, используя функцию max ().

Python Program

a = [18, 52, 23, 41, 32]
largest = max(a)
print(f'Largest number in the list is : {largest}.')

Выход

rgest number in the list is : 52.

Пример 2: Найти максимум двух или более предметов

В этом примере мы возьмем пять чисел и нахожу наибольшее количество этих с использованием функции MAX ().

Python Program

largest = max(18, 52, 23, 41, 32)
print(f'Largest number in the list is : {largest}.')

Выход

Largest number in the list is : 52.

Пример 3: max () с функцией ключа

В этом примере мы возьмем список чисел и нахожу номер, который оставляет наибольшее напоминание, когда разделено на 10, используя функцию max ().

Мы определим функцию лямбда для ключ Параметр, который возвращает напоминание о элементе в списке для сравнения.

Python Program

a = [18, 52, 23, 41, 32]
keyfunc = lambda x: x % 10
largest = max(a, key=keyfunc)
print(f'Number that leaves largest reminder is : {largest}.')

Выход

Number that leaves largest reminder is : 18.

Пример 4: max () с значением по умолчанию

В этом примере мы возьмем пустой список и нахожу максимальное количество списка, используя функцию max (). Поскольку список пуст, если мы установим параметр по умолчанию для функции MAX (), возвращается значение по умолчанию.

Python Program

a = []
largest = max(a, default = 99)
print(f'Largest number in the list is : {largest}.')

Выход

Largest number in the list is : 99.

Резюме

В этом руководстве примеров Python мы изучили синтаксис MAX () встроенной функции и как его использовать, с помощью примеров.

Функции min и max в Python

В языке программирования Python есть встроенные функции поиска минимума и максимума. Им можно передавать как один объект, так и непосредственно множество однотипных объектов. Если передается один объект, то им может быть список, любая другая коллекция или итерируемый объект.

Если передается один список, то в нем находится минимум или максимум, которые возвращаются функциями min() и max().

Если передается несколько списков, то целиком возвращается один из переданных списков. При этом сравнение происходит поэлементно: сначала сравниваются первые элементы списков. Если они не равны, то функция min() вернет тот список, первый элемент которого меньше, max() — наоборот. Если первые элементы равны, то будут сравниваться вторые и т. д.

Функциям min() и max() можно непосредственно передавать множество чисел:

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

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

В функциях min() и max() можно указать необязательный именной параметр key. Ему присваивается одноаргументная функция, которая выполняет какое-то предварительное действие над элементами списка.

Здесь во втором случае находится максимум среди абсолютных значений чисел. То есть к каждому элементу списка применяется встроенная в Python функция abs(). Однако применить ее к целым спискам нельзя:

Методы min() и max() в Python

max метод в Python

В этом руководстве мы собираемся понять использование методов min и max в Python. По сути, метод Python max() возвращает максимальное значение среди набора переданных значений или элементов переданного итеративного объекта.

Использование метода Python max()

Ниже приведен синтаксис использования метода Python max() для поиска наибольшего значения в итерируемом объекте.

  • iterable — это объект, содержащий значения, для которых необходимо найти наибольшее,
  • key определяет функцию упорядочивания с одним аргументом,
  • И значение по умолчанию — это значение по умолчанию, возвращаемое методом, если переданная итерация пуста.

Чтобы найти наибольшее среди двух или более значений, переданных в качестве аргументов,

  • arg1, arg2,…. argn — это n значений, среди которых метод max() вернет наибольшее значение.

Мы можем использовать метод max() по-разному, чтобы найти максимум или наибольшее значение данной итерации или для двух или более аргументов.

Давайте посмотрим, как метод работает с итерируемым объектом, двумя или более значениями, с указанной ключевой функцией и с несколькими итерационными объектами, переданными в качестве аргументов.

С итерируемым объектом

В приведенном ниже примере мы рассматриваем список с некоторыми значениями, для которого мы должны найти самый большой элемент. Внимательно посмотрите на приведенный ниже код.

Как мы видим, для приведенного выше кода мы инициализируем список list1 и напрямую передаем его методу max() со значением по умолчанию, равным 0. Функция возвращает 8, поскольку это наибольшее значение.

Если бы список был пуст, функция передала бы значение по умолчанию, равное 0.

Передача двух или более значений методу max()

Когда два или более значений передаются методу max() , он возвращает максимальное или самое большое из них всех. Эти аргументы могут быть целыми числами, значениями с плавающей запятой, символами или даже строками.

Получаем максимальное значение, 73.

С ключевой функцией

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

Например, если мы хотим найти кортеж из списка кортежей, который имеет наибольшее значение 2-го элемента. Давайте посмотрим, как мы можем это сделать.

Здесь f() — это определяемая пользователем функция, которая возвращает второй элемент переданного кортежа. Передача этой функции в качестве ключа методу max() гарантирует, что кортеж будет возвращен с самым большим 2-м элементом. В нашем примере это (6, 8, 4).

Передача нескольких итераций в качестве аргументов

Как мы заявляли ранее, метод Python max() может также возвращать в качестве аргументов наибольший из нескольких повторяемых элементов. Эти аргументы могут быть повторяемыми, например строка, символ, кортеж, список и т. д.

По умолчанию метод max() возвращает объект с максимальным нулевым элементом для списков, кортежей и т. д. А для строк он сравнивает первый символ каждой переданной строки.

Ниже мы взяли пример для кортежей. Внимательно посмотрите на код.

В этом примере три кортежа с некоторыми начальными значениями были напрямую переданы методу max() . Что возвращает кортеж с самым большим первым элементом, то есть (7, 37, 1).

Вывод

Помните, что если значение по умолчанию не установлено и в качестве аргументов функции max() передается пустая итерация, возникает ошибка ValueError.

Min() метод

По сути, метод Python min() возвращает минимальное значение среди набора переданных значений или элементов переданного итеративного объекта.

Общий синтаксис использования метода min() приведен ниже. Используя его, мы можем найти минимальное значение среди элементов итерации (список, кортеж, строка и т. д.).

А чтобы найти минимальное значение среди набора элементов, мы можем напрямую передать их все в функцию min() , разделив их запятыми («,»).

  • iterable содержит значения, для которых необходимо найти наименьшее,
  • key — это однострочная функция,
  • default — это значение по умолчанию, возвращаемое функцией, если переданная итерация пуста,
  • arg1, arg2,… argn — это набор значений, для которых функция min() вернет наименьшее значение.

1 С итерируемым объектом

Функция min() широко используется для поиска наименьшего значения, присутствующего в итерируемом объекте, таком как список, кортеж, список списков, список кортежей и т. д. В случае простых списков и кортежей она возвращает наименьшее значение, присутствующее в итерируемом объекте.

Посмотрите на пример, приведенный ниже.

Здесь передача списка list1 непосредственно методу min() дает нам минимум всех элементов, присутствующих в списке, то есть 23. Значение по default установлено на 0, так что, если переданный итерабельный объект был пустым, метод был бы вернули это значение по умолчанию (0).

Для списка символов метод min() возвращает элемент с минимальным значением ASCII.

2 С несколькими аргументами

Когда мы передаем несколько аргументов методу min() , он возвращает самый маленький из них.

Обратите внимание: мы можем передавать несколько значений, а также несколько итераций в метод min() . Для нескольких итераций метод возвращает элемент с наименьшим первым элементом (значение в 0-м индексе).

Пример ниже объясняет это легко:

В приведенном выше примере, когда мы передаем несколько значений в качестве аргументов методу min() , он просто возвращает нам наименьшее значение (434)

В то время как для list1, list2 и list3 он возвращает list3, поскольку он имеет минимальное 0-е значение индекса (19).

3 С ключевой функцией

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

Давайте рассмотрим пример, чтобы понять эту ключевую концепцию.

  • Сначала мы инициализируем список кортежей вместе с тремя другими целочисленными списками разной длины,
  • Затем мы определяем функцию ret_2nd_ele() которая возвращает 2-й элемент или 1-й элемент индекса переданного кортежа,
  • После этого мы передаем list_of_tuples методу min() с ret_2nd_ele() в качестве ключа,
  • Мы снова передаем три списка list1, list2 и list3 в качестве аргументов методу min() с ключом, установленным как встроенный метод len() .

Таким образом, мы получаем кортеж с минимальным 2-м элементом (1-м элементом) для списка кортежей. И список с минимальной длиной (с использованием len() ) из трех списков, то есть list1 .

Всегда помните, что передача пустой итерации без значения по умолчанию, установленного для метода min() , вызывает ValueError .

Finding the maximum of a function

How do I find the maximum of a function in Python? I could try to hack together a derivative function and find the zero of that, but is there a method in numpy (or other library) that can do it for me?

1 day later, before I forget that I even answered that specific question.

5 Answers 5

You can use scipy.optimize.fmin on the negative of your function.

user avatar

If your function is solvable analytically try SymPy. I’ll use EMS’s example above.

Of course, you’ll still need to check that 1 is a maximizer and not a minimizer of f

I think scipy.optimize.minimize_scalar and scipy.optimize.minimize are the preferred ways now, that give you access to the range of techniques, e.g.

for a single variable function that must lie between 0 and 1.

You could try SymPy. SymPy might be able to provide you with the derivative symbolically, find its zeros, and so on.

Maximum of a function with parameters.

user avatar

Not the answer you’re looking for? Browse other questions tagged python numpy or ask your own question.

Linked
Related
Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Уведомления

  • Начало
  • » Центр помощи
  • » экстремум функции

#1 Окт. 17, 2021 14:43:34

экстремум функции

Добрый день.
Задался целью изучить Python.
Поставил перед собой задачу — портировать расчет, который используем в работе, из маткада в python.
И вроде все шло удачно, но столкнулся с таким моментом, который не получается реализовать, а именно найти экстремум функции Y(Х) в заданных интервалах X, с заданием начального приближения переменной Х. Вот аналогичный пример в маткаде ссылка на пример — интересующий фрагмент прикрепил картинкой.

Все, что смог накопать, это использование библиотеки sympy, а также использование функции maximum и minimum из sympy.calculus.util:
x = symbols(“x”)
f = -1*(x ** 7) + 5 * (x **3) — 3 * x
interv = Interval(-2.0, 0.0)
res_min = minimum(f, x, interv)
res_max = maximum(f, x, interv)

Но как задать начальное приближение переменной Х = 1, чтобы результаты получились как в примере -0,452 и -1,162 ?

Заранее благодарю.

Прикреплённый файлы:
attachment Снимок.PNG (122,0 KБ)

Офлайн

  • Пожаловаться

#2 Окт. 17, 2021 16:32:19

экстремум функции

x800
Задался целью изучить Python.
Поставил перед собой задачу — портировать расчет, который используем в работе, из маткада в python.

Зачем? Вот ты теперь сидишь и сделать ничего не можешь с этим. Обучение классное, конечно. Это как мальчишка решил научиться плавать и сиганул на десятиметровую глубину, а там понял, что плавать-то он не умеет, и орёт окружающим, чтобы спасли его, бросили ему спасательный круг.

Хочешь научиться — начинай, как все начинают, с простого чего-нибудь. Если плавать учишься, начинай с лужи, где воды по пояс. А если ты такой умный и тонешь уже в какой-то яме, то тони тихонько, не ори.

Отредактировано py.user.next (Окт. 17, 2021 16:36:47)

Офлайн

  • Пожаловаться

#3 Окт. 17, 2021 18:55:58

экстремум функции

 from scipy import optimize
def f(x):
	return -1*(x ** 7) + 5 * (x **3) - 3 * x
print(optimize.minimize(f,[1]))

       fun: -0.8981283963885099
 hess_inv: array([[0.07846038]])
      jac: array([-1.82539225e-06])
  message: 'Optimization terminated successfully.'
     nfev: 14
      nit: 5
     njev: 7
   status: 0
  success: True
        x: array([0.45161859])
Process finished with exit code 0

Вы чего-нибудь понимаете?…
я нет…

при x = -1

       fun: -1.49841576523223
 hess_inv: array([[0.01842377]])
      jac: array([5.96046448e-08])
  message: 'Optimization terminated successfully.'
     nfev: 16
      nit: 6
     njev: 8
   status: 0
  success: True
        x: array([-1.16240037])
Process finished with exit code 0

Отредактировано xam1816 (Окт. 17, 2021 19:04:46)

Офлайн

  • Пожаловаться

#4 Окт. 17, 2021 19:12:52

экстремум функции

xam1816
x: array(0.45161859)

xam1816
x: array(-1.16240037)

то, что нужно!
спасибо большое!

почитал про optimize.minimize, получается и интервал (как в примере, -2 < x < 0 ) задать можно через параметр bounds!

 x1=[(-2, 0)]
print(optimize.minimize(f,[1], bounds = x1))

то, что искал! спасибо, xam1816, еще раз.

Отредактировано x800 (Окт. 17, 2021 21:25:21)

Офлайн

  • Пожаловаться

  • Начало
  • » Центр помощи
  • » экстремум функции

Понравилась статья? Поделить с друзьями:
  • Как составить резюме на работу юриста образец
  • Как найти координаты точек пересечения 7 класс
  • Как найти длину окружности если известна хорда
  • Как найти айпи адрес в craftsman
  • Как найти объект для уборки