Рубрики
Без рубрики

Scipy в Lightspeed ⚡ Часть 2

Так выглядит так, будто будет больше содержания о сковах функциях. Здесь я собираюсь покрыть интеграцию … Теги с Python.

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

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

Функция Scipy.misc.derivative (func, x0, .0,) вычисляет n Производная функция и возвращает результат x0 передается на производную функцию в качестве аргумента. ФУНК Одномерная функция примет только один параметр. Если вы хотите пройти функцию, которая имеет несколько параметров, вы ищете функцию частичной производной. Это не покрыто здесь.

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

Сначала я буду описать доступную функции интеграции. Теперь большинство из вас знают, что функция интеграции – ∫. F ( x ) D х \ int f (x) dx ∫. F ( x ) D х Для неопределенных интегралов и А B х D х \ int_ {a} ^ {b} x dx ∫. А B х D х Для определенных интегралов. В Scipy функция называется scipy.integrate.quad (func, a, b) Отказ Это только определенные интегралы, и он также принимает функции Lambda, принимая один числовой аргумент и возвращает числовое значение, но он также может принимать нормальные функции.

Для двойной интеграции используйте Scipy.integrate.dblquad (func, x1, x2, y1, y2) Отказ Это объединяет х 1 х 2 ∫. y 1 у 2 F ( Y. , x ) D y D х \ int_ {x1} ^ {x2} \ int_ {y1} ^ {y2} f (y, x) dy dx ∫. х 1 х 2 ∫. y 1 y 2 F ( Y. , x ) D y D х Отказ Орден переменных в прошедшей функции важен, параметр Y наступает перед параметром x.

Тройная интеграция похожа, функция для этого Scipy.integrate.tplquad (func, x1, x2, y1, y2, z1, z2) и это интегрирует ∫. х 1 х 2 ∫. y 1 y 2 z 1 z 2 F ( z , y , x ) D z D y D х \ int_ {x1} ^ {x2} \ int_ {y1} ^ {y2} \ int_ {z1} ^ {z2} f (z, y, x) dz dy dx х 1 х 2 ∫. y 1 y 2 z 1 z 2 F ( z , y , x ) D z D y D х Отказ

Существует также функция, которая выполнит произвольное количество интеграций сразу, хотя это также может быть достигнуто с помощью повторных вызовов на Quad () Отказ Использование Scipy.integrate.nquad (ФУНК, ИТЕР) , вы передаете функцию, принимающую и переменные в порядке x, y, z, ... последний к ФУНК и в истекает Вы передаете список двух элементов диапазонов формы [x1, x2] так что ИТЕР Аргумент будет выглядеть как [[x1, x2], [y1, y2], [z1, z2], ... [Last1 Last2]] . Для конкретной переменной, вместо того, чтобы пройти два диапазона элементов, вы также можете пройти функцию, которая принимает аргументы всех переменных, которые представляют перед ним (пустой список параметров для первой переменной), и пройти в ИТЕР список этих функций. Вот пример:

>>> from scipy import integrate
>>> def f(x, y):
...     return x*y
...
>>> def bounds_y():
...     return [0, 0.5]
...
>>> def bounds_x(y):
...     return [0, 1-2*y]
...
>>> integrate.nquad(f, [bounds_x, bounds_y])
(0.010416666666666668, 4.101620128472366e-16)

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

Домен, который обычно интегрирован в этом случае, это [-1..1] . варенье Я W_ {I} w i являются весами, которые должны быть выборочно выбраны, чтобы сделать наиболее точную интеграцию. Точно так же х Я X_ {I} х я являются входами к функции, которая будет численно интегрирована, избирательно выбрана.

Тем не менее, Scipy скрывает эти сложности и представляет функцию scipy.integrate.fixed_quad (func, a, b, n) выполнять численную интеграцию. Требуется точно такие же параметры, как Quad () , но кроме того, требуется количество весов/очков для использования n , который также называется порядок интеграции. Весь этот процесс иногда называют Исправлена интеграция заказа Отказ

>>> from scipy import integrate
>>> import numpy as np
>>> f = lambda x: x**8
>>> integrate.fixed_quad(f, 0.0, 1.0, n=4)
(0.1110884353741496, None)
>>> integrate.fixed_quad(f, 0.0, 1.0, n=5)
(0.11111111111111102, None)
>>> print(1/9.0)  # analytical result
0.1111111111111111

