Блог naboo

Регистрация

Календарь

  Октябрь 2011  

Пн Вт Ср Чт Пт Сб Вс
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Теги

3d  graphics  java  java3d  programming  programming math 

На странице

RSS - подписка

Математический Python

Математический Python

 

Содержание

В этом обзоре будут рассмотрены различные библиотеки для языка Python, которые могут пригодиться для математических и инженерных задач. Для меня основной целью написания этого обзора было собрать различные библиотеки, которые в вместе могли бы как можно полнее заменить Matlab. В конце каждого раздела, посвященного одной библиотеке, приводятся примеры ее использования, чтобы можно было бы примерно оценить какой по объему код надо написать при работе с данной библиотекой.


SymPy

Сайт: http://code.google.com/p/sympy/
Поддерживаемые версии Python: 2,4 — 3,1
Документация: http://docs.sympy.org/

Краткое описание

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

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

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

Примеры использования

Основные операции

> > > import sympy

> > > # Создание символьных переменных
> > > x = sympy.Symbol('x')
> > > y = sympy.Symbol('y')

> > > # То же самое, но используя функцию symbols()
> > > x, y = sympy.symbols ('xy')

> > > # Еще один способ создания символьных переменных. Используется, если имя переменной состоит из нескольких символов
> > > sympy.var ('x y')
(x, y)

> > > # Простейшие математические операции
> > > print (x + x + y * y + 1)
1 + 2*x + y**2

> > > # В модуле SymPy предусмотрена специальная функция pprint() для более наглядного вывода символьных выражений
> > > sympy.pprint (x + x + y * y + 1)
           2
1 + 2*x + y

> > > sympy.pprint(sympy.Integral(x**2, x))
  /    
 |      
 |  2  
 | x  dx
 |      
/  

> > > # Раскрытие скобок
> > > z = (x + y) ** 2
> > > sympy.pprint (z.expand())
         2    2
2*x*y + x  + y

> > > #Разложение на простые дроби
> > > z = 1/( (x+2)*(x+1) )
> > > sympy.pprint (sympy.apart (z, x) )
  1       1  
--- - ---
1 + x   2 + x

> > > # Полином Чебышева четвертой степени
> > > sympy.pprint (sympy.chebyshevt(4, x))
       2      4
1 - 8*x  + 8*x

> > > # Операции с дробями
> > > a = sympy.Rational(1,2)
> > > sympy.pprint (a)
1/2

> > > sympy.pprint (a + 1)
3/2
 

Немного геометрии

> > > # Радиус круга
> > > r = sympy.Symbol ('r')

> > > # Создаем круг в начале координат (0, 0) радиусом r
> > > circle = sympy.Circle (sympy.Point (0, 0), r)

> > > # Площадь круга
> > > sympy.pprint (circle.area)
    2
pi*r

Отображение поверхностей

> > > x, y = sympy.symbols ('xy')
> > > sympy.Plot (x**2 + y**2)
[0]: x**2 + y**2, 'mode=cartesian'

В результате выполнения этого примера откроется новое окно с с поверхностью, которую можно вращать, приближать и удалять:


NumPy

Сайт: http://numpy.scipy.org/
Поддерживаемые версии Python: 2,5, 2,6 (есть более старые версии, которые поддерживают Python 2,3 и 2,4)
Документация: http://scipy.org/doc/numpy_api_docs/

Краткое описание

NumPy - это пакет, который просто необходимо ставить в первую очередь, если вы хотите заниматься вычислениями на Python.

Вот неполный список того, что есть внутри NumPy.

  • Работа с матрицами и векторами
  • Быстрое преобразование Фурье (одномерное и двумерное)
  • Компиляция модулей на фортране
  • Работа с полиномами (вычисление корней полинома, математические операции с полиномами и т.п.)
  • Функции для линейной алгебры (вычисление определителя матрицы, вычисление обратных матриц, решение системы линейных уравнений и т.п.)

