воскресенье, 12 апреля 2015 г.

Первая программа с PyQt5

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

Теперь приступим к первому тесту, то есть напишем программу, которая будет просто считать количество нажатий на кнопку.
Для этого создадим в Qt Designer вот такую форму:



Напишем следующую программку:
import sys
from PyQt5 import QtCore, QtGui, uic
from PyQt5.QtWidgets import *

# прототип главной формы
class MainForm(QMainWindow):
    cnt = 0
    # конструктор
    def __init__(self):
        super(MainForm, self).__init__()

        # динамически загружает визуальное представление формы
        uic.loadUi("gui.ui", self)

        # связывает событие нажатия на кнопку с методом
        self.pushButton.clicked.connect(self.setLabelText)

        self.show()

    def setLabelText(self):
        self.cnt += 1
        self.pushButton.setText(str(self.cnt))




def main():
    app = QApplication(sys.argv)  # создаёт основной объект программы
    form = MainForm()  # создаёт объект формы
    app.exec()  # запускает приложение

if __name__ == "__main__":
    sys.exit(main())
Примечание 1: Qt Designer  содержит три вида шаблонов: QMainWindow, QDialog, QWidget для правильной работы тип используемого шаблона и объекта к которому привязываем графику, должны соответствовать друг другу.

Примечания 2: для обращения к элементу формы используем его имя заданное в Qt Designer.

среда, 18 марта 2015 г.

Siemens S7-200 первое подключение

По ходу рабочей деятельности попал мне в руки ПЛК фирмы Siemens S7-200. И так как совсем недавно я вышел со студенческой скамьи и опыта работы с железом толком не было, долго и упорно пытался его подключить, чтобы залить на него тестовую программу.
Для первого подключения необходимы следующие аппаратные части:
 - USB PC adapter MPI;
 - контроллер Siemens S7-200;
 - ноутбук.
Из программного обеспечения потребуется Step 7-Micro/Win.
Далее рассмотрим действия по шагам:

  1. Запустить Step 7-Micro/Win.
  2. В левом столбце в самом низу открываем диалоговое окно "Set PG/PC interface".
  3. Из списка "Interface Parameter Assignment Used" выбираем "PC Adapter (PPI)".
  4. Нажимаем кнопку "Properties". После нажатия увидим диалоговое окно "Properties - PC Adapter (PPI)".
    Примечание: на это окно стоит обратить особое внимание, так как если скорость передачи данных "Transmition Rate" будет не соответствовать скорости передачи данных контроллера, то компьютер просто не увидит контроллер.
  5. Далее жмем "Ok" и открываем диалоговое окно "Communications" (левый столбец с иконками).
  6. Далее выполняем двойной нажатие левой клавишей мыши по иконке "Double-Click to Refresh". После чего, если была правильно выбрана скорость, мы увидим наш контроллер.
После всех вышеописанных действий, можно заливать программу и конфигурацию в контроллер через кабель "USB PC Adapter MPI".

Для того, чтобы увеличить или уменьшить скорость передачи данных контроллера, необходимо выполнить следующие действия:
  1. В дереве проекта в разделе "Communications" открыть диалоговое окно "Communication Ports".
  2. В полях ввода "Baud Rate" указать интересующую скорость.
  3. Изменить значение скорости передачи данных "Transmition Rate" в свойствах "PC Adapter MPI" (см. выше).
После всех выполненных операций можно сохранить проект, чтобы в дальнейшем не производить вышеуказанные настройки повторно.
Примечание: если при загрузке программы произойдет сбой, то необходимо снова выполнить поиск устройств подключенных к кабелю "USB PC Adapter MPI", то есть выполнить двойное нажатие левой клавишей мыши по иконке "Double-Click to Refresh" в диалоговом окне "Communications".

воскресенье, 7 декабря 2014 г.

Вспоминая Step 7

Задание:
Создать программу реализующую следующую функцию: если заканчиваются детали в магазине (эмулировать дискретный сигнал в симуляторе), то срабатывает сирена (мигает лампа) с частотой 2 Гц. Сброс сирены после удержания кнопки сброса в течение 3 с.

Решение:
Для начала опишем используемые переменные:
 - нет деталей в магазине (дискретный вход);
 - сброс (дискретный вход);
 - таймер сирены для положительной фазы генератора импульсов;
 - таймер сирены для отрицательной фазы генератора импульсов;
 - таймер сброса;
 - сигнал отключения сирены;
 - сирена (дискретный выход).

Повторим какие типы данных поддерживает Step 7:


Для описания переменных в проекте Step 7 Manager откроем S7 Program(1):
Окно SIMATIC Manager
и далее откроем таблицу символов Symbols и отредактируем как показано на рисунке ниже:
Таблица символов STEP 7
Теперь реализуем сирену на языке LAD:
Блок реализации сирены
на рисунке выше два таймера объединены в генератор импульсов и тем самым сигнал меняется периодически.
Далее покажем, как реализуется сброс сирены:
После всех выполненных действий сохраняем программу и загружаем в контроллер. Задание выполнено.
Демонстрация работы программы в режиме симуляции:





среда, 12 марта 2014 г.

Заметки по Python

Заметка №1

Порой требуется, найти минимальные и максимальные значения списка вот такого списка:
>>> a[[5, 6], [7, 8], [-3, -10], [6, 12], [-4, 10]]
 Предположим, что это список координат точек, и требуется найти Xmax, Ymax, Xmin, Ymin. К сожалению, я не нашел более удобного способа сделать это в 1 строку, но вот способ в 2 строки.
