Численное решение обыкновенных дифференциальных уравнений (ОДУ) в Python
Рассмотрены приемы решения обыкновенных дифференциальных уравнений (ОДУ) с помощью модуля scipy.integrate языка Python
Краткое описание модуля scipy.integrate
Модуль scipy.integrate имеет две функции ode() и odeint(), которые предназначены для решения систем обыкновенных дифференциальных уравнений (ОДУ) первого порядка с начальными условиями в одной точке (т.е. задача Коши).
Функция ode() более универсальная, а функция odeint() (ODE integrator) имеет более простой интерфейс и хорошо решает большинство задач.
Функция odeint() имеет три обязательных аргумента и много опций. Она имеет следующий формат
Решение одного ОДУ
Допустим надо решить диф. уравнение 1-го порядка
Получилось что-то такое:
Решение системы ОДУ
Пусть теперь мы хотим решить (автономную) систему диф. уравнений 1-го порядка
Выходной массив w состоит из двух столбцов — y1(t) и y2(t).
Также без труда можно построить фазовые траектории:
Руководство по SciPy: что это, и как ее использовать
Математика — это масса понятий, которые являются одновременно важными и сложными. Для работы с ними в Python есть библиотека SciPy. В этом материале вы познакомитесь с ее функциями на примерах.
Что такое SciPy?
SciPy — это библиотека Python с открытым исходным кодом, предназначенная для решения научных и математических проблем. Она построена на базе NumPy и позволяет управлять данными, а также визуализировать их с помощью разных высокоуровневых команд. Если вы импортируете SciPy, то NumPy отдельно импортировать не нужно.
NumPy vs SciPy
И NumPy, и SciPy являются библиотеками Python, которые используются для математического и числового анализов. NumPy содержит данные массивов и операции, такие как сортировка, индексация, а SciPy состоит из числового кода. И хотя в NumPy есть функции для работы с линейной алгеброй, преобразованиями Фурье и т. д., в SciPy они представлены в полном виде вместе с массой других. А для полноценного научного анализа в Python нужно устанавливать и NumPy, и SciPy, поскольку последняя построена на базе NumPy.
Пакеты в SciPy
В SciPy есть набор пакетов для разных научных вычислений:
Название | Описание |
---|---|
cluster | Алгоритмы кластерного анализа |
constants | Физические и математические константы |
fftpack | Быстрое преобразование Фурье |
integrate | Решения интегральных и обычных дифференциальных уравнений |
interpolate | Интерполяция и сглаживание сплайнов |
io | Ввод и вывод |
linalg | Линейная алгебра |
ndimage | N-размерная обработка изображений |
odr | Метод ортогональных расстояний |
optimize | Оптимизация и численное решение уравнений |
signal | Обработка сигналов |
sparse | Разреженные матрицы |
spatial | Разреженные структуры данных и алгоритмы |
special | Специальные функции |
stats | Статистические распределения и функции |
Подробное описание можно найти в официальной документации.
Эти пакеты нужно импортировать для использования библиотеки. Например:
Прежде чем рассматривать каждую функцию в подробностях, разберемся с теми из них, которые являются одинаковыми в NumPy и SciPy.
Базовые функции
Взаимодействие с NumPy
SciPy построена на базе NumPy, поэтому можно использовать функции последней для работы с массивами. Чтобы узнать о них подробнее, используйте функции help() , info() или source() .
help():
Функция help() подойдет для получения информации о любой функции. Ее можно использовать двумя способами:
Вот пример для обоих:
При исполнении этого кода, первая help() вернет информацию о подмодуле cluster . А вторая — попросит пользователя ввести название модуля, ключевого слова и др., о чем требуется предоставить дополнительную информацию. Для выхода достаточно ввести quit и нажать Enter.
info():
Эта функция возвращает информацию о конкретных функциях, модулях и так далее.
source():
Исходный код можно получить только для тех объектов, которые были написаны на Python. Функция не вернет ничего важного, если методы или объекты были написаны, например, на C. Синтаксис простой:
Специальные функции
SciPy предоставляет набор специальных функций, используемых в математической физике: эллиптические настраиваемые функции, гамма, бета и так далее. Для их поиска нужно использовать функцию help() .
Экспоненциальные и тригонометрические функции
Набор специальных функций SciPy включает такие, с помощью которых можно искать экспоненты и решать тригонометрические задачи.
Есть и масса других функций из SciPy, с которым стоит познакомиться.
Интегральные функции
Есть и функции для решения интегралов. В их числе как обычные дифференциальные интеграторы, так и методы трапеций.
В SciPy представлена функция quad , которая занимается вычислением интеграла функции с одной переменной. Границы могут быть ±∞ (± inf ) для обозначения бесконечных пределов. Синтаксис этой функции следующий:
А здесь она внедрена в пределах a и b (могут быть бесконечностями).
В этом примере функция a находится в пределах 0 и 1. После выполнения вывод будет такой:
Двойные интегральные функции
SciPy включает также и dblquad , которая используется для вычисления двойных интегралов. Двойной интеграл, как известно, состоит из двух реальных переменных. Функция dblquad() принимает функцию, которую нужно интегрировать, в качестве параметра, а также 4 переменных: две границы и функции dy и dx .
В SciPy есть другие функции для вычисления тройных интегралов, n интегралов, интегралов Ромберга и других. О них можно узнать подробнее с помощью help .
Функции оптимизации
В scipy.optimize есть часто используемые алгоритмы оптимизации:
Функция Розенброка
Функция Розенброка ( rosen ) — это тестовая проблема для оптимизационных алгоритмов, основанных на градиентах. В SciPy она определена следующим образом:
Nelder-Mead
Это числовой метод, который часто используется для поиска минимума/максимума функции в многомерном пространстве. В следующем примере метод использован вместе с алгоритмом Нелдера — Мида.
Функции интерполяции
В сфере числового анализа интерполяция — это построение новых точек данных на основе известных. Библиотека SciPy включает подпакет scipy.interpolate, состоящий из сплайновых функций и классов, одно- и многомерных интерполяционных классов и так далее.
Одномерная интерполяция
Одномерная интерполяция — это область построения кривой, которая бы полностью соответствовала набору двумерных точек данных. В SciPy есть функция interp1d , которая используется для создания одномерной интерполяции.
Вывод:
Многомерная интерполяция
Многомерная интерполяция (пространственная интерполяция) — это тип интерполяции функций, который состоит из более чем одной переменной. Следующий пример демонстрирует работу функции interp2a .
При интерполяции на двумерную сетку функция использует массивы x, y и z для приближения функции f: «z = f(x, y)» и возвращает функцию, у которой вызываемый метод использует сплайновую интерполяцию для поиска значения новых точек.
Вывод:
Функции преобразования Фурье
Анализ Фурье — это метод, который помогает представлять функцию в виде суммы периодических компонентов и восстанавливать сигнал из них. Функции fft используются для получения дискретной трансформации Фурье реальной или комплексной последовательности.
Похожим образом можно найти обратное значение с помощью функции ifft .
Функции обработки сигналов
Обработка сигналов — это область анализа, модификации и синтеза сигналов: звуков, изображений и т. д. SciPy предоставляет некоторые функции, с помощью которых можно проектировать, фильтровать и интерполировать одномерные и двумерные данные.
Фильтрация:
Фильтруя сигнал, можно удалить нежелаемые составляющие. Для выполнения упорядоченной фильтрации используется функция order_filter . Она выполняет операцию на массиве. Синтаксис следующий:
a — N-мерный массив с входящими данными
domain — массив масок с тем же количеством размерностей, что и у массива a
rank — неотрицательное число, которое выбирает элементы из отсортированного списка (0, 1…)
Сигналы
Подпакет scipy.signal также состоит из функций, с помощью которых можно генерировать сигналы. Одна из таких — chirp . Она является генератором частотно-модулированного сигнала, а ее синтаксис следующий:
Вывод:
Линейная алгебра
Линейная алгебра работает с линейными уравнениями и их представлениями с помощью векторных пространств и матриц. SciPy построена на базе библиотек ATLAS LAPACK и BLAS и является очень быстрой в сфере решения проблем, связанных с линейной алгеброй. В дополнение к функциям из numpy.linalg scipy.linalg также предоставляет набор продвинутых функций. Если numpy.linalg не используется вместе с ATLAS LAPACK и BLAS, то scipy.linalg работает намного быстрее.
Нахождение обратной матрицы
С математической точки зрения обратная матрица A — это матрица B, где AB = I, а I — это единичная матрица, состоящая из единиц по диагонали. Это можно обозначить как B=A-1. В SciPy такого можно добиться с помощью метода linalg.inv .
Нахождение определителей
Значение, полученное арифметическим путем из коэффициентов матрицы является определителем квадратной матрицы. В SciPy это делается с помощью функции det с таким синтаксисом:
det(a, overwrite_a=False, check_finite=True)
a — (M, M) — это квадратная матрица
overwrite_a(bool, optional) — разрешает перезаписывать данные
check_finite(bool, optional) — для проверки состоит ли матрица только из конечных чисел
Разреженные собственные значения
Разреженные собственные значения — это набор скаляров, связанных с линейными уравнениями. ARPACK предоставляет способ быстрого нахождения этих значений (собственных векторов). Вся функциональность скрыта в двух интерфейсах: scipy.sparse.linalg.eigs и scipy.sparse.linalg.eigsh .
Интерфейс eigs позволяет находить собственные значения реальных или комплексных несимметричных квадратных матриц, а eigsh содержит интерфейсы реальных симметричных или комплексных Эрмитовых матриц.
Функция eigh решает обобщенную проблему собственного значения для комплексной Эрмитовой или реально симметричной матрицы
Разреженные структуры данных и алгоритмы
Разреженные данные состоят из объектов, которые в свою очередь состоят из линий, точек, поверхностей и так далее. Пакет scipy.spatial из SciPy может вычислять диаграммы Вороного, триангуляцию и другое с помощью библиотеки Qhull. Он также включает реализации KDTree для точечных запросов ближайших соседей.
Триангуляции Делоне
С математической точки зрения триангуляции Делоне для набора дискретных точек на плоской поверхности — это триангуляция, где ни одна точка из представленных не расположена внутри описанной окружности любого треугольника.
Вывод:
Функции многомерной обработки изображений
Обработка изображений — это выполнение операций над изображением по получению информации или улучшенной копии этого изображения из оригинала. Пакет scipy.ndimage состоит из нескольких функций обработки и анализа изображений, которые нужны для работы с массивами с произвольной размерностью.
Свертка и корреляция
В SciPy есть несколько функций для свертки и корреляции изображений.
- Функция correlate1d используется для вычисления одномерной корреляции по заданной оси
- Функция correlate предлагает многомерную корреляцию для любого массива с определенным ядром
- Функция convolve1d используется для вычисления одномерной свертки вдоль заданной оси
- Функция convolve предлагает многомерную свертку для любого массива с определенным ядром
Файловый ввод/вывод
Пакет scipy.io предоставляет несколько функций, которые помогают управлять файлами в разных форматах, включая MATLAB, файлы IDL, Matrix Market и другие.
Для использования его нужно сначала импортировать:
Решение дифференциального уравнения с частными производными с трехмерными пространственными размерами в Python
Проблема заключается в решении трехмерного пространственного PDE с задержкой, и у меня есть следующая проблема. Начальное условие будет тензором формы NxNxN (N точек для переменных x, y и z), но у нас есть задержка, поэтому мне нужно сохранить память системы, предположим, что М шагов. Поэтому конечное начальное условие будет иметь размер NxNxNxM
Если N = 1000 и M = 100 (мой первый пример), мне нужно работать с массивом из 100 000 000 000 записей (много memmory). Scipy не предлагает разреженные структуры для N-мерного массива, а numpy ndarray не работает для этого простого примера. Есть ли у вас рекомендации?
Вы можете думать в простом уравнении:
где x, y, z — пространственные координаты, x, y, z — пространственные переменные, t — временная задержка.
http://pythonru.com/biblioteki/scipy-python
http://progi.pro/reshenie-differencialnogo-uravneniya-s-chastnimi-proizvodnimi-s-trehmernimi-prostranstvennimi-razmerami-v-python-208668