К сожалению, полное руководство по NumPy бесплатно скачать нельзя (оно продается за $39,99). Выложить руководство для всеобщего скачивания планируется в 2010 году, а пока приходится довольствоваться документацией, сгенерированной программой endo. Раньше NumPy назывался Numeric Python, книгу по которому можно скачать на официальном сайте, но изменений произошло настолько много, что пользоваться книгой по Numeric Python практически невозможно.

Примеры использования

Работа с матрицами

В NumPy есть два класса для работы с матрицами — array и matrix. Оба этих класса, не смотря на название, предназначены для работы с матрицами. При этом есть различия в некоторых операциях над экземплярами классов. Например, оператор * для array производит поэлементное перемножение хранимых в матрице величин. А для перемножения матриц по правилам линейной алгебры есть метод dot.

> > > import numpy

# Создание матрицы
> > > a = numpy.array ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], «f»)
> > > print a
[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]]

# Создадим единичную матрицу размера 3 x 3. Матрица будет хранить числа с плавающей точкой.
> > > a = numpy.ones ([3,3], «f»)
> > > print a
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
> > > b = numpy.ones ([3,3], «f»)
> > > b *= 2
> > > print b
[[ 2.  2.  2.]
 [ 2.  2.  2.]
 [ 2.  2.  2.]]
> > > c = a + b
> > > print c
[[ 3.  3.  3.]
 [ 3.  3.  3.]
 [ 3.  3.  3.]]

Перемножение матриц и их элементов:

> > > a = numpy.array ([[1, 2, 3], [4, 5, 6]], «f»)
> > > print a
[[ 1.  2.  3.]
 [ 4.  5.  6.]]
> > > b = numpy.array ([[0, 1, 2], [4, -1, 1]], «f»)
> > > print b
[[ 0.  1.  2.]
 [ 4. —1.  1.]]

# Поэлементное перемножение
> > > c1 = a * b
> > > print c1
[[  0.   2.   6.]
 [ 16.  -5.   6.]]

# Транспонирование матрицы
> > > bt = b.T
> > > print bt
[[ 0.  4.]
 [ 1. —1.]
 [ 2.  1.]]

# Перемножение матриц
> > > c2 = numpy.dot(a, bt)
> > > print c2
[[  8.   5.]
 [ 17.  17.]]

Удобно выделять части матриц. Знатоки Matlab'а оценят :)

> > > a = numpy.array ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], «f»)
> > > print a
[[ 1.  2.  3.]
 [ 4.  5.  6.]
 [ 7.  8.  9.]]

> > > tmp = a[:, 0]
> > > print tmp
[ 1.  4.  7.]

> > > tmp2 = a[0:2, 1:3]
> > > print tmp2
[[ 2.  3.]
 [ 5.  6.]]

# Так же работает присваивание
> > > a = numpy.zeros([3, 3], «f»)
> > > print a
[[ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]]
> > > a[:, 0] = [n for n in range(3)]
> > > print a
[[ 0.  0.  0.]
 [ 1.  0.  0.]
 [ 2.  0.  0.]]

Быстрое преобразование Фурье

> > > import numpy.fft
> > > import math
> > > a = [(-1)**n for n in xrange (8)]
> > > print a
[1,0, -1,0, 1,0, -1,0, 1,0, -1,0, 1,0, -1,0]
> > > b = numpy.fft.fft(a)
> > > print b
[ 0.+0.j  0.+0.j  0.+0.j  0.+0.j  8.+0.j  0.+0.j  0.+0.j  0.+0.j]

Matplotlib

Сайт: http://matplotlib.sourceforge.net/
Поддерживаемые версии Python: 2,4, 2,5
Документация: http://matplotlib.sourceforge.net/

Краткое описание