>>> [X, Y] = zip(*a)>>> (Xmax, Ymax, Xmin, Ymin) = (max(X), max(Y), min(X), min(Y))
 Здесь я использовал распаковку списка, что позволит, нам посмотреть по отдельности максимальные и минимальные значения X и Y.
Теперь проверим правильность результатов:
>>> Xmax
7
>>> Ymax
12
>>> Xmin
-4
>>> Ymin
-10
Как видим результат соответствует желаемому.

вторник, 4 марта 2014 г.

unittest'ы в Python примеры использования на будущее

Не люблю долго описывать, то чем пользуюсь, ибо мне понятнее примеры, и поэтому зачастую пользуюсь старыми исходниками. Но так как были инциденты потери данных решил сохранить, важные разделы здесь.
Файл geometry.py
#coding=utf-8
# -*- coding: utf-8 -*-

from math import *
import sys

class point:
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)
    
  def __str__(self):
    return '({0}, {1})'.format(self.x, self.y)
  
  def __eq__(self, other):
    return True if ((self.x == other.x) and (self.y == other.y)) else False
  
  def __ne__(self, other):
    return True if ((self.x != other.x) or (self.y != other.y)) else False

Файл тестирования test_geometry.py:
#coding=utf-8
# -*- coding: utf-8 -*-

from geometry import *
import unittest

class testGeometry(unittest.TestCase):
  # Создадим 4 точки, которые будем использовать для тестирования
  def setUp(self):
    self.A = point(5, 6)
    self.B = point(6, 10)
    self.C = point(5.0, 6.0)
    self.D = point(-5, -6)

  # Тестируем создание точки
  def test_init(self):
    # Проверим правильность получения координат
    self.assertEqual((self.A.x, self.A.y), (float(5), float(6)), "Полученные значения не являются вещественными!!!")
    self.assertEqual((self.B.x, self.B.y), (float(6), float(10)), "Полученные значения не являются вещественными!!!")
    self.assertEqual((self.C.x, self.C.y), (float(5), float(6)), "Полученные значения не являются вещественными!!!")
    self.assertEqual((self.D.x, self.D.y), (float(-5), float(-6)), "Полученные значения не являются вещественными!!!")

  # Тестируем правильность формата печати
  def test_str(self):
    self.assertTrue(str(self.A) == "(5.0, 6.0)", "Неправильный вывод на экран!!!")
    self.assertTrue(str(self.B) == "(6.0, 10.0)", "Неправильный вывод на экран!!!")
    self.assertTrue(str(self.C) == "(5.0, 6.0)", "Неправильный вывод на экран!!!")
    self.assertTrue(str(self.D) == "(-5.0, -6.0)", "Неправильный вывод на экран!!!")

  # Тестируем операцию равенства
  def test_eq(self):
    self.assertTrue(self.A == self.C, "Данные две точки равны, а в результате тестирования, они оказались неравными!!!")
    self.assertFalse(self.A == self.B, "Данные две точки неравны, а в результате тестирования, они оказались равными!!!")
    self.assertFalse(self.A == self.D, "Данные две точки неравны, а в результате тестирования, они оказались равными!!!")
  
  def test_ne(self):
    self.assertFalse(self.A != self.C, "Данные две точки равны, а в результате тестирования, они оказались неравными!!!")
    self.assertTrue(self.A != self.B, "Данные две точки неравны, а в результате тестирования, они оказались равными!!!")
    self.assertTrue(self.A != self.D, "Данные две точки неравны, а в результате тестирования, они оказались равными!!!")

# Запускаем тестирование, если файл запущен без аргументов
if __name__ == '__main__':
    unittest.main()
Данных примеров лично мне хватит для большинства целей, если честно я даже понять не могу зачем нужны функции assertEqual и assertNotEqual, если есть  accertTrue и assertFalse, хотя на вкус и цвет фломастеров нет.
******************
Наткнулся на еще один интересный момент, если хочется проверить, отработку, какого-либо исключения, придется повыеживаться. Приведу пример.
Тестируемый код:
class segment:
  def __init__(self, point0, point1):
    if point0 == point1:
      raise(NameError("Это не отрезок, это точка!!!"))
    else:
      self.begin = point0
      self.end = point1
Тестирование:
# Проверим инициализацию отрезков
    try:
      self.AC = segment(self.A, self.C)
    except:
      self.assertTrue(True, "Не возникает ошибки при задании точки вместо отрезка!")
Далее, если наткнусь на интересные аспекты, дополню раздел.






четверг, 6 февраля 2014 г.

Трудности с черновой обработкой

Порой, очень сложно, что-либо понять сразу, и только после этого начинаешь вести записи, чтобы понять себя, и разгрести всю кашу, которая в голове образовалась.
Сейчас я пишу диплом на Python'е, и столкнулся с такой пренеприятной сложностью: я понять не могу, как будет работать мой алгоритм.
С одной стороны в голове я выстроил план:

  1. Выделить участки контуров пересекающих канал черновой обработки.
  2. Проанализировать их, для того, чтобы понять откуда должна будет прийти фреза для черновой обработки (справа или слева по каналу), а в дальнейшем этот анализ будет использоваться и для чистовой обработки, но если для чистовой обработки достаточно знать внутренний это контур или внешний, то для чистовой обработки, нужно точно знать справа или слева ждать фрезу и это конкретно усложняет задачу.
    Также проблему представляет сортировка. как сортировать эти участки.
  3. Если все-таки получится придумать пункт 2, то нужно будет придумать способ определения положения центра фрезы при приближении к участку, для этих целей есть учебник аналитической геометрии.