>>> integrate.fixed_quad(np.cos, 0.0, np.pi/2, n=4)
(0.9999999771971152, None)
>>> integrate.fixed_quad(np.cos, 0.0, np.pi/2, n=5)
(1.000000000039565, None)
>>> np.sin(np.pi/2)-np.sin(0)  # analytical result
1.0

С другой стороны, есть также расширенная цифровая функция интеграции scipy.integrate.quadratore (func, a, b, .49e-08,) Это выберут последовательно более высокие заказы n Чтобы интегрировать до тех пор, пока численная интеграция (суммирование) не имеет ошибки меньше, чем Толь , но он перестанет пытаться, если заказ становится выше, чем макситран Так что, если это произойдет, он просто вернет интеграцию в этом порядке. Эта функция возвращает кортеж из (результат, ошибка) численной интеграции.

>>> from scipy import integrate
>>> import numpy as np
>>> f = lambda x: x**8
>>> integrate.quadrature(f, 0.0, 1.0)
(0.11111111111111106, 4.163336342344337e-17)
>>> print(1/9.0)  # analytical result
0.1111111111111111

>>> integrate.quadrature(np.cos, 0.0, np.pi/2)
(0.9999999999999536, 3.9611425250996035e-11)
>>> np.sin(np.pi/2)-np.sin(0)  # analytical result
1.0

Напомним, что обычное дифференциальное уравнение (ODE) определяется как

F F F представляет собой произвольную функцию, которая меняет дифференциальное уравнение. Идея состоит в том, чтобы найти y y y Функция, которая будет вместе с ее n 1 N-1 n 1 производные, делают уравнение к его n n n Производное. Уравнение выше – это ода n-го порядка. Ода первого порядка будет иметь два термина:

И это то, как будет выглядеть ODE второй заказ:

Но добраться до точки, Scipy имеет процедуры, которые могут решить эти уравнения. Учитывая функцию, начальное и окончательное значение x, начальное значение y Y0 Такое, что f (x_start) Отказ Scipy.integrate.solve_ivp () Возвращает точки x и значения функции решения при соответствующем X’s. Y0 Может быть массив начальных позиций. В этом случае solve_ivp () рассчитает соответствующие очки X Каждый_x Это удовлетворяет f (каждый_x) . Другими словами, он просто решает дифференциальное уравнение несколько раз с различными исходными значениями, а затем возвращает результаты всех из них, завернутых в массиве.

>>> from scipy.integrate import solve_ivp
>>> def exponential_decay(t, y): return -0.5 * y
>>> sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8])
>>> print(sol.t)
[ 0.          0.11487653  1.26364188  3.06061781  4.81611105  6.57445806
  8.33328988 10.        ]
>>> print(sol.y)
[[2.         1.88836035 1.06327177 0.43319312 0.18017253 0.07483045
  0.03107158 0.01350781]
 [4.         3.7767207  2.12654355 0.86638624 0.36034507 0.14966091
  0.06214316 0.02701561]
 [8.         7.5534414  4.25308709 1.73277247 0.72069014 0.29932181
  0.12428631 0.05403123]]

T значения (где T это X в нашем примере), которые введены в функцию Y, являются теми, что в SOL.T Отказ Для первого T мы используем f (first_t) Чтобы получить первое значение решения для first_y0 (2), тогда мы делаем то же самое для f (second_t) (1.88836035), F (Third_t) (1.06327177), до последнего из (четвертого) (0.43319312). Это начинает массив решения для first_y0 Отказ Затем он делает подобные массивы для second_y0 (4) и Third_y0 (8) Используя точно такой же процесс, который я описал ранее. Если бы было дополнительное Y0 Значения они тоже будут оценены, и в Соль.Й вывод.

Также обратите внимание, что мы не выбирали значения T Выше он догадался, что средние значения T что мы хотели с начала и конечной точки. Обычно мы хотим знать решение в определенных точках т . t_eval Параметр (числовой массив) может использоваться рядом с начальным и конечным точкой для расчета значений y Только Для точек в t_eval множество.

>>> sol = solve_ivp(exponential_decay, [0, 10], [2, 4, 8],
...                 t_eval=[0, 1, 2, 4, 10])
>>> print(sol.t)
[ 0  1  2  4 10]
>>> print(sol.y)
[[2.         1.21305369 0.73534021 0.27066736 0.01350938]
 [4.         2.42610739 1.47068043 0.54133472 0.02701876]
 [8.         4.85221478 2.94136085 1.08266944 0.05403753]]

