\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":"2423","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":"2612","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":"5499","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