Open Fab Lab Wiki Знакомство с IPython — Сайт русскоязычного фаблаб-сообщества

Знакомство с IPython

Материал из Сайт русскоязычного фаблаб-сообщества
Перейти к: навигация, поиск

Содержание

Установка необходимого ПО

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

Скачать его можно здесь. Выберите версию для своей операционной системы с языком Python 3.

Обратите внимание, что Anaconda использует папку пользователя (в Windows она находится в папке Users) и пугается если имя пользователя написано кириллицей. Мне пришлось создать латинского пользователя чтобы добиться от нее нормальной работы.

Теперь надо ее немного настроить:

В меню "Пуск > Все программы > Anaconda (32-bit)" найдем и запустим Anaconda Command Prompt, приложение с очень лаконичным интерфейсом:

Anaconda console.png

В ней наберем команду обновления самой Анаконды:

conda update conda

И в ответ на вопрос "[y]/n?" нажмем Enter. После того как пройдут разные процессы и снова появится строка с курсором, наберем:

conda update ipython

И снова в ответ на вопрос "[y]/n?" нажмем Enter. Пройдет процесс обновления. По окончании активности в этом окошке его можно закрыть.

Также, необходимо установить библиотеку pyserial для работы с последовательным портом:

pip install pyserial

IPython

Это интерактивный интерпретатор языка python, который можно установить как сам по себе, так и в составе дистрибутива Anaconda.

При запуске открывается ваш обычный браузер, во вкладках которого все дело и будет происходить. Основная вкладка, представившаяся как IPython Dashboard служит для управления нашими тетрадками (Notebooks).

Ipynotebook.jpg

С этой панели тетрадки можно создавать, запускать (можно несколько), останавливать и удалять. Создадим новую кнопкой New Notebook. Появится новая вкладка и в ней тетрадка, пока белоснежная и практически пустая.

New notebook.png

Перед нами ячейка с курсором.

Наберем в ней какую-нибудь программку. Как видим, нажатие кнопки Enter не приводит к исполнению вводимых строк. Чтобы действительно запустить программу надо нажать Shift+Enter.

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

При этом программа исполнится и появится новая ячейка.

Tespython.png

Теперь мы можем продолжить писать программу в других ячейках. Но при этом мы можем редактировать и перезапускать и то что осталось в первой ячейке. Например, изменим данные в первой ячейке и нажмем в ней Shift+Enter. Данные пересчитаются. Программа во второй ячейке будет использовать уже новое значение переменной a.

Ipymultitest.png

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

Ipython menu.png

Если результат расчетов представляет научную ценность, его можно сохранить, переименовать, создать контрольную точку для возврата в случае чего. Эти изменения отразятся на вкладке управления. Можно при желании сохранить программу и в обычном формате *.py.

В Ipython можно, разумеется, строить и графики:

Ipygraph.png

А можно сделать так, чтобы график строился не в отдельном окне, а прямо в тексте. Для этого служит команда

%matplotlib inline 

Ipyinlune.png

Обмен данными с Ардуино

Теперь давайте удалим из нашей схемы с переменным резистором и лампочкой (см. Знакомство с электронным конструктором) все лишнее, а именно лампочку и связанную с ней нулевую перемычку. Внимание! Если вы проводили опыт с датчиком Холла, не забудьте вернуть проводки в положение пригодное для переменного резистора, иначе возможно замыкание. Схема должна иметь такой вид:

ArdPy.jpg

Также мы удалим все лишнее из программы для контроллера, так что она примет следующий вид:

ArPPY.jpg

Обратите внимание на увеличенную задержку в цикле. Это сделано для наглядности, чтобы когда python будет выводить эти данные, мы могли уследить за их бегом. Итак, загрузим программу и убедимся, что она выдает в порт список чисел по одному на строке, и что они действительно зависят от поворота винтика резистора:

PortMon1.jpg

Теперь давайте закроем монитор порта и запустим IDLE и попробуем как-нибудь поработать с этими данными в Python. Для начала импортируем библиотеку связи с последовательным портом:

import serial

Обратите внимание, что в python в отличие от языка Arduino не надо писать точку с запятой в конце строки.

Теперь попробуем открыть порт. У меня контроллер подключен к порту COM68, поэтому я пишу:

ser = serial.Serial(67,timeout=60) 

