воскресенье, 19 июня 2011 г.

Python2.6 and control systems: building lapack, blas, slycot and python-control under win32_x86

Недавно начал разбираться с вейвлетами и решил под это дело изучать python. В тоже время на работе понадобилось считать АФЧХ линейных систем (ранее делал это в MATLAB, теперь же отказался от него в силу перехода на лицензионно чистый софт). Был найден пакет python-control, и началась эпопея установки всего этого дела под ОС Windows (ну что поделать, на работе пока не перешел на "кошерные" ОСи). Для начала установил сам python, модули numpy, scipy, matplotlib - это задача тривиальная, решается путем скачивания инсталляторов с соответствующих сайтов. Для установки python-control необходимо посетить http://sourceforge.net/projects/python-control/files/ и скачать архив с исходниками, после чего перейти в директорию с распакованными исходниками и выполнить setup.py install. Что тоже тривиально. Но вся эта канитель требует модуля slycot, который просто так не устанавливается, ибо использует модули написанные на фортране, которые надо собрать вместе с библиотеками lapack и blas. Итак:
  1. Сперва устанавливаем mingw32 (понадобится компилятор fortran, но я в придачу поставил и остальные) с http://mingw.org
  2. Посещаем http://www.netlib.org/lapack/ скачиваем релиз lapack-3.2.1. Распаковываем.
  3. В полученную директорию распаковываем LAPACK_gfortran_Win_7Nov2010.zip с http://gcc.gnu.org/wiki/LAPACK%20on%20Windows
  4. Запускаем bat-файл makelibs. Ждем. Полученные lapack.a и blas.a переименовываем в liblapack.a и libblas.a, копируем в mingw-dir/lib/gcc/mingw32/x.y.z, где mingw-dir - это директория куда установлен mingw (у меня D:/Program Files/MinGW), x.y.z - версия gcc (в моем случае 4.5.2)
  5. Скачиваем исходники slycot с https://github.com/avventi/Slycot и распаковываем. Переходим в распакованную директорию и правим setup.py: libraries=['lapack', 'blas']
  6. Далее топаем в Python26/Lib/site-packages/numpy/distutils и правим файл mingw32compiler.py: добавляем строку from distutils.version import LooseVersion после from distutils.version import StrictVersion и вместо self.gcc_version = StrictVersion(result.group(1)) пишем self.gcc_version = LooseVersion(result.group(1))
  7. Выполняем setup.py config_fc --fcompiler=gnu95 config_cc --compiler=mingw32 build
  8. Если все нормально соберется, выполняем setup.py install
В итоге имеем рабочий python-control. 

UPD. То же самое проделал в xubuntu 10.04, уже без плясок с бубном и всего за полчаса, из которых минут 20 собирался slycot. Что и ожидал, ибо нативность и доступность большинства вещей в репозитории (те же lapack и blas).

Получаются красивые картинки:
 

7 комментариев:

  1. А можете посоветовать опен сорс софт, корректно вычисляющий прямое и обратное преобразование Лапласа?
    Например, maxima, не имеет функции Хевисайда h(t) и не понимает теорему запаздывания
    x(t-a)-> X(p)exp(-pa)
    Scilab и Derive еще не пробовал.

    ОтветитьУдалить
  2. А вам как, численно считать или символьно? Вообще преобразование лапласа только ручками считать приходилось, простые вещи. Для проверки использовал http://www.wolframalpha.com/

    ОтветитьУдалить
  3. Символьно. Я раньше тоже считал руками, но со временем уже стало многое забываться, поэтому хочу воспользоваться плодами прогресса :)

    ОтветитьУдалить
  4. Тогда вольфрам в помощь, отличная вещь. Или критично именно опенсорс?

    ОтветитьУдалить
  5. Не некритчно. Вольфрам решает. Спасибо!

    ОтветитьУдалить
  6. плюсую +1. красивые картинки. Жаль, что перестаете вести блог =( ...
    какой питон лучше изучать 2ой или 3ой?? они ж вроде не совместимы ?

    ОтветитьУдалить
  7. насчет питона какой лучше не подскажу, сам только простые вещи на нем делаю, глубоко вникать пока не было необходимости и времени

    ОтветитьУдалить