Matplotlib - это библиотека для построения графиков и визуализации данных. Кроме большого количества типов графиков, которые можно построить с помощью этого пакета, приятной особенностью Matplotlib является то, что функции для построения графиков напоминают функции Matlab. Здесь есть проблемы с отображением на графиках русских букв. Зато через Matplotlib можно выводить формулы в виде TeX. Графики, нарисованные с помощью Matplotlib можно масштабировать для просмотра интересующей области, причем как программно из скрипта, так и через интерфейс с помощью мыши.

Примеры использования

#-*- coding: utf-8 —*-

import pylab
import math

# Картинка в левом верхнем углу

x1 = range (1, 100)
data1 = [math.exp (-n * n / 1000,0) for n in x1]

# Разбиваем окно на две  строки и два столбца. Вывод будет осуществляться в первую область
pylab.subplot (2, 2, 1)

# Вывод данных
pylab.plot (x1, data1, «r»)


# Картинка в правом верхнем углу
fracs = [10, 20, 30, 40]

# Разбиваем окно на две  строки и два столбца. Вывод будет осуществляться во вторую область
pylab.subplot (2, 2, 2)
pylab.pie (fracs)

# Картинка снизу
x2 = range (0, 720)

data2 = [math.sin (n * math.pi / 180,0) for n in x2]
data3 = [math.sin (n * math.pi / 180,0 + math.pi / 3) for n in x2]

# Разбиваем окно на две строки и один столбец. Вывод будет осуществляться во вторую область
pylab.subplot (2, 1, 2)

# Вывод данных
pylab.plot (x2, data2)
pylab.plot (x2, data3, «-»)

# Добавим легенду
pylab.legend ([«label 1», «label 2»])

# Включим сетку
pylab.grid(True)

# Нарисовать все
pylab.show()

Результат работы:

Также можете посмотреть статью Рисование трехмерных графиков в Python с помощью Pylab/MatPlotLib и Шпаргалку по библиотеке Matplotlib/Pylab.

Много примеров использования можно найти на этой странице официального сайта.


Dislin

Сайт: http://www.mps.mpg.de/dislin/
Поддерживаемые версии Python: 2,3, 2,4, 2,5, 2,6
Документация: http://www.mps.mpg.de/dislin/contents.html и http://www.mps.mpg.de/dislin/document.html

Краткое описание

Так как Matplotlib не умеет строить трехмерные графики, то пришлось искать другие библиотеки, который могли бы это делать. На форуме сайта http://python.com.ua дали ссылку на Dislin.

Dislin - это многоязыковая библиотека для построения графиков. Среди поддерживаемых языков кроме Python числятся C, C++, C#, Visual Basic .NET, Java, Perl и Fortran. Работает библиотека очень быстро, а внешний вид настраивается довольно гибко. Правда, внешний вид можно менять только программно, даже трехмерные графики нельзя вращать мышкой, а координаты наблюдателя изменяются программно.

Но сначала хотелось бы сказать несколько слов про установку. После того как вы распакуете дистрибутив и инсталируете его, необходимо добавить еще несколько переменных окружения, чтобы Dislin мог работать из любой папки, а не только из папки Python, расположенной внутри папки установки Dislin. Для краткости будем считать, что Dislin установлен в папку c:\dislin. Вот какие изменения нужно проделать с переменными окружения:

  • Создать переменную окружения DISLIN = c:\dislin
  • Создать переменную окружения PYTHONPATH = c:\dislin\python
  • В переменную окружения PATH добавить путь c:\dislin\win

Dislin может отображать следующие типы графиков:

  • Функции одной переменной (в том числе и в полярной системе координат).
  • Диаграммы в виде столбиков разной высоты (Bar), в том числе трехмерные.
  • Диаграммы в виде секторов круга (Pie), в том числе трехмерные.
  • Двумерные диаграммы функций от двух переменных, где значение функции определяет цвет в данной точке.
  • Трехмерные графики функций двух переменных, где значение функции определяет положение точки по вертикальной оси (также можно сделать, чтобы значение функции определяло бы и цвет вершин).
  • Построение линий уровня.
  • Вывод формул в формате TeX.

Примеры использования

