понедельник, 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 - запись которая позволит вам пользоваться этим диском, правда честно меня несколько удивило, что диск монтирует от рута, но то что радует создавать и изменять файлы разрешено всем, а если создаешь файл на том диске он сразу уходит в собственность рута.


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

понедельник, 18 февраля 2013 г.

Подумаем над доводчиком

Каким должен быть доводчик? Точнее, что он должен делать?
Составим список:

  1. Находить отверстия или потенциальные опасности для режущего инструмента. Для этого потребуется видоизменить существующую в моем скрипте функцию: findListOfNesting(listofCircuitCoords). Каким образом?
    1. Чтобы она отображала, не только индекс вложенности но и серию вложенности. Что я подразумеваю под понятием серия вложенности?
      Под этим я подразумеваю, скажем так всю матрешку. То есть все контуры, которые, как бы то ни было друг в дружку вложены.
  2. Далее нужно в зависимости от Индекса вложенности, вновь составить маршрут фрезы и проверить полученный маршрут на наличие узких мест.
  3. В случае если таковые имеются, разбить контур, в котором найдено узкое место, на подконтуры.
***
В итоге раздумывая над доводчиком. Написал еще один анализатор, который поможет с доводчиком.
findBottlenecksInCircuit(listOfMillCoords)
Но во всей своей писанине я не продумал одного момента, когда останавливаться?
Как доводчик, должен узнать, что все, доводить больше нечего. При том, что каждое звено по своему до ума доводится. Что может быть финалом?
К сожалению пока я не в силах данной вещи придумать :(
Но надеюсь, рано или поздно меня осенит гениальная идея!

суббота, 2 февраля 2013 г.

Результаты медленной работы


Написан анализатор. Правда, меня удивляет, что он берет запас. Видать из-за численных вычислений машины. О размерах запаса пока судить сложно. Если не ошибаюсь всего 0,05 единиц измерения. По крайней мере такой запас. взяла программа при радиусе фрезы 0,05 единиц измерения.
Осталось написать доводчик, ну и саму перегонку в G/M коды. Доводчик, прост по сравнению с написанным анализатором. Суть его в том, чтобы не сломать фрезу если тонкой фрезой мы фрезеруем большое отверстие. Просто когда выпиленную деталь начнет колбасить, она может запросто сломать инструмент при соответствующей глубине фрезерования.
Перегонщик в G/M-коды тоже штука простая. Координаты есть, просто запуск фрезерования по координатам. на этапе перехода от контура к контуру. Включаем холостой ход, для повышения производительности (на максимальной скорости подачи движется инструмент, ибо без нагрузки). В моем скрипте реализована только линейная интерполяция. Также до сих пор требуется, расстановка пробелов и табуляций, дабы blender не матерился.
Список целей:
  1. Доводчик
  2. Перегон в G/M-коды
  3. Графический интерфейс (это уже по желанию и настроению)
Ну а сейчас баиньки. Время 9 утра :)

***
Чуть позднее обнаружил мелкую неурядицу. У меня есть проверка на наличие пересечений контуров, но нету проверки если пересечение вдруг окажется внутри контура!