Это возвращает решение в точках 0, 1, 2, 4 и 10.

Прежде чем мы приступим к описанию функций математической оптимизации, нам нужно знать, что такое термин «оптимизация». Я цитирую от Википедия :

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

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

Вы также услышите условия ограничены и неограниченный Отказ Задача ограниченной оптимизации заключается в том, что реляционные функции ограничивают область решений, возвращая False для диапазонов значений аргумента, которые должны быть исключены. Может быть несколько ограниченных «реляционных» функций. Неограниченная задача оптимизации не имеет таких функций ограничения.

На данный момент мы сосредоточимся на минимизации функций. Функция для выполнения минимизации в Scipy называется Scipy.Optimize.minimize () Отказ Эта функция занимает Метод Параметр, который является строкой, которое является названием метода оптимизации для использования. Мы не будем беспокоиться с множеством доступных методов оптимизации, поэтому не слишком беспокоитесь о значении доступного способа.

Алгоритмы оптимизации работают, применяя уравнение к функции несколько раз подряд, другими словами, в итерации . Мы видели это ранее с дифференциальными уравнениями. Толь Параметр – самая большая ошибка, которую вы готовы терпеть между двумя итерациями. Мне нравится называть это фактором конвергенции, потому что ошибка должна быть меньше после последующих итераций, поэтому в конечном итоге она сходится в ответ.

>>> from scipy.optimize import minimize, rosen, rosen_der
>>> x0 = [1.3, 0.7, 0.8, 1.9, 1.2]
>>> res = minimize(rosen, x0, method='Nelder-Mead', tol=1e-6)
>>> res.x
array([ 1.,  1.,  1.,  1.,  1.])

res.x Массив имеет одно значение для каждого параметра, передаваемого на функцию. Вместе эти значения, применяемые к параметрам, делают наименьшее значение во всей функции. В этом случае первоначальное предположение x0 привести нас к [1, 1, 1, 1, 1] вызывая функцию Розенброка (тот, который мы пытаемся минимизировать), чтобы вывести наименьшее значение.

В этом примере мы прошли пять параметров в функцию RoseNbrock, но внутри ее выполняет суммирование операции, которая выполняет ее параметрам, поэтому мы можем пройти другое количество параметров. Эта функция возвращает только одно значение. Это делает не Верните одинаковое количество значений в качестве параметров.

Простой трюк, чтобы найти максимальное значение в функции – отрицать функцию, которую вы хотите максимизировать, а затем передавать ее на Минимизировать () Функция, как Минимизировать (-Росен) Отказ

Наконец, я хотел бы описать, как можно использовать Scipy, чтобы найти корни функций. Root Finding означает поиск значений параметров функции, для которой вывод равен нулю. Точно так же root это любое значение параметра, которое делает функцию нуля. Так что в функции F - 3 единственный корень – 3 С F (3) Но другие функции могут иметь много корней. Он похож на проблемы с минимизацией, но вместо того, чтобы найти параметры, которые делают наименьшее значение, мы находим параметры, которые делают нулевые значения. Как и в случае с минимизацией функций, могут быть несколько мест в функции, которые делают нулевое значение.

Вы можете использовать Scipy.Optimize.root (Func, Initive_Guess) для этой задачи. Если Initive_Guess Это массив, то он должен быть одинаковым размером, что и количество параметров ФУНК Отказ

Этот пример находит корни х + 2 COS ( x ) = 0 х + х + 2 COS ( x ) = 0 :

>>> import numpy as np
>>> from scipy.optimize import root
>>> def func(x):
...     return x + 2 * np.cos(x)
>>> sol = root(func, 0.3)
>>> sol.x
array([-1.02986653])

В этой статье мы узнали о расчете производных, нескольких интегралов, приближений численных интегралов, решений дифференциальных уравнений, задач минимизации и корневой находки. Это основные столбы высшей математики и полезны не только в школе Но когда вы делаете производственные приложения, которые имеют математическую часть для них. Например, например, автомобильные цилиндры. Вам нужны интегралы для определения громкости цилиндра. Ускорение – это производная скорости. И хотя автопроизводители (просто чтобы сделать конкретный пример), скорее всего, не используют Scipy, или Python вообще для работы, вы, по крайней мере, сможете имитировать динамику, которая происходит там, в ваших собственных системах.

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

Изображение Крейг Мелвилл от Pixabay.

Оригинал: “https://dev.to/zenulabidin/scipy-at-lightspeed-part-2-22i0”