где 67 - номер порта, уменьшенный на 1, 60 - время ожидания данных от порта (важно в некоторых командах, чтобы не ожидать вечно). Можно проверить имя порта, к которому мы подключились, если набрать:

ser.portstr 

Система ответила на это надписью 'COM68', то есть все в норме. Теперь, наберем:

ser.inWaiting()

И получим ответ 4093L, то означает наличие в приемном буфере 4093 байт. Оно и неудивительно - ведь пока мы разбирались с портом, контроллер не терял времени, усердно посылая значения в порт. Считаем одно из них:

ser.readline() 

На экране появится '1008\r\n'. Знаки справа означают перевод строки. Избавимся от них, считывая значения командой:

ser.readline()[:-2]

На экране появится '1008'. Теперь нас смущают только кавычки. Дело в том, что в кавычках система выводит строки, а нам ведь хочется обрабатывать полученные данные как числа. Конвертируем оператором int()

int(ser.readline()[:-2])

На экране появится 1008 без всяких кавычек. Но это ведь довольно устаревшее значение сигнала. А нам нужно современное. Удалить все былое можно командой:

ser.flushInput()

Вот теперь мы готовы принимать данные. Напишем такую программку и запустим ее:

import serial
ser = serial.Serial(67,timeout=60)
print ser.portstr
ser.flushInput()
for i in range(100):
    print int(ser.readline()[:-2])
ser.close()

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

import serial
ser = serial.Serial(67,timeout=60)
print ser.portstr
D=[]
ser.flushInput() 
for i in range(100):
    D.append(int(ser.readline()[:-2]))
ser.close()
print D

На следующей картинке показан результат этой программы если не трогать переменный резистор (вверху), и если крутить его (внизу)

PyMon.jpg

Графики

Смотреть на список цифр не так интересно, как отображать их на графике. Давайте уберем из нашей последней программы строку print D, а вместо нее допишем:

from pylab import *
plot(D)
show()

Вот что мы увидим через 10 секунд (когда накопятся заданные нами 100 значений), если при этом будем крутить винт переменного резистора туда-сюда (если он будет стоять на месте, картинка получится менее интересной):

SimpleGraph.jpg

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

Sympy

from IPython.external.mathjax import install_mathjax
install_mathjax()

SymPy представляет собой открытую библиотеку символьных вычислений на языке Python. Чтобы приступить к работе c ней, запустите IPython и наберите в нем:

from sympy import *

А чтобы получать красивые изображения формул, напишите:

init_printing()

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

Например, есть рациональные дроби. Если человек сложит 1/2 и 1/3 то у него получится, скорее всего, 5/6. А у компьютера, само собой получится в этом слчае 0.83333333333... то есть, не вполне то что нужно.

В sympy есть тип данных Rational. Если набрать Rational(1,2) получится дробь 1/2. Над такими дробями можно выполнять уже правильные арифметические действия:

Sympyrational.png

Перейти от символьного представления к обычному можно при помощи функции .evalf()

Evalf.png

В sympy имеются особые константы, такие как E и pi, которые ведут себя как символы (то есть выражение 1 + pi не преобразуется сразу в число, а так и останется 1 + pi):

Epi-sympy.png

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

Pievalf.png

Для работы с математической бесконечностью используется символ оо:

Symfinity.png

Чтобы задать символьные переменные их надо назначить при помощи Symbol. В левой части такого выражения находится переменная Python, которая питоновским присваиванием соотносится с объектом класса Symbol из SymPy. Экземпляры класса Symbol взаимодействуют друг с другом. Таким образом, с помощью них конструируются алгебраические выражения:

Symxy.png

С помощью оператора Eq() можно создавать уравнения, а с помощью solve() - решать их. Напомним, что в python знак "_" означает "результат предыдущей операции".

Symsolve.png

Причем, можно задавать, относительно какой переменной мы хотим получить решение:

Symsolvexy.png

Можно также дать функции solve список уравнений и список переменных и получить решение системы:

Symsolvesystem.png

Ее также легко использовать для вывода формул:

Symzakon.png

C помощью функции subs можно делать замены и подстановки:

Sympodstanovka.png

А с помощью функции simplify() формулы можно даже упрощать:

Symplify.png

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

Далее: Постоянный ток

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты