\nРисуем точку в момент времени \\(t_i\\) с координатами \\((x_{i},y_{i})\\)
\nСтираем точку с координатами \\((x_{i},y_{i})\\)
\nИнкремируем момент времени \\(t_{i+1}\\)
\nРисуем точку в момент времени \\(t_{i+1}\\) с координатами \\((x_{i+1},y_{i+1})\\)
\n<\/p>\n[img:a7lmrq:tmp:alt=Цикл передвижения точки вдоль горизонтальной оси.]\n\n
Сформируем массивы данных: временной промежуток и соответствующее положение точки на оси \\(x\\).<\/p>\n
\n\/\/ входные данные\nt = 0:1e-2:1; \/\/ временной отрезок\nx = sin(2*%pi*t); \/\/ положение точки на оси х\n<\/code><\/pre>\nвремя и координата.<\/span>\n<\/div>\t\n\nДобавим начальную точку на графике<\/p>\n
\n\n\/\/ Рисуем точку в первый момент времени\nplot(x(1), 0);\n<\/code><\/pre>\nТочка в первый момент времени.<\/span>\n<\/div>\t\n\n\nДалее заведём переменные для координатной сетки, сцены, на которой происходит анимаци и самого анимированного элемента:<\/p>\n
\n\npoint_axes = gca(); \/\/сетка координат\npoint_scene = gce(); \/\/объекты на сетке\npoint = point_scene.children; \/\/наша точка\n<\/code><\/pre>\nЗарезервируем переменные для создания анимации<\/span>\n<\/div>\t\n\n\nНесколько стилизуем наши элементы: добавим подпись оси и заголовок сетки координат, а также увеличим размер точки и её покрасим её в синий цвет:<\/p>\n
\n\npoint_axes.data_bounds = [-1.5, -1.5; 1.5, 1.5]; \/\/границы координатных осей\npoint_axes.grid = [1,1]; \/\/вспомогательная разметка\npoint_axes.x_label.text = \"x\"; \/\/подпись горизонтальной оси\npoint_axes.x_label.font_size = 4; \/\/размер шрифта подписи по оси х\npoint_axes.title.text = \"Движущаяся точка\" \/\/Заголовок \npoint_axes.title.font_size = 4; \/\/размер шрифта заголовка графика\n\npoint.mark_style = 0; \/\/тип соединительных элементов - кружок \npoint.mark_size = 20; \/\/размер соединительных элементов \npoint.mark_foreground = color(0,0,255); \/\/цвет кружка в формате rgb - синий\n<\/code><\/pre>\nСтилизуем изображаемые данные на графике в Scilab<\/span>\n<\/div>\t\n\n\nА далее - организуем цикл по всем значениям массива, отвечающего за положение токи на плоскости и итерационно будем рисовать и стирать точку в каждый из моментов времени:<\/p>\n
\n\n\/\/ цикл для анимации\nfor i = 1:length(x)\n drawlater();\n point.data = [x(i), 0];\n drawnow();\nend\n<\/code><\/pre>\nЦикл для создания анимации<\/span>\n<\/div>\t\n\nВ итоге, программа, реализующая передвижение точки с анимацией движения будет выглядеть следующим образом:<\/p>\n
\n\nclc; clf();\n\n\/\/ входные данные\nt = 0:1e-2:1; \/\/ временной отрезок\nx = sin(2*%pi*t); \/\/ положение точки на оси х\n\n\/\/ Рисуем точку в первый момент времени\nplot(x(1), 0);\n\npoint_axes = gca(); \/\/сетка координат\npoint_scene = gce(); \/\/объекты на сетке\npoint = point_scene.children; \/\/наша точка\n\npoint_axes.data_bounds = [-1.5, -1.5; 1.5, 1.5]; \/\/границы координатных осей\npoint_axes.grid = [1,1]; \/\/вспомогательная разметка\npoint_axes.x_label.text = \"x\"; \/\/подпись горизонтальной оси\npoint_axes.x_label.font_size = 4; \/\/размер шрифта подписи по оси х\npoint_axes.title.text = \"Движущаяся точка\" \/\/Заголовок \npoint_axes.title.font_size = 4; \/\/размер шрифта заголовка графика\n\npoint.mark_style = 0; \/\/тип соединительных элементов - кружок \npoint.mark_size = 20; \/\/размер соединительных элементов \npoint.mark_foreground = color(0,0,255); \/\/цвет кружка в формате rgb - синий\n\n\/\/ цикл для анимации\nfor i = 1:length(x)\n drawlater();\n point.data = [x(i), 0];\n drawnow();\nend\n<\/code><\/pre>\nСоздание анимации в Scilab<\/span>\n<\/div>\t\n","block_content_preview":"Рассмотрим простой случай создания имитации движения в Scilab, чтобы продемонстрировать основную идею реализации.\nИтак, будем работать с точкой, которая","common_preview":"Каким образом можно создавать анимационные Картинки в","common_image":"210529-115849-a8d8c79d4122e97dc3bb157303569bba-png","readtime":1,"isCurrentPage":false},{"id":"1580333059","h1":"Сохраняем анимацию в GIF-ку в Scilab","title":"Получаем анимированный GIF-файл в Scilab","description":"После создания анимационного графика сохраняем результат в GIF","url":"sohranyaem-animaciyu-v-gif-scilab","link":"\/articles\/sohranyaem-animaciyu-v-gif-scilab","views":"2577","commentCounter":0,"likeCounter":0,"tag_isset":true,"tag_url":"profi","tag_list":[{"url":"profi","name":"Scilab для продвинутых"}],"date_edit":"2021-06-04 16:17:45","date_create":"2021-05-29 19:23:54","date_ddmmyy":"29 мая 2021","date_after":"давным-давно","date_user":null,"block_blog_type":"blog","block_image_type":"image","block_image_content":"210529-200520-5ac22a45c3dec1b5cef5dba21c0413f7-png","block_image_image":"210529-200520-5ac22a45c3dec1b5cef5dba21c0413f7-png","block_text_type":"text","block_text_content":"После создания анимационного графика сохраняем результат в GIF","block_text_preview":"После создания анимационного графика сохраняем результат в","block_content_type":"text","block_content_content":"После того, как анимация объекта реализована, для презентации результатов может пригодиться возможность формирования гиф-изображения.<\/p>\n
На основе предыдущей статьи Основа анимации в Scilab<\/a>, рассмотрим, как можно сохранять анимированные графики в Scilab.<\/p>\n\n\nДля создания гифок нам потребуется дополнение animaGIF<\/em>, установить которое можно прямо из консоли Scilab, просто набрав команду:<\/p>\n\n\natomsInstall(\"animaGIF\")\n<\/code><\/pre>\nУстановка ATOMS из консоли Scilab.<\/span>\n<\/div>\t\nКроме того, данное дополнение доступно она фоициальном сайте по ссылке animated GIF creator<\/a>.<\/p>\nПосле установки дополнения, необходимо заново запустить среду, т.е. закрыть Scilab и заново его запустить.<\/p>\n
Использование данного инструмента, созданного для формирования GIF-картинок, не вызывает особых сложностей. Единственное, что стоит упомянуть: анимация будет значительно подтормаживать.<\/p>\n\n
Программная реализация<\/h2>\n\n
Итак, ранее была сформирована программа<\/a>, которая реализовывала движение точки по прямой. Немного модифицировав этот код, получим движущийся по окружности ромб:<\/p>\n\n\nx = cos(2*%pi*t); \/\/ положение точки на оси х\ny = sin(2*%pi*t); \/\/ положение точки на оси y\n ...\n\/\/ Рисуем окружность\nplot(x, y, 'k--');\n ...\npoint.mark_style = 4; \/\/тип соединительных элементов - ромб \npoint.mark_foreground = color(255,0,0); \/\/цвет кружка в формате rgb - красный\n<\/code><\/pre>\nМодификация имеющегося кода.<\/span>\n<\/div>\t\n\n\n
\n Ромб, движущийся по окружности.<\/span>\n<\/div>\t\n\n\nДалее, для формирования анимированной картинки, нужно указать путь, куда эта картинка будет сохранена и её имя. В программе используется тот же каталог, в котором лежит sce файл с программой:<\/p>\n
\n\n\/\/путь к данному (открытому) файлу\ncur_filepath = get_absolute_file_path(\"mooving-dot.sce\")\n\/\/укажем путь, куда сохранить картинку и её имя\ngif_pic = cur_filepath+'mooving_dot.gif';\n<\/code><\/pre>\nПуть к GIF-ке.<\/span>\n<\/div>\t\n\n\nНиже приведены команды, реализующие запись в GIF при помощи установленного дополнения animaGIF<\/em>:<\/p>\n\n\n ...\n\/\/ Инициируем создание GIF \nmdelete(gif_pic);\nidGif = animaGIF(gcf(), gif_pic, 10, 0);\n ...\n\/\/ добавляем кадр\nidGif = animaGIF(gcf(), idGif); \n ...\n\/\/ Заканчиваем создание GIF\nanimaGIF(idGif);\n<\/code><\/pre>\nИспользование animaGIF.<\/span>\n<\/div>\t\n\n\nПолный код программы приведён ниже:<\/p>\n
\n\nclc; clf();\n\n\/\/ входные данные\nt = 0:1e-2:1; \/\/ временной отрезок\nx = cos(2*%pi*t); \/\/ положение точки на оси х\ny = sin(2*%pi*t); \/\/ положение точки на оси y\n\n\/\/ Рисуем окружность\nplot(x, y, 'k--');\n\/\/ Рисуем точку в начальный момент времени\nplot(x(1), y(1));\n\npoint_axes = gca(); \/\/сетка координат\npoint_scene = gce(); \/\/объекты на сетке\npoint = point_scene.children; \/\/наша точка\n\npoint_axes.data_bounds = [-1.5, -1.5; 1.5, 1.5]; \/\/границы координатных осей\npoint_axes.grid = [1,1]; \/\/вспомогательная разметка\npoint_axes.x_label.text = \"x\"; \/\/подпись горизонтальной оси\npoint_axes.x_label.font_size = 4; \/\/размер шрифта подписи по оси х\npoint_axes.title.text = \"Движущаяся точка\" \/\/Заголовок \npoint_axes.title.font_size = 4; \/\/размер шрифта заголовка графика\n\npoint.mark_style = 4; \/\/тип соединительных элементов - ромб \npoint.mark_size = 20; \/\/размер соединительных элементов \npoint.mark_foreground = color(255,0,0); \/\/цвет кружка в формате rgb - красный\n\n\n\/\/путь к данному (открытому) файлу\ncur_filepath = get_absolute_file_path(\"mooving-dot.sce\")\n\n\/\/укажем путь, куда сохранить картинку и её имя\ngif_pic = cur_filepath+'mooving_dot.gif';\n\n\/\/ Инициируем создание GIF\nmdelete(gif_pic);\nidGif = animaGIF(gcf(), gif_pic, 10, 0);\n\n\n\/\/ цикл для анимации\nfor i = 1:length(x)\n drawlater();\n point.data = [x(i), y(i)];\n drawnow();\n \n \/\/ добавляем кадр\n idGif = animaGIF(gcf(), idGif); \nend\n\/\/ Заканчиваем создание GIF\nanimaGIF(idGif);\n\n<\/code><\/pre>\nСоздание анимированной картинки в Scilab.<\/span>\n<\/div>\t","block_content_preview":"После того, как анимация объекта реализована, для презентации результатов может пригодиться возможность формирования гиф-изображения.\nНа основе предыдущей","common_preview":"После создания анимационного графика сохраняем результат в","common_image":"210529-200520-5ac22a45c3dec1b5cef5dba21c0413f7-png","readtime":1,"isCurrentPage":false},{"id":"1580333076","h1":"Марковский процесс функционирования информационной системы с угрозами","title":"Реализация Марковской цепи","description":"Марковский случайный процесс с дискретным состоянием и дискретным временем","url":"realizaciya-markovskoy-cepi","link":"\/articles\/realizaciya-markovskoy-cepi","views":"2910","commentCounter":0,"likeCounter":0,"tag_isset":true,"tag_url":"profi","tag_list":[{"url":"profi","name":"Scilab для продвинутых"}],"date_edit":"2022-05-08 21:02:40","date_create":"2022-05-08 15:42:29","date_ddmmyy":"8 мая 2022","date_after":"давным-давно","date_user":null,"block_image_type":"image","block_image_content":"220508-193408-5c4caad14ce51b3174c2cc2da3f03157-jpg","block_image_image":"220508-193408-5c4caad14ce51b3174c2cc2da3f03157-jpg","block_text_type":"text","block_text_content":"","block_text_preview":"","block_content_type":"text","block_content_content":"Марковский случайный процесс с дискретным состоянием и дискретным временем<\/h2> \n
Предположим, что автоматизированная информационная системы может находиться в следующих n<\/em> состояниях \\( S_1, S_2, . . . , S_n\\). При этом переход системы из i<\/em>-го состояния в j<\/em>-е характеризуется вероятностью \\(p_{ij}\\), где i, j = 1, 2, . . . , n<\/em>.<\/p>\nПоскольку система может пребывать в одном из состояний, то для каждого момента времени t<\/em> необходимо задать \\(n^2\\) вероятностей перехода \\(p_{ij}\\), которые удобно представить в виде следующей матрицы:<\/p>\n \n \n \\begin{matrix}\n P= { \\begin{pmatrix} p_{11} & p_{12} & ... & p_{1n} \\\\ p_{21} & p_{22} & ... & p_{2n} \\\\ ... & ... & ... & ... \\\\ p_{n1} & p_{n2} & ... & p_{nn} \\end{pmatrix} (1)} \n \\end{matrix} \n<\/p> \n
Матрица (1) называется матрицей перехода системы<\/em>.<\/p> \nВ матрице перехода располагаются:
\n \\(p_{ij} \\) - вероятность перехода системы за один шаг из состояния \\(S_i\\) в состояние \\(S_j\\);
\n \\(p_{ii}\\) - вероятность задержки системы в состоянии \\(S_i\\).<\/p> \n
Таким образом, в обозначении \\(p_{ij} \\) первый индекс указывает номер предшествующего состояния, а второй номер последующего.<\/p>\n\n
Переходной вероятностью \\(p_{ij} \\)<\/em> называют условную вероятность того, что из состояния \\(S_i\\), в котором система оказалась в результате некоторого испытания, безразлично какого номера, в итоге следующего испытания система перейдет в состояние \\(S_j\\).<\/p>\n \nТак как в каждой строке матрицы перехода помещены вероятности событий перехода из одного и того же состояния в любое возможное, то сумма вероятностей этих событий равна 1. Т.е. сумма значений в каждой строке матрицы должна быть равна 1:<\/p>\n \n
\n \\(\n\\displaystyle\\sum_{j=1}^{n} p_{ij} = 1, \\quad i = \\bar{1,n}\n \\)\n<\/p> \n \n
Марковский случайный процесс с дискретными состояниями и дискретным временем называют марковской цепью<\/em>.
\nДля такого процесса моменты \\( t_1, t_2, ...\\), когда система может менять свое состояние, рассматривают как последовательные шаги процесса, а в качестве аргумента, от которого зависит процесс<\/em>, выступает не время \\( t\\), а номер шага<\/em> \\( 1, 2, ... , k, ... \\).<\/p>\n \nСлучайный процесс в этом случае характеризуется последовательностью состояний \\( S(0), S(1), S(2), ... , S(k), ... \\), где
\n\\(S(0)\\) - начальное состояние системы (перед первым шагом);
\n\\(S(1)\\) - состояние системы после первого шага;
\n\\(S(k)\\) - состояние системы после k-го шага.<\/p><\/p>\n \n
Вероятностями перехода системы за \\( k \\) шагов из \\(S_i\\) состояния в \\(S_j\\) <\/em> называются вероятности \\( P_{ij}(k) \\) того, что в результате \\( k \\) шагов система перейдет из состояния \\( S(0) = S_i \\) в состояние \\( S(k) = S_j \\) \\( i, j = 1, 2, ... \\).<\/p>\n \nНапример, \\( P_{36}(8) \\) - вероятность того, что за 8<\/em> шагов система перейдет из состояния \\(S_3\\) в \\(S_6\\).<\/p>\nЗаметим, что при \\(n = 1 \\) вероятности состояний цепи Маркова \\( P_{ij}(1) \\) совпадают с переходными вероятностями \\( p_{ij} \\). <\/p>\n \n
Кроме того, как и в случае (1) должно выполняться равенство:<\/p>\n \n
\n \\(\n\\displaystyle\\sum_{j=1}^{n} P_{ij}(k) = 1, \\quad i = \\bar{1,n}, \\quad \\forall k \\quad\\quad (2)\n \\)\n<\/p> \n \n \n
Начальным распределением вероятностей<\/em> Марковской цепи называется распределение вероятностей состояний в начале процесса:<\/p>\n \n\\(\n p_1(0), p_2(0), ... , p_n(0) \\quad\\quad (3)\n \\). \n<\/p> \n
Если для однородной Марковской цепи заданы начальное распределение вероятностей (3) и матрица P переходных вероятностей (1), то вероятности состояний системы<\/em> \\( p_i(k) (i = 1, 2, . . . ,) \\) определяются по рекуррентной формуле:<\/p> \n\n\n \n \\(\np_{i}(k) = \\displaystyle\\sum_{j=1}^{n} p_{ji} \\cdot p_{j}(k-1) = 1 \\quad\\quad (4)\n \\)\n<\/p> \n \n\n
Итак, у нас имеются:<\/p> \n
\nВектор \\( (p_1(0), p_2(0), ... , p_n(0)) \\) начального распределения (3). Это вероятности стартовать из каждого из состояний.<\/p><\/li>\n
Переходные вероятности \\( p_{ij} \\). Это вероятности перейти из состояния \\(S_i\\) в \\(S_j\\) за 1 шаг. Из \\( p_{ij} \\) составлена матрица перехода (1).<\/p><\/li>\n\n
Вероятности состояний системы \\( p_{i}(k) \\). Это вероятности оказаться в состояния \\(S_i\\) через \\( k \\) шагов.<\/p><\/li>\n
Чудесная формула (4), по которой, зная начальное положение системы, можно рассчитать вероятность оказаться в том или ином состоянии через определённое число шагов.<\/p><\/li>\n<\/ul>\n \n \n
Моделирование АИС с двумя зависимыми внутренними угрозами с помощью цепи Маркова<\/h2> \n
Пусть дана информационная система с двумя зависимыми внутренними угрозами, орграф которой изображен на рис. 1.<\/p>\n
В качестве двух зависимых внутренних угроз могут быть следующие.<\/p>\n
\nНеквалифицированная политика по управлению информационной безопасностью организации;<\/p><\/li>\n
Отсутствие должной квалификации персонала по обеспечению деятельности и управлению информационной безопасностью.<\/p><\/li>\n<\/ol> \n [img:crd43v:tmp:alt=Рисунок 1. Граф переходов (состояний) АИС с двумя зависимыми внутренними угрозами.]\n \n
Данная система моделируется Марковской цепью. Она содержит невозвратные состояния, называемые поглощающими. Из поглощающего состояния нельзя перейти\nни в какое другое. На графе поглощающему состоянию соответствует вершина, из которой не выходит ни одна дуга. Поглощающему состоянию соответствует вероятность, равная 1.<\/p>\n \n\n \n
Пусть наша система может находиться в одном из четырех состояний:<\/p>\n
\n\\(S_1\\) - состояние, в котором внутренние угрозы ИБ не проявились,<\/p><\/li>\n
\\(S_2\\) - состояние, в котором первая внутренняя угроза ИБ проявилась с вероятность \\(p_{12}\\),<\/p><\/li>\n
\\(S_3\\) - состояние, в котором вторая внутренняя угроза ИБ проявилась с вероятность \\(p_{13}\\),<\/p><\/li>\n
\\(S_4\\) - поглощающее состояние, в котором внутренние угрозы ИБ реализовались с вероятностями \\(p_{24}\\) и \\(p_{34}\\) соответственно.<\/p><\/li>\n<\/ul> \n \n\n
Для данной системы у нас заданы:<\/p> \n
\nВектор начального распределения:<\/p>\n
\n \\( (p_1(0), p_2(0), p_3(0) , p_4(0)) = (1, 0, 0, 0) \\)\n<\/p> \n
То есть, при запуске, мы стартуем всегда из 1-го состояния.<\/p> \n <\/li>\n
Матрица перехода:<\/p>\n \n
\n \\begin{matrix}\n P= { \\begin{pmatrix} 0,2 & 0,3 & 0,5 & 0 \\\\ 0,4 & 0 & 0,3 & 0,3 \\\\ 0,1 & 0,4 & 0 & 0,5 \\\\ 0 & 0 & 0 & 1 \\end{pmatrix} } \n \\end{matrix} \n<\/p> \n <\/li>\n<\/ul>\n \n
А выяснить мы хотим вероятности состояний информационной системы через три шага, воспользовавшись формулой (4).<\/p> \n\n\n
Приступим к реализации на scilab пошагового моделирования марковского процесса.<\/p> \n
Зададим вектор начального распределения Po и матрицу вероятностей перехода P.<\/p> \n
\n\nclc; clf;\n \nPo = [1; 0; 0; 0];\nP = [0.2 0.3 0.5 0; 0.4 0 0.3 0.3; 0.1 0.4 0 0.5; 0 0 0 1];\ndisp(P, \"Матрица распределения вероятностей\");\n\n<\/code><\/pre> \nЗадание начального вектора и матрицы состояний.<\/span>\n<\/div>\t \n \n \nА далее итерационно воспользуемся формулой (4), бережно сохранив промежуточные результаты в Y.<\/p> \n
\n\n\/\/ число шагов\nn = 3;\n\n\/\/ создадим пустой массив\nY = [];\n\/\/ в первый столбец запишем имеющиеся значения начального распределения вероятностей Po\nY(:,1) = Po; \n\/\/ двоеточие на первом месте означает, что будем брать все строки из первого столбца\n \n \nfor k = 2:n\n \/\/ новый k-й столбец Y формируется как результат\n \/\/ умножения транпонированной матрицы Р (см формулу 4 -> pji)\n \/\/ на k-1 столбец матрицы У (т.е. вероятности состояния в k-1 момент времени) \n Y(:,k) = P' * Y(:,k-1) \nend\n\ndisp(Y, \"Последовательность векторов оказаться в состояниях S1, S2 на 1,. . .,\" + string(n) + \" шаге\")\n \n<\/code><\/pre> \nРеализация подсчета вероятности оказаться в каждом из состояний на 3-м шаге.<\/span>\n<\/div>\t \n \nВ консоли можно наблюдать за изменением вероятностей оказаться в каждом из 4-х состояний на 1,2 и 3-м шагах:<\/p> \n [img:cdhf19:tmp:alt=Рисунок 2. Изменение вероятностей состояния на каждом шаге.]\n \n
Если же число шагов увеличить до 10, то можно наблюдать, как система все вероятнее перейдёт в поглошающее 4-е состояние.<\/p> \n[img:f4fqcf:tmp:alt=Рисунок 3. С ростом числа испытаний, вероятность оказаться в S4 возрастает.] \n
Отдельно стоит отметить, что сумма элементов вектора = 1.<\/p> \n \n
Для пущей наглядности сходимости вероятностей, построим графики зависимости вероятностей Pj от числа шагов.<\/p> \n
\n\nt = 1:n;\ns = 1:3;\n\nsubplot(121); \nplot(t, Y(1,:),'-ro', t,Y(2,:),'-go', t,Y(3,:),'-bo', t,Y(4,:),'-co'); xgrid; \nxtitle(\"Вероятности состояний на каждом шаге\", \"шаг\", \"Вероятности\");\nlegend(\"P1\", \"P2\", \"P3\", \"P4\");\n\n\nsubplot(122);\nbar3d(Y, alpha=75,theta=-25);\nxtitle(\"Вероятности состояний на каждом шаге\", \"шаг\", \"состояния\", \"вероятность\");\n<\/code><\/pre> \nПостроение графиков в 2d и 3d вариантах.<\/span>\n<\/div>\t \n \n[img:8k4dy3:w=800:h=400:tmp:alt=Рисунок 3. Распределение вероятностей состояний в зависимости от шага.] \n\nСерия экспериментов для цепи Маркова, граф которой изображён на рис.1<\/h2> \n
Посмотрим, действительно ли состояние 4 будет являться поглощающим в различных условиях. Для этого сгенерируем 9 случайных векторов состояний и, стартуя каждый раз из 1-го состояния, промоделируем поведение Марковской цепи с заданной матрицей перехода на протяжении 10-ти шагов.<\/p> \n
\n\nclc; clf;\n\n\/\/ Матрица перехода\nprobabilityMatrix = [0.2 0.3 0.5 0; 0.4 0 0.3 0.3; 0.1 0.4 0 0.5; 0 0 0 1];\nprobabilityMatrixDim = size(probabilityMatrix); \nprobabilityMatrixCols = probabilityMatrixDim(2);\n\n\/\/ Состояния. Индекс строки S(j) - это эквивалент состояния Sj\nstatesVector = 1:probabilityMatrixDim(1);\n\n\nmarkovChainSteps = 10; \n\/\/ Моменты времени, в которые осуществляется переход из одного состояния в другое\nt = 1:markovChainSteps;\n\n\/\/ число строк в разбиении графического окна\nwinRows = 3; \n\/\/ число столбцов в разбиении графического окна\nwinCols = 3; \n\/\/число экспериментов\nwinAxes = winRows*winCols;\n<\/code><\/pre> \nРеализация подсчета вероятности оказаться в каждом из состояний на 3-м шаге.<\/span>\n<\/div>\n\nНиже моделирование цепи повторяется 9 раз.<\/p> \n
\n\nfor n = 1:winAxes\n \/\/ генерируем случайный вектор состояний, которые выпали в n-e моменты\n trainVector = ceil( 100 * rand(1, markovChainSteps, \"uniform\"))\/100; \n \n \/\/ Пусть стартовать будем всегда из 1-го состояния\n Si = statesVector(1); \n \/\/ Пока пустой массив, в который будем записывать вычисленные состояния\n markovChain =[];\n \/\/ Переменная для поиска состояния, в которое будем переходить\n pmRowMax = 0;\n \n for k = 1:markovChainSteps \n \/\/ Запишем в цепь текущее состояние Si \n chainMarkov(k) = Si;\n \/\/ Номер строки матрицы перехода, в которой будем искать состояние, куда переходить\n i = Si;\n \n \/\/ Предположим, что состояние поглощающее\n Sj = Si; \n \n \/\/ Если выпала вероятность больше, чем текущая pii \n if ( trainVector(k) > probabilityMatrix(i,i) ) then \n \/\/ Пробежим всю i-ю строку матрицы \n \/\/ т.е. будем менять столбцы j\n \/\/ в поисках состояния, в которое можно перейти \n \n pmRowMax = 0; \n for j = 1:probabilityMatrixCols \n \/\/ Если вероятность состояния\n \/\/ оказалась больше элемента матрицы pij\n \/\/ и данный элемент матрицы - самый большой из найденных\n \/\/ и данный элемент матрицы позволяет перейти в другое состояние, т.е. не равен pii \n if ( trainVector(k) > probabilityMatrix(i,j) ) && \n \t\t\t\t\t( probabilityMatrix(i,j) > pmRowMax ) && \n \t\t\t\t\t ( probabilityMatrix(i,j) ~= probabilityMatrix(i,i) ) then\n \/\/ обновляем максимальный элемент из найденных\n pmRowMax = probabilityMatrix(i,j);\n \n \/\/ считаем, что будем переходить в Sj состояние. \n \/\/ т.к. pij говорит, что переходим из Si в Sj\n \/\/ нам понадобится j - это столбца = номеру состояния, в которое переходим \n Sj = j;\n end \n end \n \n end \n \n \/\/ после пробега всей строки\n \/\/ обновляем текущее состояние \n Si = Sj; \n end\n \n \/\/ рисование\n subplot(winRows,winCols, n)\n plot(t', chainMarkov);\n ttl = \"Цепь Маркова \" + string(n);\n xtitle(ttl, \"t\", \"S\");\n xgrid;\n \n \/\/ добавим надписи Si на координатную сетку и увеличим их шрифт до 3\n \/\/ добавление $ ... $ внутри \" ... \" позволяет вводить текст в формате LaTex\n \/\/ S_1 -это S с нижним индексом 1\n for i = 1:probabilityMatrixCols\n str = \"$S_\" + string(i) + \"$\";\n xstring(-1, i, [str]); gce().font_size = 3; \n end \n\n str = string(trainVector);\n xstring(-1, 0, ['V=(',str, ')']); \n gce().font_size = 2; \n gce().font_color = 2; \n \n axe = gca();\n axe.font_size = 3; \/\/размер циферок на осях\n axe.data_bounds=[-1, 0; markovChainSteps + 1, probabilityMatrixCols + .5]; \/\/ видимая область координатной сетки [Xmin, Ymin; Xmax, Ymsx] \n \n mchain = axe.children.children(1); \/\/ выберем последний график на координатной сетке\n mchain.polyline_style = 2; \/\/ соединение точек - лесенкой\n mchain.foreground = 2; \/\/ цвет соединительных линий - синий\n mchain.thickness = 2; \/\/ толщина соединительных линий\n mchain.mark_mode = 'on'; \/\/ добавим кружочки в местах соединения линий\n mchain.mark_style = 9; \/\/ тип кружка - не закрашенный\n mchain.mark_size = 6; \/\/ размер кружка \n\n\nend\n<\/code><\/pre> \nСерия экспериментов для цепи Маркова.<\/span>\n<\/div>\n\nВ результате проведённых экспериментов, можно удостовериться, что попав в 4-е состояние, выбраться из него уже не удаётся.<\/p> \n[img:bhp517:w=800:h=400:tmp:alt=Рисунок 4. Моделирование цепи Маркова для АИС с 2-мя угрозами.] \n\n\n","block_content_preview":"Марковский случайный процесс с дискретным состоянием и дискретным временем \nПредположим, что автоматизированная информационная системы может находиться в","common_preview":"","common_image":"220508-193408-5c4caad14ce51b3174c2cc2da3f03157-jpg","readtime":1,"isCurrentPage":false},{"id":"1580333077","h1":"Динамическая вероятностная модель взаимодействия САЗ ИС","title":"Марковский случайный процесс с дискретными состояниями и непрерывным временем","description":"Непрерывная цепь Маркова на Ысшдфи","url":"markovskiy-sluchaynyy-process-s-diskretnymi-sostoyaniyami","link":"\/articles\/markovskiy-sluchaynyy-process-s-diskretnymi-sostoyaniyami","views":"6015","commentCounter":0,"likeCounter":0,"tag_isset":true,"tag_url":"profi","tag_list":[{"url":"profi","name":"Scilab для продвинутых"}],"date_edit":"2022-05-12 12:40:00","date_create":"2022-05-08 21:30:58","date_ddmmyy":"8 мая 2022","date_after":"давным-давно","date_user":null,"block_image_type":"image","block_image_content":"220508-232740-62df9776685df715edaf91ecdd9379e3-jpg","block_image_image":"220508-232740-62df9776685df715edaf91ecdd9379e3-jpg","block_text_type":"text","block_text_content":"При моделировании информационных систем часто встречаются ситуации, которые указать заранее невозможно.","block_text_preview":"При моделировании информационных систем часто встречаются ситуации, которые указать заранее","block_content_type":"text","block_content_content":"
Непрерывная цепь Маркова<\/h2> \n
При моделировании информационных систем часто встречаются ситуации, которые указать заранее невозможно. Например, любая деталь или агрегат могут выходить из строя в любой, непредсказуемый заранее момент времени. <\/p>\n\n
В данной ситуации не удастся обойтись детерминированной матрицей переходов, как в дискретном случае<\/a> ведь вероятность<\/em> \\(p_{i}\\) оказаться в состоянии \\(S_i\\) будет функцией времени<\/em>, то есть:<\/p>\n \n\n\\(p_{i}(t) = p(S_i(t)) \\quad i = 1,...,n, \\quad t \\geq 0 \\)\n<\/p> \n\n
Более того, вместо вероятности перехода \\(p_{ij}\\), мы теперь будем говорить о плотности вероятности<\/em> перехода \\(\\lambda_{ij}(t)\\) из состояния \\(S_i\\) в состояние \\(S_j\\) в момент времени t:<\/p>\n \n \n \\(\n\\lambda_{ij}(t) = \\displaystyle\\lim_{\\Delta t \\to 0} \\frac{p_{ij}(t,\\Delta t)}{\\Delta t}\n \\)\n<\/p> \n
которая запросто может становиться больше 1.<\/p>\n\n
Вероятности \\(\\lambda_{ij}(t)\\) будут составлять матрицу плотностей вероятностей переходов<\/em>:<\/p>\n \n \n \\begin{matrix}\n \\Lambda= { \\begin{pmatrix} \\lambda_{11}(t) & \\lambda_{12}(t) & ... & \\lambda_{1n}(t) \\\\ ... & ... & ... & ... \\\\ \\lambda_{n1}(t) & \\lambda_{n2}(t) & ... & \\lambda_{nn}(t) \\end{pmatrix} \\quad (1)} \n \\end{matrix} \n<\/p> \n\n
Однако, несмотря на то, что всё меняется, некоторые вещи остаются неизменными, но становятся другими :)<\/small><\/p>\n
В случае с непрерывным временем тоже будет иметь место равенство суммы вероятностей 1, которое будем называть нормировочным условием<\/em>:<\/p>\n \n \\(\n\\displaystyle\\sum_{i=1}^{n} p_{i}(t) = 1, \\quad \\forall t \\geq 0 \\quad (2)\n \\) \n<\/p> \n\n
Как же отыскать \\(p_{i}(t)\\), если они в явном виде нигде не заданы?<\/p>\n
Здесь на помощь приходят дифференциальные уравнения Колмагорова<\/em>, которые и помогут найти исходные \\(p_{i}(t)\\).<\/p>\nИтак, вероятности состояний \\(p_{i}(t)\\) - это решение системы дифференциальных уравнений вида:<\/p>\n\n
\n \\(\n\\displaystyle\\frac{dp_{i}(t)}{dt} = \\displaystyle\\sum_{j=1}^{n} \\lambda_{ji}(t)\\cdot p_{j}(t) - \\displaystyle\\sum_{j=1}^{n} \\lambda_{ij}(t)\\cdot p_{i}(t) \\quad (3)\n \\)\n<\/p> \n\n
Рассмотрим подробнее, что из себя представляет 1-е уравнение системы (3). Для этого заменим все \\( i \\) на 1 в (3):<\/p>\n
\n \\(\n\\displaystyle\\frac{dp_{1}(t)}{dt} = \\displaystyle\\sum_{j=1}^{n} \\lambda_{j1}(t)\\cdot p_{j}(t) - \\displaystyle\\sum_{j=1}^{n} \\lambda_{1j}(t)\\cdot p_{1}(t) \\quad \n \\)\n<\/p> \n\n
Теперь стало понятно, что в сумме с плюсом<\/em> надо пробежаться по 1-му столбцу<\/em> матрицы (1), домножив<\/em> каждый элемент на соответствующую вероятность \\(p_{j}(t)\\),
\nа в сумме с минусом<\/em> надо пробежаться по 1-ой строке<\/em> матрицы (1), домножив<\/em> каждый элемент на вероятность \\( p_{1}(t) \\).<\/p>\n\nЕсли перевести последнее высказывание на язык графов, то получим, что:
\nпроизводная вероятности 1-го состояния - это сумма произведений входящих стрелок на интенсивности соответствующих потоков
\nминус сумма произведений исходящих стрелок на интенсивность 1-го потока.<\/p>\n\n
Отсюда можно вывести правило составлений уранений Колмагорова:<\/em><\/p>\n \nВ левой части каждого из них стоит производная вероятности i-го состояния<\/em>.<\/p> <\/li>\nВ правой части
\n с плюсом - суммарная интенсивность всех потоков, приводящих систему в данное состояние:
\n с минусом - суммарная интенсивность всех потоков, выводящих систему из данного состояния.<\/p>\n<\/li> \n <\/ul> \n\n
Финальные вероятности<\/h3>\n
Уравнения Колмогорова дают возможность найти все вероятности состояний как функции времени. Особый интерес представляют вероятности системы в предельном стационарном режиме<\/em>, т.е. при \\( t \\to \\infty \\), которые называются предельными (или финальными) вероятностями <\/em> состояний.<\/p>\n\nФинальные вероятности состояний находятся путем решения СЛАУ, которые получаются из дифференциальных уравнений Колмогорова (3), если приравнять производные к нулю, а вероятностные функции состояний \\( p_1(t),..., p_n(t) \\) в правых частях уравнений заменить соответственно на неизвестные финальные вероятности \\( p_1^*(t),..., p_n^*(t) \\) и добавить нормировочное условие (2). <\/p>\n\n
\n \\(\n \\begin{cases}\n0 = \\displaystyle\\sum_{j=1}^{n} \\lambda_{ji}(t)\\cdot p^*_{j} - \\displaystyle\\sum_{j=1}^{n} \\lambda_{ij}(t)\\cdot p^*_{i} \\quad \\\\\n \\displaystyle\\sum_{i=1}^{n} p^*_{i} = 1\n \\end{cases}\n \\)\n<\/p> \n\n
Модель взаимодействия копмонент ПО средств активной защиты<\/h2> \n
Рассмотрим процесс активной защиты информационной компьютерной системы, в которой функционируют 5 комплексов программ.<\/p>\n
Пусть плотности вероятности \\(\\lambda_{ij}\\) описывают интенсивность передачи управления от \\(i\\)-го компекса ПО к \\(j\\)-му в процессе решения задач активной защиты КС.<\/p>\n
Предположим, что \\(\\lambda_{ij}\\) задаются в виде:<\/p>\n
\n \\(\n\\lambda_{12} = \\frac{1}{T_1}; \\lambda_{21} = \\frac{1-\\alpha}{T_2}; \\lambda_{23} = \\frac{\\alpha}{T_2}; \\lambda_{34} = \\frac{1}{T_3}; \n \\)
\n \\(\n\\lambda_{43} = \\frac{1-\\beta}{T_4}; \\lambda_{45} = \\frac{\\beta}{T_4}; \\lambda_{51} = \\frac{1}{T_5}; \n \\) \n<\/p> \n\n
где \\(\\alpha\\) - вероятность того, что вторжение злоумышленника бедут распознано САЗ,
\n \\(\\beta\\) - вероятность того, что выявленная уязвимость в КС будет использована для ответных атак.<\/p>\n\n
Через \\( p_i(t) \\) зададим вероятность того, что в момент времени \\( t\\) в КС выполняется \\(i\\)-й компекс программ.<\/p>\n\n
Пусть взаимодействие комплексов ПО в КС описывается с помощью графа на рис.1 <\/p>\n[img:9kdn3s:tmp:alt=Рисунок 1. Граф связи комплексов ПО в КС.] \n\n
Тогда соответствующая система ДУ Колмагорова будет иметь вид:<\/p>\n
\n \\(\n\\begin{cases} \n \\dot p_1 = -\\lambda_{12}p_1 + \\lambda_{21}p_2 + \\lambda_{51}p_5 \\\\ \n \\dot p_2 = \\lambda_{12}p_1 - (\\lambda_{21} + \\lambda_{23})p_2 \\\\ \n \\dot p_3 = \\lambda_{23}p_2 - \\lambda_{34}p_3 + \\lambda_{43}p_4 \\\\ \n \\dot p_4 = \\lambda_{34}p_3 - (\\lambda_{43} + \\lambda_{45})p_4 \\\\ \n \\dot p_5 = \\lambda_{45}p_4 - \\lambda_{51}p_5 \n\\end{cases} (4)\n \\) \n<\/p> \n\n
Для того, чтобы с уравнениями Колмагорова было удобнее работать в Scilab, перепишем систему (4) в матричном виде:<\/p>\n
\n \\begin{matrix}\n \\dot p = { \\begin{pmatrix} \n -\\lambda_{12} & \\lambda_{21} & 0 & 0 & \\lambda_{51}\\\\ \n \\lambda_{12} & -(\\lambda_{21} + \\lambda_{23}) & 0 & 0 & 0\\\\\n 0 & \\lambda_{23} & -\\lambda_{34} & \\lambda_{43} & 0\\\\\n 0 & 0 & \\lambda_{34} & - (\\lambda_{43} + \\lambda_{45}) & 0\\\\ \n 0 & 0 & 0 & \\lambda_{45} & -\\lambda_{51}\\\\\n \\end{pmatrix} }p \\quad (5)\n \\end{matrix} \n<\/p> \n\n
Кратко:<\/p>\n
\n \\( \\dot p = Bp \\) \n<\/p>\n\n
Зададим начальные условия для системы (5), т.е. вектор начального состояния (6):<\/p>\n
\n \\( p_0 = (1, 0, 0, 0, 0) \\quad (6) \\) \n<\/p>\n\n\n
Решение ДУ Колмагорова в Scilab<\/h3>\n
Решим задачу Коши для системы (5), с н.у. (6) в Scilab.<\/p>\n
Решение данной задачи почти не отличается от рассмотренных ранее двумерных систем<\/a>.<\/p>\nЕдинственное нововведение - это замена в матрице системы (5) одной из строк на нормировочное условие (2). Это необходимо сделать, т.к. пара уравнений в (5) являются линейно зависимыми.<\/p>\n\n
\n\nclc; clf;\nfunction dp = kolm(t, p)\n \t\/\/ заменим первую строку на условие нормировки\n p(1) = 1 - (p(2) + p(3) + p(4) + p(5));\n dp = B*p; \nendfunction\n\n\/\/ зададим параметры системы\nT1 = 12;\nT2 = 8;\nT3 = 20;\nT4 = 15;\nT5 = 5;\n\nalp = .8;\nbet = .7;\n\na12 = 1\/T1;\na21 = (1-alp)\/T2;\na23 = alp\/T2;\na34 = 1\/T3;\na43 = (1 - bet)\/T4;\na45 = bet\/T4;\na51 = 1\/T5;\n\n\/\/ сформируем матрицу системы (5) \nB = [-a12, a21, 0, 0, a51; a12, -(a21+a23), 0 0 0; 0, a23, -a34, a43, 0; 0, 0, a34, -(a43+a45), 0; 0, 0, 0, a45, -a51];\nn = size(B,1);\n\n\/\/ отрезок интегрирования \nt = 0:.1:100;\n\/\/ начальные условия (6)\np0 = [1; 0; 0; 0; 0];\n\n\/\/ решаем дифур\nPt = ode(p0, 0, t, kolm);\nplot(t, Pt); \ngce().children.thickness = 4;\nxgrid; \nxtitle(\"Функции распределения вероятностей\", \"t\", \"Pj(t)\");\n<\/code><\/pre> \nРешение ДУ Колмагорова для марковской цепи.<\/span>\n<\/div>\t \n\nНа рис.2 представлены интегральне кривые системы (5), которые и представляют собой вероятности состояний КС как функции времени.<\/p>\n\n[img:g8sf4j:tmp:alt=Рисунок 2.Решение ДУ Колмагорова.]\n \n
Решение СЛАУ Колмагорова в Scilab<\/h3>\n
Так как марковский процесс, описывающий взаимодействие компонент ПО САЗ не имеет поглощающих состояний (см. рис.1), то с некоторого момента времени все компоненты КС будут функционировать в стационарном режиме, достигнув финальных вероятностей.<\/p>\n\n
Найдём финальные вероятности \\( p_i^* \\). Для этого в системе (5) приравняем производные к нулю и решим СЛАУ с условием нормировки (2):<\/p>\n
\n \\( \n \\begin{cases} \n 0 = { \\begin{pmatrix} \n -\\lambda_{12} & \\lambda_{21} & 0 & 0 & \\lambda_{51}\\\\ \n \\lambda_{12} & -(\\lambda_{21} + \\lambda_{23}) & 0 & 0 & 0\\\\\n 0 & \\lambda_{23} & -\\lambda_{34} & \\lambda_{43} & 0\\\\\n 0 & 0 & \\lambda_{34} & - (\\lambda_{43} + \\lambda_{45}) & 0\\\\ \n 0 & 0 & 0 & \\lambda_{45} & -\\lambda_{51}\\\\\n \\end{pmatrix} }p^* \\\\\n 1 = p_1^* +p_2^* + p_3^* + p_4^* + p_5^* \\quad \n \\end{cases} (7)\n \\)\n<\/p> \n
Чтобы не запутаться в последовательности линейных преобразований в системе (7), поручим эти действия Scilab.<\/p>\n\n
Прежде всего, приведём матрицу B к ступенчатому виду. Для этого в Scilab имется функция rref:<\/p>\n\n
\n\nrB = rref(B);\ndisp('Приведённая к ступенчатому виду матрица В', rB);\n<\/code><\/pre> \nФункция приведения матрицы к ступенчатому виду в Scilab.<\/span>\n<\/div>\t \nУбедимся, что rB<\/em> действительно ступенчатая да ещё и с одной нулевой строкой (вспомните про ЛЗ уравнений в (5) ) :<\/p>\n[img:30wrsy:tmp:alt=Рисунок 3.Ступенчатый вид матрицы В.]\n\n\nДалее нам необходимо заменить последнюю строку матрицы на условие нормировки (2). Это условие выражено 6-м уравнением в системе (7). В нём фигурируют все элементы вектора p с коэффициентами 1. Поэтому последняя строка ступенчатой матрицы превратится в строку единиц.
\nПоследнюю строку матрицы в Scilab можно отыскать с помощью символа $<\/em><\/p>\n\n\n\nrB($, :) = ones(n);\ndisp('Заменим последнюю строку на условие нормировки в матрице В', rB);\n<\/code><\/pre> \nЗаменим последнюю строку на условие нормировки в матрице В.<\/span>\n<\/div>\n[img:cclxm1:tmp:alt=Рисунок 4.Ступенчатая матрица со строкой из 1.]\n\nОсталось лишь численно решить систему алгебраических уравнений.
\nВ Scilab для решения системы линейных уравнений<\/em> припасена функция linsolve(A, b)<\/em>, которая ищет вектор x<\/em> в системе уравнений вида:<\/p>\n \n \\( A*x + b = 0 \\) \n<\/p>\n\n
В нашем случае первый аргумемнт функции linsolve(*, *)<\/em> - это матрица rB<\/em>, а второй аргумент - это вектор f<\/em>, сформированный из неоднородностей системы (7), перенесённых за знак \"=\".<\/p>\n\n\n\/\/Вектор f состоит из нулей (левые части ДУ)\nf = zeros(n,1);\n \n\/\/ и последней -1 из нормировочного условия\nf($+1) = -1;\ndisp('Вектор f', f);\n\n\/\/ linsolve ищет решение для системы rB*p + f = 0.\nPlin = linsolve(B, f);\ndisp('Численное решенеие системы алгебраических уравнений', Plin)\n<\/code><\/pre> \nЧисленное решенеие системы алгебраических уравнений в Scilab.<\/span>\n<\/div>\t\n\n\nНарисуем финальные вероятности \\( p_i^* \\), чтобы убедиться, что именно к ним сходится решение ДУ Колмагорова:<\/p>\n
\n\ncolors = ['c--'; 'g--'; 'm--'; 'y--'; 'bl--'];\nfor i=1:n\n plot( t, t*0 + Plin(i), colors(i) );\n gce().children.thickness = 2;\nend\n<\/code><\/pre> \nнарисуем вероятности p*.<\/span>\n<\/div>\t\n\n[img:f48gqp:tmp:alt=Рисунок 5.Выход на финальные вероятности интегральных кривых.]\n\nИтак, где-то с 90сек. ПО в системе активной защиты КС будет функционировать в установившемся режиме.<\/p>\n\n\n\n\n\n\n\n","block_content_preview":"Непрерывная цепь Маркова \nПри моделировании информационных систем часто встречаются ситуации, которые указать заранее невозможно. Например, любая деталь или","common_preview":"При моделировании информационных систем часто встречаются ситуации, которые указать заранее","common_image":"220508-232740-62df9776685df715edaf91ecdd9379e3-jpg","readtime":1,"isCurrentPage":false},{"id":"1580333057","h1":"Анимация стабилизации маятника в Scilab","title":"Создаём движущийся маятник в Scilab","description":"Пример управляемого анимированного движения математичеcкого маятника в Scilab","url":"animaciya-stabilizacii-mayatnika-v-scilab","link":"\/articles\/animaciya-stabilizacii-mayatnika-v-scilab","views":"3294","commentCounter":0,"likeCounter":0,"tag_isset":true,"tag_url":"profi","tag_list":[{"url":"profi","name":"Scilab для продвинутых"}],"date_edit":"2022-05-27 17:26:28","date_create":"2022-05-27 12:12:47","date_ddmmyy":"27 мая 2022","date_after":"давным-давно","date_user":null,"block_image_type":"image","block_image_content":"210527-122004-fb9c8c8cf93911398183ff8a73277a31-png","block_image_image":"210527-122004-fb9c8c8cf93911398183ff8a73277a31-png","block_text_type":"text","block_text_content":"Стабилизация программной позиции маятника путём линеаризации уравнений в отклонениях\n","block_text_preview":"Стабилизация программной позиции маятника путём линеаризации уравнений в","block_content_type":"text","block_content_content":"
На примере простой механической системы посмотрим, как \"оживить\" картинки в Scilab без дополнительных плагинов и без использования comet()<\/em>.<\/p>\nБудем стабилизировать простой математический маятник.<\/p>\n[img:5c413i:tmp:alt=Рисунок. Математический маятник.]\n\n\n
Уравнения которого имеют вид.<\/p>\n
\\( \\ddot{\\theta} + b\\dot{\\theta} + asin\\theta = cT \\)<\/p>\n
Стабилизировать маятник будем в программной позиции \\( \\theta = \\delta=const \\) с помощью вращающего момента: \\( T = u \\)<\/p>\n
\\( \\ddot{\\theta} + b\\dot{\\theta} + asin\\theta = cu \\) (1)<\/p>\n\n
Найдём программное управление \\( u^p \\)<\/h2>\n
Программное управление \\( u^p \\) - это управление, которое обеспечивает программную позицию, т.е. отклоняет маятник на угол \\( \\delta \\). Подставим \\( \\theta = \\delta \\) в (1):<\/p>\n
\\( \\ddot{\\delta} + b\\dot{\\delta} + asin\\delta = cu^p \\)<\/p>\n
Так как угол \\( \\delta \\) - это постояннная величина, ведь мы хотим, чтобы маятник остановился в таком положении, её производные будут равны 0, следовательно:<\/p>\n
\\( 0 + 0 + asin\\delta = cu^p \\) <\/p>\n\n
Откуда можно выразить искомое программное управление \\( u^p \\):<\/p>\n
\\( u^p = \\frac{a}{c}sin\\delta\\) (2) <\/p>\n\n
Перейдём к системе д.у.<\/h2>\n
Подробно переход к системе ДУ рассматривается в этом материале<\/a>. \n\nВведём фазовые координаты:<\/p>\n
\\( x_1 = \\theta, x_2 = \\dot{\\theta} \\) <\/p> \n \n
Тогда исходное уравнение (1) второго порядка сведётся к системе из двух дифференциальных уравнений первого порядка:<\/p>\n
\n \\begin{cases} \\dot{x_1} = x_2 \\\\ \\dot{x_2} = cu - bx_2 - asinx_1 \\quad (3)\\end{cases} \n <\/p>\n\n
Программная позиция для системы <\/h2> \n
Наша задача - обеспечить скорейшую остановку маятника в заданной позиции, т.е. перевести маятник в позицию \\( \\theta = \\delta \\), где скорость=0. Запишем это условие для фазовых координат<\/p>\n
\\( x_1 = \\delta, x_2 = \\dot{\\delta} = 0 \\) <\/p> \n
Итак, для системы (3) нас интересует позиция:<\/p>\n
\n \\begin{cases} \\dot{x_1} = \\delta \\\\ \\dot{x_2} = 0 \\quad (4) \\end{cases} \n <\/p> \n
Для того, чтобы к системе (3) можно было применят теоремы об асимтотической устойчивости нулевого положения равновесия, нам неоходимо перенести систему коордиинат в точку, где позиция \\( (\\delta, 0) \\) - это нуль.<\/p> \n \n
Переход к системе в отклонениях <\/h2> \n
Введём отклонения от программной позиции (4) в системе (3):<\/p>\n
\n \\begin{cases} y_1 = x_1 - \\delta \\\\ y_2 =x_2 - 0 \\end{cases} (5)\n \n \\begin{cases} x_1 = y_1 + \\delta \\\\ x_2 =y_2 \\end{cases} \n <\/p>\n \n
Подставим (5) в (3), тогда система в отклонениях примет вид: <\/p> \n
\n \\begin{cases} \\dot{y_1} = y_2 \\\\ \\dot{y_2} = cu - by_2 - asin\\left( y_1 + \\delta \\right) \\end{cases}\n <\/p> \n\n\n\n
Корректировка управляющего воздействия<\/h2>\n
Как правило, для эффективного управления динамическими системами одного программного управления \\( u^p \\) бывает недостаточно из-за неточностей в измерениях и влияния внешних источников, поэтому мы введём добавочное стабилизирующее управление \\( u^{st}\\) :<\/p>\n
\\( u = u^p + u^{st} \\)<\/p>\n \n
Тогда системе в отклонениях получим: <\/p>\n
\n \\begin{cases} \\dot{y_1} = y_2 \\\\ \\dot{y_2} = c\\left( u^p + u^{st} \\right) - by_2 - asin\\left( y_1 + \\delta \\right) \\end{cases}, или\n \\begin{cases} \\dot{y_1} = y_2 \\\\ \\dot{y_2} = c \\cdot \\frac{a}{c} sin\\delta\\ + c \\cdot u^{st} - by_2 - asin\\left( y_1 + \\delta \\right) \\end{cases}, что приводит к\n \\begin{cases} \\dot{y_1} = y_2 \\\\ \\dot{y_2} = asin\\delta\\ + cu^{st} - by_2 - asin\\left( y_1 + \\delta \\right) \\quad (6) \\end{cases}\n <\/p> \n \n
Линеаризация системы в отклонениях<\/h2> \n
Так как эффективнее всего теоремы об устойчивости работают для линейных систем, начнём с линеаризации системы (6).<\/p> \n
Разложжим \\( sin\\left( y_1 + \\delta \\right) \\) в окрестности нуля:<\/p> \n \n
\\( sin\\left( y_1 + \\delta \\right) \\sim y_1cos(\\delta) + sin\\delta \\)<\/p> \n
Подставляя данное разложение в (6), получим:<\/p> \n
\n \\begin{cases} \\dot{y_1} = y_2 \\\\ \\dot{y_2} = asin\\delta\\ + cu^{st} - by_2 - ay_1cos(\\delta) - asin\\delta \\end{cases}\n <\/p> \n
Таким образом, система (6) примет вид: <\/p>\n
\n \\begin{cases} \\dot{y_1} = y_2 \\\\ \\dot{y_2} = - acos(\\delta)y_1 - by_2 + cu^{st} \\quad (7) \\end{cases}\n <\/p> \n \n
Запишем систему (7) в векторно-матричном виде, чтобы с ней было бы удобнее работать: <\/p>\n\n
\n \\begin{matrix}\n \\dot y= { \\begin{pmatrix} 0 & 1 \\\\ - acos(\\delta) & -b \\end{pmatrix} } y + { \\begin{pmatrix} 0 \\\\ c \\end{pmatrix} } u^{st} \\quad (8) \n \\end{matrix} \n <\/p> \n \n \n
Найдём стабилизирующее управление \\(u^{st} \\) <\/h2> \n
Прежде всего, сделаем из системы (8) однородную систему. Для этого выберем \\(u^{st} \\) вида: <\/p>\n
\\( u^{st}= -Ky, \\quad K = (k_1, k_2) \\quad (9) \\)<\/p>\n
и подставив (9) в (8), получим чудесную линейную однородную систему дифуров: <\/p> \n
\n \\begin{matrix}\n \\dot y= { \\begin{pmatrix} 0 & 1 \\\\ - acos(\\delta)-сk_1 & -b-ck_2 \\end{pmatrix} } y \\quad (10) \n \\end{matrix} \n <\/p> \n
Стабилизиирующее управление \\(u^{st} \\) - это управление, которое стабилизирует систему. То есть обеспечивает асимтотическую устойчивость нулевого положения равновесия этой системы.<\/p>\n
В обычных условиях, система (10) сосвем не обязательно будет ас. устойчивой, но чтобы победить эту несправедливость мы и ввели управление \\(u^{st} \\) в виде \\( u^{st}= -Ky \\), подрегулировав значения \\(k_j \\) которого, мы добьёмся того, чтобы корни характеристического уравнения системы (10) были бы \"левыми\".<\/p> \n
Значения \\(k_j \\), кстати, называются коэфффицентами усиления.<\/p>\n \n
Итак, нам предстоит найти условия на основе \\(k_j \\), при которых собственные значения матрицы <\/p> \n
\n \\begin{matrix}\n { \\begin{pmatrix} 0 & 1 \\\\ - acos(\\delta)-сk_1 & -b-ck_2 \\end{pmatrix} } \\quad (11) \n \\end{matrix} \n <\/p> \n\n
были бы расположены в левой полуплоскости комплекной плоскости.<\/p> \n \n
Условия гурвицевости матрицы (11)<\/h3> \n
Чтобы не утруждаться поиском с.з. и с.в. матрицы (11), воспользуемся критерием асисмтотической устойчивости вида:<\/p> \n
\n \\begin{cases} trA < 0 \\\\ |A| > 0 \\end{cases} \n<\/p> \n
Откуда получим условия на \\(k_1 \\) и \\(k_2 \\) :<\/p> \n
\n \\begin{cases} k_2 > -\\frac{b}{c} < 0 \\\\ k_1 > \\frac{a}{c}cos(\\delta) \\end{cases} \n<\/p> \n\n
Итак, выбирая стабилизирующее упарвление в виде:<\/p> \n
\\(u^{st} = -k_1y_1 - k_2y_2 \\) <\/p> \n
мы добьёмся стабилизации линейной системы в отклонениях (7), что, в свою очередь будет значить схождение моделируемого движения маятника к программной позиции при решении задачи стабилизации положения равновесия, где управление будет складываться из программного и стабилизирующего управлений<\/p> \n
\\(u = u^p + u^{st} \\) <\/p> \n \n
Программная реализация<\/h2>\n
Приступим, наконец, к моделированию процесса стабилизации математического маятника в Scilab. Для этого нам понадобятся:<\/p>\n
\n- Система (3)<\/li>\n
- Управление (2)<\/li>\n
- Управление (12)<\/li>\n
- Замена (5)<\/li>\n<\/ul>\n
Сначала зададим параметры, фигурирующие в системе:<\/p> \n
\n\ng = 9.8;\n\nm = 2;\nk = 0.9;\nL = 3.5; \n\nb = k\/m;\na = g\/L;\nc = 1\/(m*L*L);\n<\/code><\/pre>\nПараметры математического маятника.<\/span>\n<\/div>\t \n \nДалее зададим программное положение \\(\\delta \\) и пaраметры стабилизирующего управления \\(k_j \\):<\/p> \n
\n\ndelta = %pi\/5; \n \nk1 = .1; \nk2 = 10;\n<\/code><\/pre>\nПрограммная позиция и коэффициенты усиления<\/span>\n<\/div>\t\n\nЗададим начальные условия, шаг дискретизации и отрезок интегрирования для решения системы ОДУ в Scilab:<\/p>\n
\n\nXo = [2.1; 0.5]; \/\/ Здесь первые два элемента - это н.у. (координата и скорость)\ntmax = 20;\nt0 = 0;\nt = 0:1e-2:tmax;\nX = ode(Xo, t0, t, systNelin);\n<\/code><\/pre>\nпараметры для решения системы дифуров в Scilab.<\/span>\n<\/div>\t \n \nИ, наконец, запишем функцию, которая отвечает за формирование системы дифуров, описывающих движение маятника с найденным управлением:<\/p>\n
\n\nfunction dx = systNelin(t, x)\n y(1) = x(1) + delta;\n y(2) = x(2);\n \n Up = a\/c * sin(delta); \n Ust = -k1*y(1) - k2*y(2);\n U = Up + Ust; \n \n dx(1) = x(2);\n dx(2) = c*U - b*x(2) - a*sin(x(1)); \nendfunction\n<\/code><\/pre>\n функциия системы ОДУ в Scilab.<\/span>\n<\/div>\t\nЭтого, в принципе, достаточно, чтобы получить статическую графическую интерпретацию решения нашей задачи.<\/p> \n
\n\nsubplot(121);\nxgrid();xtitle(\"Угол отклонения маятника\", \"$\\Large t$\", \"$\\Large \\theta$\");\nplot(t, t*0 + delta,'r--');\nplot(t, X(1,:),'b');\ngca().children.children(1).thickness = 2; \nlegend('$\\delta$','$\\theta$');\n\nsubplot(122);\nxgrid();xtitle(\"Скорость маятника\", \"$\\Large t$\", \"$\\Large \\dot\\theta$\");\nplot(t, t*0 + 0,'r--');\nplot(t, X(2,:),'b');\ngca().children.children(1).thickness = 2; \nlegend('$\\dot\\delta$','$\\dot\\theta$');\n<\/code><\/pre>\nвывод графиков с настройкой толщины в Scilab.<\/span>\n<\/div>\t \n \n[img:i3x75:tmp:alt=Координата и скорость маятника под действием управления, (к1, к2) = (0.1, 10)] \nПри этом, подправляя коэффициеты усиления, можно регулировать скорость сходимости.<\/p> \n[img:4rywjz:tmp:alt=Координата и скорость маятника под действием управления, (к1, к2) = (0.1, 50)] \n
При этом, без управления маятник будет бултыхаться довольно долго и остановится в устойчивом положении равновесия (0,0):<\/p>\n
\n\n...\n U = 0; \n...\n<\/code><\/pre>\nотключим управление в функции системы ОДУ<\/span>\n<\/div>\t \n[img:cr0f5s:tmp:alt=Координата и скорость маятника без управляющего воздейсвтия] \n\n\nСоздание анимации движения в Scilab<\/h2>\n
Пойдём дальше и приступим к реализации движущегося объекта.<\/p>\n \n
Для начала, повернём сетку координат на 90 градусов, чтобы маятник смотрела вниз :)<\/p>\n
\n\nX_r = X - %pi\/2;\ndelta_r = delta- %pi\/2;\n<\/code><\/pre>\nновые координаты.<\/span>\n<\/div>\t\n\nДобавим звёздочки на координатную сетку - начальное положение и программную позицию маятника<\/p>\n
\n\nplot(L*cos(X_r(1,1)), L*sin(X_r(1,1)), 'b*'); \nplot(L*cos(delta_r), L*sin(delta_r), 'r*'); \nlegend('начальное положение', \"программная позиция\");\nxtitle('Математический маятник');\nxgrid;\n<\/code><\/pre>\nначальное и конечное положения маятника<\/span>\n<\/div>\t \n \nИ изобразим маятник в исходном положении с помощью ломаной линии с координатами \\( (0, 0) - ( L*cos(X_r(1,1)), L*sin(X_r(1,1)) ) \\):<\/p>\n
\n\nx_ = [0; L*cos(X_r(1,1))];\ny_ = [0; L*sin(X_r(1,1))];\nxpoly(x_, y_, \"lines\", 0);\n<\/code><\/pre>\nрисуем прямую в Scilab.<\/span>\n<\/div>\t\n\nДалее отредактируем параметры элемента xpoly()<\/em>. Наличие соединений mark<\/em> имитирует груз на конце стержня маятника, mark_style = 9<\/em> говорит, что это кружочек, а mark_offset = 1<\/em> отвечает за смещение кружочка относительно линии:<\/p>\n\n\npendulum = gce(); \npendulum.foreground = 1;\npendulum.thickness = 2;\npendulum.mark_style = 9; \npendulum.mark_offset = 1;\n<\/code><\/pre>\nрисуем прямую в Scilab.<\/span>\n<\/div>\t\n\n[img:esaaem:tmp:alt=Прямая с кружочком]\n\nПриступим к имитации движения маятника. Его траектория - это решени системы ОДУ, т.е. элементы матрицы X_r<\/em>. В первой строке этой матрицы содержится координата маятника \\( X_1 = \\theta \\) в момент времени \\( i \\), а во второй строке - скорость маятника \\( X_2 = \\dot\\theta \\) в этот момент времени. Нам нужна координата для изменения позиции палочки с кружком, причём, центр маятника так и будет оставаться в положении \\( (0,0) \\), двигаться же будет его не закреплённый конец:<\/p>\n\n\ni = 1;\nwhile i<=length(t) \n drawlater(); \n sca(pendulum_axes); \n x_ = [0; L*cos(X_r(1,i))];\n y_ = [0; L*sin(X_r(1,i))]; \n pendulum.data = [x_, y_]; \n drawnow(); \n i = i + 12;\nend\n<\/code><\/pre>\nАнимация движения маятника в Scilab. Рисуется каждая 12 точка - это имитация sleep()<\/span>\n<\/div>\t\n\nПод действием выбранного управления, маятник быстренько стабилизируется и не бултыхается безумно:<\/p>\t\n
\n
<\/picture>\nСтабилизация маятника с управлением<\/span>\n<\/div>\n \nЕсли же в теле функции systNelin()<\/em> исключить найденное управление из процеса стабилизации маятника, получим поведения объекта под действием на него исходных внешних сил:<\/p>\t\n\n
<\/picture>\nСтандартное поведение маятника<\/span>\n<\/div>\n\n \n\n","block_content_preview":"На примере простой механической системы посмотрим, как \"оживить\" картинки в Scilab без дополнительных плагинов и без использования comet().\nБудем","common_preview":"Стабилизация программной позиции маятника путём линеаризации уравнений в","common_image":"210527-122004-fb9c8c8cf93911398183ff8a73277a31-png","readtime":1,"isCurrentPage":false},{"id":"1653645886","h1":"Настройка линейного классификатора Scilab","title":"Основной принципа машинного обучения на простом примере Scilab","description":"Основной принципа машинного обучения на простом примере Scilab","url":"nastroyka-lineynogo-klassifikatora-scilab","link":"\/articles\/nastroyka-lineynogo-klassifikatora-scilab","views":"2220","commentCounter":0,"likeCounter":0,"tag_isset":true,"tag_url":"profi","tag_list":[{"url":"profi","name":"Scilab для продвинутых"}],"date_edit":"2022-05-27 20:58:33","date_create":"2022-05-27 17:37:53","date_ddmmyy":"27 мая 2022","date_after":"давным-давно","date_user":null,"block_image_type":"image","block_image_content":"220527-180050-ab288c2e06e54f3246ec6e1ba11993b9-png","block_image_image":"220527-180050-ab288c2e06e54f3246ec6e1ba11993b9-png","block_text_type":"text","block_text_content":"Обучение линейного классификатора на эталонной выборке с целью правильно классифицировать жуков, относя их к гусеницам или божьим коровкам","block_text_preview":"Обучение линейного классификатора на эталонной выборке с целью правильно классифицировать жуков, относя их к гусеницам или божьим","block_content_type":"text","block_content_content":"\nРассмотрим задачу классификации данных на примере разделения садовых жуков.<\/p>\n
Будем рассматривать гусениц и божьих коровок, разделяя их в зависимости от размера.<\/p>\n\n
\n