понедельник, 30 декабря 2013 г.

Непонятная ошибка eskdx

Порой сталкиваешься с ошибкой и понять не можешь, как же ее решить, или если решил проблему, то почему она решилась, и что ты сделал такого для ее решения?
Для меня такой ошибкой явилась следующая ошибка интерпретатора latex:
! Undefined control sequence.
\ESKDcolumnXVIname ->\No 
                         \ \cyrp \cyro \cyrd \cyrl .
l.9 \begin{document}
 Честно сказать сам не знаю почему, но при замене в файле eskdrussian.def из пакета eskdx строчек:
\newcommand{\ESKDcolumnXVIname}{%
  \No\ \cyr\cyrd\cyro\cyrk\cyru\cyrm.}
 на
\newcommand{\ESKDcolumnXVIname}{%
  \cyr\CYRL\cyri\cyrs\cyrt}
 Вторую строчку я взял из вышеприведенной в файле операции \newcommand.
\newcommand{\ESKDcolumnXVname}{%
  \cyr\CYRL\cyri\cyrs\cyrt}
\newcommand{\ESKDcolumnXVIname}{%
  \cyr\CYRL\cyri\cyrs\cyrt}
Как ни странно, но заработало. Разницы в документах я не заметил и лично у меня вопрос, почему проблема решилась? Да и вообще почему она возникла после обновления дистрибутива?
*******************************************************************************************************
Благодаря jamesjames7 я узнал, что причина в том, что поддержка \No (символ №) убрана из babel и вместо него теперь используется \textnumero.
По совету jamesjames7 посетил сайт, где описывается решение проблемы.
Вариант с глобальной заменой у меня почему-то не заработал. Но и файл оказался по другому адресу:
/usr/share/texlive/texmf-dist/tex/generic/babel-russian/russianb.ldf
Вставлял в конец файла строчку:
\DeclareRobustCommand{\No}{\ifmmode{\nfss@text{\textnumero}}\else\textnumero\fi}
Зато вставка строчки:
\newcommand{\No}{\textnumero}
в eskdrussian.def помогла, за что jamesjames7 огромное человеческое спасибо. :)

пятница, 27 декабря 2013 г.

Kubuntu 13.10 не работает Wi-Fi

Столкнулся с проблемой при обновлении Kubuntu до версии 13.10 перестал работать Wi-Fi. Пошарившись по инету нашел решение, которое оказалось рабочим:
sudo modprobe -rv wl
sudo apt-get remove --purge bcmwl-kernel-source
sudo modprobe -v brcmsmac

вторник, 26 ноября 2013 г.

Вспоминая алгебру

Упрощение выражений:

Решение уравнений:
Решение систем уравнений:
Введем новые переменные:
Запишем исходную систему с новыми переменными и решим ее:
Выполним обратную замену переменных:
Вот и все.




понедельник, 14 октября 2013 г.

Тема диплома

Думаю я определился с дипломным проектом, осталось это чудо правильно назвать. На диплом я решил делать CAM - систему, правда увы без непосредственного управления станком. Управление станком будет осуществляться через программу Stepper CNC.
На данном этапе готовы:

  1. Преобразователь координат - этот скрипт, позволяет корректно изъять нужные нам координаты, без него увы получится абракадабра.
  2. Слайдер (честно не знаю, как правильно назвать) - суть этого скрипта, в том, чтобы осуществить срез координат, при этом координата z=const 3D-модели. В результате среза получаем список координат, который в дальнейшем нужно обработать.
  3. Также готов сам преобразователь, скармливаешь ему массив среза, и он перегоняет оный в G/M-коды для ЧПУ станка. Результат тестирования этих трех блоков, можно увидеть на картинке.
На этапе тестирования и отладки находится:
  1. Блок отвечающий за создание эквидистант - он нужен для учета диаметра инструмента. На этапе тестирования выяснилось, что хреново работает анализатор, точнее есть исключительные ситуации, когда он работает криво, поэтому старый алгоритм будет заменен на новый.
  2. Анализатор -определяет вложенность контуров, это нужно, чтобы знать выпуклость фрезеруем, или впадину. Если выпуклость фреза идет по внешнему контуру, если впадину, то по внутреннему.
Пока не приступал к разработке:
  1. Оптимизатор - оптимизацию, пока я сделаю простейшую, чтобы хотя бы немного сэкономить время на обработке детали. Моя фамилия была выгравирована минут за 8-9. Это еще при учете, того, что подача довольно большая.
  2. GUI - честно сказать, его я вообще не представляю, как пока написать, для своих коммерческих проектов всегда командной строкой пользовался.
Если времени будет вагон, а на дипломе у меня оно будет свободно. То написать это все я смогу где-то недели за 2-4 это с учетом времени на оформление диплома.

пятница, 11 октября 2013 г.

Цели и задачи? Что это такое?

