вторник, 25 марта 2008 г.

Python как инструмент обработки экспериментальных данных

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

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

Но в данном контексте это всё не суть, а суть в том, что имею 25 .csv файлов со спектрами, которые надо отнормировать, из которых надо извлечь мощность, ширину, внутререзонаторный спектр, подогнать теоретическим спектром и строить всевозможные графики зависимостей этих величин, дабы понять что вообще там происходит.

И так, мне понадобиться: работа с болшьими массивами чисел, численное интегрирование, интерполяция, численное нахождение корней уравнения F(x)=0 где F - нелинейная функция, аппроксимация по методу наименьших квадратов произвольной функцией.

Выбираем средства: 1.Origin - хорош при обработке малого числа графиков, но в данном случае терпит полный крах, т.к. мне проще будет повеситься, чем работать в нём с таким количеством данных, а это ведь только начало. 2.MathCad - курит в сторонке, т.к. с его интерфейсом я без матов работать не могу - порой кучу усилий надо приложить, чтобы только скобаку поставить в нужном месте, к тому же нет версии под lin. 3.MATLAB - отличный инструмент, но его функционал явно избыточен. 4.SciLab - замечательная штука, в которой есть всё то, что мне необходимо, и которую я уже было подорвался использовать для всех нужд, однако столкнулся с проблемой: скриптами можно организовать пакетную обработку данных (нормировку, аппроксимацию и пр.), но когда появляется необходимость максимально быстро сконструировать график зависимости одной величины, определяемой из пакетной обработки, от другой, приходиться поломать голову. По сути, это язык программирования высокого уровня, но это функциональный язык, в то время как объектно-ориентированный подход мог бы дать большую гибкость. 5. Python - ооп язык программирования высокого уровня в котором я и нашел спасение:

Python как инструмент обработки экспериментальных данных

И так, нам потребуются модули numpy, matplotlib, scipy. Эти модули предоставляют замечательный функционал, включающий всё, что мне может понадобиться на данном этапе.

Вся изюминка кроется в реализации обработки эксперимента: создаем класс "spectr" который будет служить обёрткой для экспериментально-измеренного спектра. Добавляем в качестве методов всё, что мы можем с этим спектром сделать: умножение на другой спектр, центральная блина волны, пиковая мощность, ширина на полувысоте, нормировка по мощности, умножение на константу, обрезание шума, сохранение в файл, открытие из файла. Это краткий список того, что мне понадобилось в первую очередь, что важно, список этот легко может быть расширен в дальнейшем. Далее, создаём класс, описывающий нашу теоретическую модель, который включает в себя все формулы, все параметры, методы аппроксимации, методы расчёта теоретических параметров. Теперь создавая несколько экземпляров класса с разными параметрами легко можно сравнить влияние этих самых параметров на предсказания модели, которые в свою очередь легко сравнить с реальными данными.

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

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

Unknown комментирует...

Очень здорово, что вы, как научный сотрудник пользуетесь питоном. Я -- студентка МАИ, и в нашей среде никто о питоне и слышать не хочет. Не только о питоне, но и о программировании вцелом. А если и говорят о программирвоании, то, конечно, на фортране. Это два неразрывных понятия у них. Поэтому пытаюсь я внедрять в мозг мысли о питоне.
В ваших заметках было бы замечательно прочитать о том, как именно вы используете питон. Как используете методы, модули и прочее. То есть какие-то примеры.

DS комментирует...

Хм.. хорошо, я могу написать пару-тройку практических применений, которые самому приходилось использовать. :) Только вот там нет буквально никакой особой изюминки, т.е. минимальные знания питона и кое-какая автоматизация ручного труда. Мне тут как раз надо перебрать прошлые проекты по обработке данных. А какой именно аспект вас интересует? На что больше обратить внимания?

Unknown комментирует...

Недавно мне понадобилось аппроксимировать данные каким-либо методом. Дело в том, что метод наименьших квадратов подразумевает (если я не ошибаюсь) знание вида функции, которая описывала бы данные. Но даже при таком условии не получилось разобраться, как же пользоваться функциями lstsq из библиотек питона. Пришлось воспользоваться придуманной аппроксимацией, после которой получается не функция, а опять же набор точек (менее "шумный").Ну а вообще хотелось бы узнать, как аппроксимировать данные какой-либо кривой с помощью питона, желательно при условии, что вид функции неизвестен (Например, сплайнами, может быть, Безье).

Второе. Я строила графики с помощью библиотеки python-gnuplot. Допустим у меня есть какие-то данные в виде массива точек, его можно просто построить, но на части точкек были аппроксимированные некоторые прямые, не смогла разобраться, как отобразить и график точек и графики прямых на одной и той же картинке. Немного почитала Matplotlib, но и там не нашла.

DS комментирует...

Извиняюсь за долгое отсутствие.
Заметку о более подробном использовании питона я всё-ещё планирую написать. Более того, возможно придётся обрабатывать массив данных - результаты численных расчётов. По этому с питоном буду работать плотно, там и напишу пару слов.
Для меня осталась загадкой, что такое "придуманная аппроксимация".. Для пользования функцией lastsq действительно надо знать вид функции. Сам же вид часто видно просто на глаз. Слышал про проекты, которые как раз занимаются поиском вида функции, но это совсем другая задача.
Потом, сплайны, это не аппроксимация а интерполяция и, своего рода, сглаживание. Т.е. тут в зависимости от того, что именно надо получить. О том, как пользоваться lastsq я читал во встроенных доках и примерах для scipy.
C python-gnuplot аналогично, хотя больше доков приходилось читать по самому гнуплоту. Если есть более конкретные вопросы, могу попробовать ответить на них по почте.

Unknown комментирует...
Этот комментарий был удален администратором блога.