График функции одной переменной

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

import dislin
import math

x = range (1, 100)
data = [math.exp (-n * n / 300,0) for n in x]

dislin.plot (x, data)

dislin.disfin ()

А вот как выглядит результат работы (нажмите на картинку, чтобы увидеть ее в полный размер):

dislin1.png: 860x631, 10k (12.01.2008 14:37)

Как видите, по умолчанию вывод довольно аскетичен

Трехмерные графики функций

А теперь рассмотрим код, минимально необходимый для построение трехмерных графиков.


import dislin
import math

data = []

nx = 20
ny = 40

# Заполняем массив с данными
for n in xrange(-nx, nx + 1):
        for m in xrange (-ny, ny + 1):
                data.append (math.exp (-abs (n * m)  / 100,0) )

# График выводим в окно
dislin.metafl ('xwin')
dislin.disini ()

# Устанавливаем точку наблюдения
dislin.view3d (5., -4., 6., 'ABS')

# Устанавливаем область для отображения и шаг рисок
dislin.graf3d  (-nx, nx, -nx, 10., -ny, ny, -ny, 20, 0., 1., 0., 0,1)

# Выводим куб, охватывающий трехмерный график
dislin.box3d()

# Устанавливаем размеры осей по каждой координате (изменяем масштаб по осям)
dislin.axis3d (1, 2, 1)

# Строим данные по координатам
dislin.surmat (data, nx * 2 + 1, ny * 2 + 1, 1, 1)

dislin.disfin ()

Результат работы:

dislin2.png: 860x631, 16k (12.01.2008 14:37)

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

import dislin
import math

# Функция, график которой надо построить. Что означает параметр iopt смотрите в документации
def myfunc (x, y, iopt):
        if iopt == 1:
                return x
        elif iopt == 2:
                return y

        xp = x / 180,0 * math.pi
        yp = y / 180,0 * math.pi

        return  abs (math.cos(xp / 1,5) * math.cos(yp / 1,5))

nx = 180
ny = 180

dislin.metafl ('xwin')
dislin.scrmod ('revers')

dislin.disini ()
dislin.view3d (3., -4., 6., 'ABS')
dislin.graf3d  (-nx, nx, -nx, 50., -ny, ny, -ny, 50, 0., 1., 0., 0,1)
dislin.box3d()

# Включим отображение сетки на графике
dislin.surmsh ('on')

# Строим график функции. Среди параметров передаеются также интервал построения и шаг
dislin.surfcp (myfunc, -nx, nx, 10,0, -ny, ny, 10,0)

dislin.disfin ()

И результат работы:

dislin3.png: 860x631, 30k (12.01.2008 14:37)

Другие примеры вы можете найти на сайте библиотеки Dislin по адресу http://www.mps.mpg.de/dislin/examples.html.


Ссылки

Ниже перечислены некоторые другие библиотеки, которые могут пригодиться при вычислениях на Python. Так как работать с ними мне пока не приходилось, то подробного описания я не привожу.

Расчеты

Sympy - библиотека для символьных вычислений на Python. Постоянно обновляется.

Визуализация

Gnuplot.py - библиотека для построения графиков с помощью программы Gnuplot. Для работы требует библиотеку Numeric Python. Поддерживает Python, начиная с версии 1.5. Последняя версия вышла, к сожалению, в 2003 году.

PyNGL. Результаты работы это библиотеки можно увидеть на этой странице.

Chaco. Библиотека для отображения одномерных и двумерных данных — сигналов, двумерных массивов, картинок. Судя по скриншотам библиотека заслуживает внимания. Правда, документацию с сайта пока скачать не удается.

Paida. Реализация на Python библиотеки AIDA, которая изначально была предназначена для программирования на C++ и Java. Paida умеет строить как двумерные, так и трехмерные графики.

Также много библиотек перечислены на странице http://pypi.python.org/pypi?:action=browse&c=385 официального сайта языка Python.

Теги: programming math