Сегодня настроение плохое, ибо мои цели рушатся, думал после универа пойду работать и заочно получить кандидата технических наук. Но как выяснилось с 2014 года заочной аспирантуры не будет. Если только попробовать через соискательство ее получить и вот таким образом передо мной возник вопрос о целеполагании. Что это вообще такое?
Википедия дает ответ, что:
Целеполагание — процесс выбора одной или нескольких целей с установлением параметров допустимых отклонений для управления процессом осуществления идеи. Часто понимается как практическое осмысление своей деятельности человеком с точки зрения формирования (постановки) целей и их реализации (достижения) наиболее экономичными (рентабельными) средствами, как эффективное управление временным ресурсом, обусловленным деятельностью человека.
Если честно, то определение муть полная. Если кратко, то:
Целеполагание - это процесс постановки целей.
Тогда, что такое цель? Да и вообще зачем нужны цели? С позиции википедии:
Цель — идеальный или реальный предмет сознательного или бессознательного стремления субъекта; конечный результат, на который преднамеренно направлен процесс[1]; «доведение возможности до её полного завершения»
Честно сказать мозги опять плывут от такого количества заумных слов, так что же такое цель? Ответа я не получил. С моей точки зрения:
Цель - это критерий того, стоит осуществлять ту или иную деятельность или не стоит. Говоря проще, а на кой черт мы будем это делать? Стоит ли овчинка выделки или не стоит?
К сожалению формально, я не могу это описать сейчас, ибо мозги мои плывут :).
Также в википедии прочитал, что цели часто путают с задачами.
Цель — отвечает на вопрос «Чего нужно достигнуть?», а задача — на вопрос «Какими действиями этого можно достигнуть?».
Если подумать, то получается, цель - это ради чего мы делаем, а задача - что нужно сделать?
У меня лично возникает вопрос: Неужели мы на каждое действие ставим цель?
Решил сделать квиток, чисто для себя на формате A5.
Не знаю смогу ли я хотя бы неделю, такие листки заполнять для себя. Ибо сейчас увы я не вижу цели. Поэтому пока я лучше отдохну, так как свежая голова лучше "протухшей".

вторник, 18 июня 2013 г.

Размышления на тему искусственного интеллекта.

Меня вот, все интересует такая вещь, как ИИ (искусственный интеллект). И вот все думаю, как например реализовать систему искусственного интеллекта, которая обучается. В голове крутится, одна мысль, не знаю, правильная ли она. (Увы, но учебники по искусственному интеллекту, написаны, так, что лично для меня они темный лес).
Начну с того, что навело меня на мысль. На мысль меня навела книга М.Б.Бровковой "Системы искусственного интеллекта в машиностроении".
А конкретно вот эта картинка:
Как я представляю процесс обучения, допустим, обучение распознаванию текста (пока рассмотрю на базе цифр, их меньше).
Ну во-первых должно быть хотя бы изображение цифры, размер, пока выберем фиксированный. скажем 20x20 (в итоге 400 входов :) у синапса)  в процессе обучения, задействуем все 400.
Я ввожу 1, скармливаю картинку, программе, она создает синапс с 400 входами, и на выход подает Y. Я скармливаю ей вторую 1, меняются весовые коэффициенты созданного синапса. Сам по себе синапс возвращает или 0 или 1, и каждый синапс, отвечает за свою цифру, то есть всего их у нас 10 от 0 до 9. Чем больше скормлено 1, тем больше точность распознавания. При том на мой взгляд, для лучшего распознавания, также лучше добавить центрирование изображения, под этим я подразумеваю, сначала поиск максимальной и минимальной точек изображения по осям X и Y. Процесс центрирования нужен с целью избежания, ошибок, если цифру разместить не по середине, а скажем к примеру слева или справа.
Данный алгоритм, я попробую реализовать на Python3 с использованием библиотеки Pillow. После того, как сессию сдам. А может и во время сессии. :) Если мое, понимание, хоть, чуть-чуть близко к истине, то возможно вместо станка, я буду писать несколько другой диплом.


воскресенье, 9 июня 2013 г.

MAXIMA и LaTeX

Введение

Задался, я вопросу, а нельзя ли, как-нибудь сделать скрипт, чтобы вычисления из maxima  мне в документ вставлялись, идти старым путем не особо захотелось (писать скрипт на языке Maxima, которые выводит мне и мой текст и решение из Maxima), поэтому стал вопрос о поиске новых. Новый путь нашел, а оттуда стартанул, по указанию в Испанию!
***

Отрицательный результат, тоже результат

Стартанул ненадолго и недалеко, так как запустить этот ихнюю работу, у меня не получилось :(.
В итоге пошел ново-старым путем, то есть написал скрипт, только не на языке Maxima, а на Python'е. Скрипт ищет новый тег в tex-файле, потом выписывает, оттуда, то что его интересует, в mac-файл, скармливает последний Maxima, получает dat - файл с результатом, из него и из исходного файла, создает, новый tex-файл с результатом и проделаными вычислениями!
Вот собственно, сам скриптик и тестовый пример. Ну а для того, чтобы формулы больше соответствовали требованиям оформления (по крайней мере работ по механике). Написал еще постобработчик. По крайне мере формулы, неплохо обрабатывает.
Недостатки, имена переменных писать нужно особенным образом (я имею ввиду в разделе maxima в tex-документе), понять этот особенный образ думаю не так сложно, если хоть чутка, знаешь Maxima. Причина, почему именно так нужно проста, иначе Maxima вообще не выведет имени переменной :).

Применение скрипта mltex

Теперь о том, как все это работает.
Примечание: все файлы, должны находиться в одной папке! Должны, но не обязаны, если вы опытный пользователь, то додумаетесь, как их по разным папкам раскидать, если оное конечно вам нужно.
После того, как скинули все файлы в одну папку в консоли перейдем в нее, и начнем сборку файла.
Запустим скрипт, для передачи данных для расчета в Maxima:
python3 mltex.py test.tex
Запустим постобработчик:
./parser.sh test_result.tex
После чего скармливаем остатки LaTeX'у (лучше его дважды этим покормить, горький опыт работы с LaTeX'ом):
latex test_result.tex
Получим ps-файл:
dvips test_result.dvi
Теперь можем наслаждаться полученным результатом:

Недоработка

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

суббота, 8 июня 2013 г.

Изучаю Maxima

Введение

Честно сказать, до жути надоело считать производные вручную, при том, что увы но при вычислении оных можно столько раз ошибиться, а для написания отчетов требуется именно вся запись в символьном виде. Конкретно от пакета Maxima лично меня интересуют производные, но не будем спешить рассмотрим все постепенно:

Установка

Для установки maxima, так как я пользователь Fedora 18 используем:

    sudo yum install maxima

ну а под ubuntu и ей подобные:

        sudo apt-get install maxima

Maxima, как калькулятор

Кто-то считает, с графическим интерфейсом лучше, лично я поставил wxmaxima так и не понял, как ей пользоваться, поэтому в дальнейшем используем консоль. Сразу скажу из недостатков консольного режима является, то что вводить нужно без ошибок, иначе удаляешь все и печатаешь по новой!
Теперь приступим к первому знакомству. Когда вы запустите Maxima вы увидите приглашение:
(%i1)
i - означает, что это приглашение на ввод, а цифра означает номер вычисления.
Maxima можно использовать, как калькулятор, правда со странностями специфичный калькулятор:
(%i1) 1/4+2/3;

После того как закончили запись не забываем про символ ';', иначе вычисления так и не произойдут, пока вы не поставите, этот символ.
В результате получим:

                                      11
(%o1)                                 --
                                      12

Как видим Maxima выдает результат после череды символов (%o1).
Maxima не любит иррациональности:
(%i2) (1 + sqrt(2))^5;
                                      5
(%o2)                    (sqrt(2) + 1)
Для того, чтобы она это прорешала, используем функцию expand, а чтобы не повторять последний ввод, просто поставим символ '%':
(%i3) expand(%);
(%o3)                           29 sqrt(2) + 41
Сразу предупрежу, вывод может отличаться, и это зависит от версии Maxima, главное, чтобы вывод при следующем шаге совпадал.
Следующим шагом будет вычисление численного значения:
(%i4) %,numer;
(%o4)                          82.01219330881976
Согласен, это несколько неудобно. Что для вычислений требуется еще что-то писать, поэтому я и написал, что это весьма специфичный калькулятор.
Число можно вывести в научном формате:
(%i5) bfloat(%o4);
(%o5)                         8.201219330881976b1
В данном примере мы выводим в научном формате значение полученное в четвертом вычислении на выходе %o4.
Точность выводимого значения можно менять с помощью функции. Например сделаем вывод в 5 знаков:
(%i6) fpprec:5;
(%o6)                                  5
Теперь снова выведем значение в научном формате:
(%i7) ''%i5;
(%o7)                              8.2012b1
В данном случае, чтобы повторить ввод, перед %i5 ставим два апострофа подряд.

Теперь побалуем с алгебраическими выражениями:
(%i1) (a+b)^2;
                                          2
(%o1)                              (b + a)
Как видим ничего не произошло и опять требуется expand(), для того, чтобы добиться от Maxima, того чего желаем:
(%i2) expand(%);
                                 2            2
(%o2)                           b  + 2 a b + a
Мы можем подставить значение в уже записанное ранее выражение:
(%i3) %o2, a = 3/d;
                                 6 b   9     2
(%o3)                            --- + -- + b
                                  d     2
                                       d
Что на мой взгляд является весьма удобной возможностью, учитывая остальные неудобности Maxima. Как видим сама по себе к общему знаменателю, она приводить не хочет, для этой цели воспользуемся функцией ratsimp:
(%i4) ratsimp(%);
                                2  2
                               b  d  + 6 b d + 9
(%o4)                          -----------------
                                       2
                                      d
Теперь воспользуемся функцией, factor, которая умеет выносить общие множители за скобки, а также распознавать многочлены в n-й степени:
(%i5) factor(%);
                                           2
                                  (b d + 3)
(%o5)                             ----------
                                       2
                                      d

Нелинейные алгебраические уравнения

Также Maxima умеет решать нелинейные алгебраические уравнения. Для примера взял уравнения которые выдал гугль по запросу нелинейные алгебраические уравнения:
Решим данную систему в Maxima:
(%i6) x^2-x*y^2-y^2=19;
                                  2    2    2
(%o6)                        - x y  - y  + x  = 19
(%i7) x-y=7;
(%o7)                              x - y = 7
(%i8) solve([%o6,%o7],[x,y]);
(%o8) [[x = - 1.255641025641026, y = - 8.255641025641026], 
[x = 5.620823620823621, y = - 1.379176755447942], 
[x = 9.634816753926701, y = 2.634817813765182]]

Тригонометрия

Теперь побалуем с тригонометрией, первый пример я рассмотрю из мануала, потом парочку своих:
(%i9) sin(u+v)*cos(u)^3;
                                 3
(%o9)                         cos (u) sin(v + u)
Воспользуемся функцией trigexpand, чтобы избавиться синуса суммы:
(%i10) trigexpand(%);
                       3
(%o10)              cos (u) (cos(u) sin(v) + sin(u) cos(v))
Также Maxima может преобразовать наше выражение в многочлен, в котором, не будет синусов и косинусов в степенях, а все они будут стоять одни одинешеньки. Лучше продемонстрирую на примере:
(%i11) trigreduce(%);
            sin(v + 4 u) + sin(v - 2 u)   3 sin(v + 2 u) + 3 sin(v)
(%o11)      --------------------------- + -------------------------
                         8                            8
Теперь я побалую, а конкретно меня интересует, знает ли Maxima основное тригонометрическое тождество, для этого я воспользуюсь функцией trigsimp, которая упрощает выражения:
(%i12) sin(x)^2+cos(x)^2;
                                  2         2
(%o12)                         sin (x) + cos (x)
(%i13) trigsimp(%);
(%o13)                                 1
А теперь продемонстрирую пример, где конкретно очень необходима функция trigexpand:
(%i14) cos(u+v)*cos(u)+sin(u+v)*sin(u); 
(%o14)               sin(u) sin(v + u) + cos(u) cos(v + u)
(%i15) trigexpand(%);
(%o15) cos(u) (cos(u) cos(v) - sin(u) sin(v))
                                       + sin(u) (cos(u) sin(v) + sin(u) cos(v))
(%i16) expand(%);
                           2                2
(%o16)                  sin (u) cos(v) + cos (u) cos(v)
(%i17) trigsimp(%);
(%o17)                              cos(v)
Вот так красиво, можно упростить большую замуту :).

Комплексные числа

Теперь поработаем с комплексными числами, мнимая единица в Maxima обозначается как %i:
(%i1) w:6+%i*k;
(%o1)                              %i k + 6
Найдем вещественную и мнимую части комплексного числа:
(%i2) realpart(%o1);
(%o2)                                  6
(%i3) imagpart(w);
(%o3)                                  k
Запишем комплексное число в показательной форме:
(%i4) polarform(w);
                               2         %i atan(k/6)
(%o4)                    sqrt(k  + 36) %e
Найдем значение модуля и аргумента комплексного числа:
(%i5) cabs(w);
                                       2
(%o5)                            sqrt(k  + 36)
(%i6) carg(w);
                                         k
(%o6)                               atan(-)
                                         6

Дифференцирование и интегрирование

Наконец-то настал черед производных!
Сначала простой пример, который меня очень взволновал, так как именно это я и искал, и нашел в Maxima:
(%i1) diff(phi(t),t);
                                  d
(%o1)                             -- (phi(t))
                                  dt
Мне очень часто приходится сталкиваться с тем, что значение числа неизвестно, а записать производную от этого числа нужно, а известно лишь, то что оно зависит от переменной t и Maxima позволяет такие переменные дифференцировать!
Теперь продифференцируем сложную функцию:
(%i2) S:1/cos(phi(t))^2;
                                      1
(%o2)                            ------------
                                    2
                                 cos (phi(t))
(%i3) diff(S,t);
                                         d
                          2 sin(phi(t)) (-- (phi(t)))
                                         dt
(%o3)                     ---------------------------
                                    3
                                 cos (phi(t))
Теперь проинтегрируем полученное выражение.
(%i4) integrate(%,t);
                                      1
(%o4)                            ------------
                                    2
                                 cos (phi(t))
Как мы видим, Maxima не записывает константы интегрирования, она сразу приравнивает их нулю :(.
Дополнительно продемонстрирую интегрирование парочки табличных интегралов:
(%i5) k:sin(t);
(%o5)                               sin(t)
(%i6) integrate(k,t);
(%o6)                              - cos(t)
(%i7) k:1/cos(t)^2;
                                       1
(%o7)                               -------
                                       2
                                    cos (t)
(%i8) integrate(k,t);
(%o8)                               tan(t)

Разложение в ряд Тейлора

Очень часто, для упрощения расчетов, тригонометрические формулы разлаживают в ряд Тейлора. Разложим в ряд Тейлора функцию косинуса:
(%i1) k:sin(t);
(%o1)                               sin(t)
(%i2) taylor(k,t,0,5);
                                  3    5
                                 t    t
(%o2)/T/                     t - -- + --- + . . .
                                 6    120
Функция taylor имеет четыре параметры, первый указывает, функцию, которую хотим разложить в ряд Тейлора, второй параметр переменная по степеням которой выполняем разлаживание функции в ряд Тейлора, а следующие два параметра отвечают за диапазон выводимых значений по степеням в нашем случае от степени 0 по 5-ю степень t.

Пределы

Также Maxima умеет вычислять пределы с помощью функции limit(<имя функции>,<имя переменной>,<к чему стремится переменная>):
(%i3) limit(k,t,0);
(%o3)                                  0
(%i4) limit(k,t,inf);
(%o4)                                 ind

Решение дифференциальных уравнений

Чтобы записать дифференциальное уравнение перед функцией diff пишется символ апострофа. Запишем дифференциальное уравнение для пружины с грузом и решим его:
(%i1) m*diff(x(t),t,2)=c*x(t);
                                2
                               d
(%o1)                       m (--- (x(t))) = c x(t)
                                 2
                               dt
(%i2) ode2(%o1,x(t),t);
Is  c m  positive, negative, or zero?

positive;
                               sqrt(c) t           sqrt(c) t
                               ---------         - ---------
                                sqrt(m)             sqrt(m)
(%o2)             x(t) = %k1 %e          + %k2 %e

Линейная алгебра

Теперь продемонстрирую простейшие операции с матрицами. Начнем с того, что введем матрицу:
(%i1) m: entermatrix (3, 3);

Is the matrix  1. Diagonal  2. Symmetric  3. Antisymmetric  4. General
Answer 1, 2, 3 or 4 : 
4;
Row 1 Column 1: 
a;
Row 1 Column 2: 
b;
Row 1 Column 3: 
c;
Row 2 Column 1: 
d;
Row 2 Column 2: 
e;
Row 2 Column 3: 
f;
Row 3 Column 1: 
g;
Row 3 Column 2: 
h;
Row 3 Column 3: 
k; 

Matrix entered.
                                  [ a  b  c ]
                                  [         ]
(%o1)                             [ d  e  f ]
                                  [         ]
                                  [ g  h  k ]
Транспонируем ее:
(%i2) transpose(m);
                                  [ a  d  g ]
                                  [         ]
(%o2)                             [ b  e  h ]
                                  [         ]
                                  [ c  f  k ]
Вычислим обратную матрицу и проверим, действительно ли матрица является обратной:
(%i13) m1:invert(m),detout;
                      [ e k - f h  c h - b k  b f - c e ]
                      [                                 ]
                      [ f g - d k  a k - c g  c d - a f ]
                      [                                 ]
                      [ d h - e g  b g - a h  a e - b d ]
(%o13)           ---------------------------------------------
                 a (e k - f h) + b (f g - d k) + c (d h - e g)
Здесь invert - функция инвертирования, а с помощью записи detout мы выносим за пределы определитель матрицы, чтобы запись была покороче. Вообще определитель матрицы находится с помощью функции determinant.
Теперь перемножим матрицу с обратной, для проверки:
(%i14) m.m1;
                             [ e k - f h  c h - b k  b f - c e ]
                             [                                 ]
                             [ f g - d k  a k - c g  c d - a f ]
         [ a  b  c ]         [                                 ]
         [         ]         [ d h - e g  b g - a h  a e - b d ]
(%o14)   [ d  e  f ] . (---------------------------------------------)
         [         ]    a (e k - f h) + b (f g - d k) + c (d h - e g)
         [ g  h  k ]
(%i15) expand(%);
                                   a e k
(%o15) matrix([---------------------------------------------
               a e k - b d k - a f h + c d h + b f g - c e g
                       b d k
 - ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       a f h
 - ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       c d h
 + ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       b f g
 + ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       c e g
 - ---------------------------------------------, 0, 0], 
   a e k - b d k - a f h + c d h + b f g - c e g
                        a e k
[0, ---------------------------------------------
    a e k - b d k - a f h + c d h + b f g - c e g
                       b d k
 - ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       a f h
 - ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       c d h
 + ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       b f g
 + ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       c e g
 - ---------------------------------------------, 0], 
   a e k - b d k - a f h + c d h + b f g - c e g
                           a e k
[0, 0, ---------------------------------------------
       a e k - b d k - a f h + c d h + b f g - c e g
                       b d k
 - ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       a f h
 - ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       c d h
 + ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       b f g
 + ---------------------------------------------
   a e k - b d k - a f h + c d h + b f g - c e g
                       c e g
 - ---------------------------------------------])
   a e k - b d k - a f h + c d h + b f g - c e g
(%i16) factor(%);
                                  [ 1  0  0 ]
                                  [         ]
(%o16)                            [ 0  1  0 ]
                                  [         ]
                                  [ 0  0  1 ]
Для матриц операция умножения выполняется с помощью оператора ".", при этом стоит помнить, что умножение a.b и b.a даст разные результаты! Это можно посмотреть в любом учебнике по линейной алгебре.
Найдем определитель матрицы и ранг матрицы:
(%i17) determinant(m);
(%o17)           a (e k - f h) - b (d k - f g) + c (d h - e g)
(%i18) rank(m);
(%o18)                                 3
Чтобы найти собственные значения используется функция eigenvectors, при попытке вычислить оные от моей матрицы, передо мной появился дебагер ldb, видать буковки не особо нравятся функции eigenvectors :).
Поэтому продемонстрирую данную функцию на числовой матрице:
                                  [ 1  2  3 ]
                                  [         ]
(%o1)                             [ 4  5  6 ]
                                  [         ]
                                  [ 7  8  9 ]
(%i2) m:%;
                                  [ 1  2  3 ]
                                  [         ]
(%o2)                             [ 4  5  6 ]
                                  [         ]
                                  [ 7  8  9 ]
(%i3) eigenvectors(m);
           3 sqrt(33) - 15  3 sqrt(33) + 15
(%o3) [[[- ---------------, ---------------, 0], [1, 1, 1]], 
                  2                2
                            3/2
        3 sqrt(33) - 19    3    sqrt(11) - 11
[[[1, - ---------------, - ------------------]], 
              16                   8
                       3/2
     3 sqrt(33) + 19  3    sqrt(11) + 11
[[1, ---------------, ------------------]], [[1, - 2, 1]]]]
           16                 8

Решение систем линейных алгебраических уравнений

Ну и напоследок, решим систему линейных алгебраических уравнений!
Опять нагуглил системку (так как лень готовить картинки, меня больше изучение Maxima колышет).


(%i14) A:matrix([100,6,-2],[6,200,-10],[1,2,100]);
                              [ 100   6   - 2  ]
                              [                ]
(%o14)                        [  6   200  - 10 ]
                              [                ]
                              [  1    2   100  ]
(%i15) B:matrix([200],[600],[500]);
                                    [ 200 ]
                                    [     ]
(%o15)                              [ 600 ]
                                    [     ]
                                    [ 500 ]
(%i16) X:invert(A).B;
                                  [ 952900  ]
                                  [ ------  ]
                                  [ 499679  ]
                                  [         ]
                                  [ 1593300 ]
(%o16)                            [ ------- ]
                                  [ 499679  ]
                                  [         ]
                                  [ 2457000 ]
                                  [ ------- ]
                                  [ 499679  ]
Запишем полученное значение в более приглядном человеческому глазу виде:
(%i17) X,numer;
                             [ 1.907024309606768 ]
                             [                   ]
(%o17)                       [ 3.188647111445548 ]
                             [                   ]
                             [ 4.917156814675021 ]

Второй способ решения данной СЛАУ, с помощью функции solve:
(%i41) D:[100*x+6*y-2*z=200,6*x+200*y-10*z=600,x+2*y+100*z=500];
(%o41) [- 2 z + 6 y + 100 x = 200, - 10 z + 200 y + 6 x = 600, 
                                                         100 z + 2 y + x = 500]
(%i42) solve(D,[x,y,z]);
                         952900      1593300      2457000
(%o42)             [[x = ------, y = -------, z = -------]]
                         499679      499679       499679
(%i43) %,numer;
(%o43) [[x = 1.907024309606768, y = 3.188647111445548, z = 4.917156814675021]]



четверг, 14 марта 2013 г.

Первым делом после установки Fedora 18 KDE

Первым делом поставил дрова на свою видеокарту ATI Radeon HD7660G/7670M. К счастью или к сожалению, она у меня навороченная поэтому были свои траблы. Если конкретно, то при установке дров скачанных с оффсайта в логе /usr/share/ati/fglrx-install.log не было даже предупреждений, но после перезагрузки, получил интересное чудо система даже до консоли не загружалась.
Два дня искал рабочий рецепт, в результате исполнения которого система не сносится. Его я нашел на сайте:
http://www.sohailriaz.com/how-to-install-ati-radeon-drivers-in-fedora-18/
Если вкратце, то:

  1. Обновляем ядро и ставим все необходимое:
    yum -y update kernel
    yum -y groupinstall “Development Tools”
  2. Добавляем дополнительные репозитории (команда в одну строку):
    rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-18.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-18.noarch.rpm
  3. Ставим сам драйвер:
    yum -y install akmod-catalyst
  4. Далее создаем новую initial ram файловую систему с обновленными драйверами от ATI:
    new-kernel-pkg –kernel-args=nomodeset –mkinitrd –dracut –update $(rpm -q –queryformat=”%{version}-%{release}.%{arch}\n” kernel | tail -n 1)
  5. Ну и последнее, переконфигурируем xorg:
    aticonfig –initial -f
Далее после удачной перезагрузки и убедившись, что ноут стал меньше греться (до этого на нем Linux запускать было реально лишь с открытой форточкой, благо сейчас весна, и то об корпус я грел руки, сейчас с открытой форточкой он еле теплый, значит, если закрыть форточку работать будет реально). Далее поставил chrome:

  1. Создал файл (система 64-хразрядная) /etc/yum.repos.d/google-chrome.repo:
    [google-chrome] name=google-chrome - 64-bit baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64 enabled=1 gpgcheck=1 gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
  2. Затем поставил: yum install google-chrome-stable
Далее руссифицируем менюшки:
yum install kde-l10n-Russian

После чего перезагружаем систему и ставим кодеки и проигрыватель для просмотра видео:
    sudo yum install gstreamer1 gstreamer1-plugins-good gstreamer1-plugins-bad-    freeworld gstreamer1-plugins-ugly smplayer gstreamer-plugins-good gstreamer-plugins-bad gstreamer-plugins-ugly phonon-backend-gstreamer

После этой команды можно будет смотреть видео высокого разрешения в Smplayer и слушать музыку в Amarok.
Ну и последнее общеиспользуемое приложение, которое стоит поставить это unrar:
    yum install unrar

Для студентов технарей будет также удобно пользоваться LaTeX (система разметки гипертекста для полиграфии):
Устанавливаем так:

  1. Качаем архив install-tl-unx.tar.gz 
  2. Ставим пакет perl-Digest-MD5:
    sudo yum install perl-Digest-MD5
  3. Устанавливаем texlive из консоли, для этого переходим в папку куда распаковали полученный архив и запускаем процесс установки:sudo ./install-tl
Также если вы используете один раздел только под данные, чтобы не приходилось постоянно вводить пароль при монтировании в fstab добавляем строчку:


/dev/sdaN                                             /media/home             ntfs    defaults        1 1

где /dev/sdaN - устройство, которое монтируем
      /media/home - точка монтирования
      ntfs - файловая система
      defaults        1 1 - запись которая позволит вам пользоваться этим диском, правда честно меня несколько удивило, что диск монтирует от рута, но то что радует создавать и изменять файлы разрешено всем, а если создаешь файл на том диске он сразу уходит в собственность рута.


Ну а все остальные пакеты которые я дальше ставил связаны с моей деятельностью. А здесь записал лишь, то чем многие пользуются.