{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Système linéaire implicite et explicite Max-Plus\n", "\n", "\n", "Tout comme la boîte à outils Scilab, une structure Max-Plus pour Julia est proposée afin de manipuler des systèmes dynamiques linéaires implicites sous la forme suivante :\n", "\n", "$$\\left \\{ \\begin{array}{l}\n", "X(n) &= D X(n) \\oplus A X(n-1) \\oplus B U(n) \\\\\n", "Y(n) &= C X(n)\n", "\\end{array} \\right.$$\n", "\n", "Avec $x(0) = x_0$ connu. Le quintuplé $(A,B,C,D,x_0)$ est manipulé par la structure `MPSysLin`. Le ⊗ est implicite pour plus de lisibilité. Ce document fait suite à [l'introduction de la boîte à outil Julia pour l'algèbre Max-Plus](https://nbviewer.jupyter.org/github/Lecrapouille/MaxPlus.jl/blob/master/tutorial/core-fr.ipynb) et nous verrons comment manipuler cette structure qui sera utilisée sur un problème concret dans le [document suivant](https://nbviewer.jupyter.org/github/Lecrapouille/MaxPlus.jl/blob/master/tutorial/flowshop-fr.ipynb)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Prérequis\n", "\n", "Si ce n'est pas déjà fait, chargeons la boîte à outils Max-Plus. Pour rappel, le document précédent explique plus longuement comment faire. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [], "source": [ "push!(LOAD_PATH, pwd())\n", "using MaxPlus, SparseArrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Toujours pour des soucis d'appel à fonction `Base.show` depuis un document Jupyter, nous forçons l'affichage en mode plein :" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "Base.show(io::IO, ::MIME\"text/latex\", x::MP) = show(io, MIME\"text/plain\", x)\n", "Base.show(io::IO, ::MIME\"text/latex\", A::MPAbstractVecOrMat) = show(io, MIME\"text/plain\", A)\n", "Base.show(io::IO, ::MIME\"text/latex\", S::MPSysLin) = show(io, MIME\"text/plain\", S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Construction d'un système linéaire implicite Max-Plus\n", "\n", "Créons notre premier système linéaire Max-Plus implicite grâce aux constructeurs de la structure Julia associés `MPSysLin(A, B, C [,D, x0])` :\n", "\n", "$$S_1=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . \\\\\n", ". & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 \\\\\n", "3 & 4 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$$\n", "\n", "La matrice $D$ et le vecteur $x_0$ sont optionnels. S'ils ne sont pas donnés ils seront automatiquement créés et remplis de $\\varepsilon$." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 (max,+) sparse matrix with 2 stored entries:\n", " [1, 1] = 0\n", " [2, 2] = 0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "speye(MP,2,2)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Implicit dynamic linear Max-Plus system:\n", " x(n) = D*x(n) + A*x(n-1) + B*u(n)\n", " y(n) = C*x(n)\n", " x(0) = x0\n", "\n", "with:\n", "D = 2×2 (max,+) dense matrix:\n", " 0 .\n", " . 0\n", "\n", "A = 2×2 (max,+) dense matrix:\n", " 1 2\n", " 3 4\n", "\n", "B = 2-element (max,+) vector:\n", " 0\n", " 0\n", "\n", "C = 1×2 (max,+) dense matrix:\n", " 0 0\n", "\n", "x0 = 2×1 (max,+) dense matrix:\n", " .\n", " .\n" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S1 = MPSysLin(MP([1 2; 3 4]), # A\n", " MP([0;0]), # B\n", " MP([0 0]), # C\n", " speye(MP,2,2), # D (optionel)\n", " spzeros(MP,2,1)) # x0 (optionel)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Et le deuxième système implicite :\n", "\n", "$$S_2=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & . \\\\\n", ". & 0 & . \\\\\n", ". & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & 3 \\\\\n", "4 & 5 & 6 \\\\\n", "7 & 8 & 9 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$$" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Implicit dynamic linear Max-Plus system:\n", " x(n) = D*x(n) + A*x(n-1) + B*u(n)\n", " y(n) = C*x(n)\n", " x(0) = x0\n", "\n", "with:\n", "D = 3×3 (max,+) dense matrix:\n", " 0 . .\n", " . 0 .\n", " . . 0\n", "\n", "A = 3×3 (max,+) dense matrix:\n", " 1 2 3\n", " 4 5 6\n", " 7 8 9\n", "\n", "B = 3-element (max,+) vector:\n", " 0\n", " 0\n", " 0\n", "\n", "C = 1×3 (max,+) dense matrix:\n", " 0 0 0\n", "\n", "x0 = 3×1 (max,+) dense matrix:\n", " .\n", " .\n", " .\n" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S2 = MPSysLin(MP([1 2 3; 4 5 6; 7 8 9]), # A\n", " MP([0;0;0]), # B\n", " MP([0 0 0]), # C\n", " eye(MP,3,3)) # D\n", " # x0 to zeros vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accès aux matrices\n", "\n", "Ce fait directement par les champs .D .A .B .C .x0" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 (max,+) sparse matrix with 2 stored entries:\n", " [1, 1] = 0\n", " [2, 2] = 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S1.D" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×2 (max,+) dense matrix:\n", " 1 2\n", " 3 4\n" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S1.A" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element (max,+) vector:\n", " 0\n", " 0\n" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S1.B" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1×2 (max,+) dense matrix:\n", " 0 0\n" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S1.C" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×1 (max,+) sparse matrix with 0 stored entries" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S1.x0" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2×1 (max,+) dense matrix:\n", " .\n", " .\n" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full(S1.x0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Affichage de systèmes implicites Max-Plus\n", "\n", "### Affichage sortie standard" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Implicit dynamic linear Max-Plus system:\n", " x(n) = D*x(n) + A*x(n-1) + B*u(n)\n", " y(n) = C*x(n)\n", " x(0) = x0\n", "\n", "with:\n", "D = 2×2 (max,+) dense matrix:\n", " 0 .\n", " . 0\n", "\n", "A = 2×2 (max,+) dense matrix:\n", " 1 2\n", " 3 4\n", "\n", "B = 2-element (max,+) vector:\n", " 0\n", " 0\n", "\n", "C = 1×2 (max,+) dense matrix:\n", " 0 0\n", "\n", "x0 = 2×1 (max,+) dense matrix:\n", " .\n", " .\n" ] } ], "source": [ "tropshow(stdout, S1)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Implicit dynamic linear Max-Plus system:\n", " x(n) = D*x(n) + A*x(n-1) + B*u(n)\n", " y(n) = C*x(n)\n", " x(0) = x0\n", "\n", "with:\n", "D = 2×2 (max,+) dense matrix:\n", " 0 .\n", " . 0\n", "\n", "A = 2×2 (max,+) dense matrix:\n", " 1 2\n", " 3 4\n", "\n", "B = 2-element (max,+) vector:\n", " 0\n", " 0\n", "\n", "C = 1×2 (max,+) dense matrix:\n", " 0 0\n", "\n", "x0 = 2×1 (max,+) dense matrix:\n", " .\n", " .\n" ] } ], "source": [ "show(stdout, \"text/plain\", S1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Affichage de systèmes implicites Max-Plus en $\\LaTeX$\n", "\n", "Comme l'affichage précédent n'est pas le plus amicale, on peut améliorer ça en générant du code $\\LaTeX$ soit avec la fonction `LaTeX` (et si l'on ne passe pas l'argument `IO` alors une chaîne de caractère sera retournée) soit via la fonction `Base.show` en passant l'argument `::MIME\"text/latex\"` :" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . \\\\\\\\\\n. & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 \\\\\\\\\\n3 & 4 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_{n-1} \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 \\\\\\\\\\n0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\"" ] } ], "source": [ "LaTeX(stdout, S1) # show(stdout, \"text/latex\", S1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ce qui donnera une fois compilée :\n", "$$\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . \\\\\n", ". & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 \\\\\n", "3 & 4 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour la suite de ce document Jupyter, on va se créer une fonction qui forcera l'affichage LaTeX :" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "latexify (generic function with 2 methods)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "using LaTeXStrings\n", "\n", "latexify(S1, name=\"S\") = latexstring(name, \"=\", LaTeX(S1))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . \\\\\n", ". & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 \\\\\n", "3 & 4 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "L\"$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . \\\\\n", ". & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 \\\\\n", "3 & 4 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$\"" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "latexify(S1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Composition de systèmes implicites Max-Plus\n", "\n", "Tout comme Scilab, Julia permet de surcharger des opérateurs de base, que l'on utilisera pour composer des systèmes linéaires." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Composition parallèle" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & . & . & . \\\\\n", ". & 0 & . & . & . \\\\\n", ". & . & 0 & . & . \\\\\n", ". & . & . & 0 & . \\\\\n", ". & . & . & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & . & . & . \\\\\n", "3 & 4 & . & . & . \\\\\n", ". & . & 1 & 2 & 3 \\\\\n", ". & . & 4 & 5 & 6 \\\\\n", ". & . & 7 & 8 & 9 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 & 0 & 0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "\"\\$S=\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . & . & . & . \\\\\\\\\\n. & 0 & . & . & . \\\\\\\\\\n. & . & 0 & . & . \\\\\\\\\\n. & . & . & 0 & . \\\\\\\\\\n. & . & . & . & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 & . & . & . \\\\\\\\\\n3 & 4 & . & . & \" ⋯ 105 bytes ⋯ \"left[\\n\\\\begin{array}{*{20}c}\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & 0 & 0 & 0 & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\\$\"" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = S1 + S2; latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Composition diagonale" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & . & . & . \\\\\n", ". & 0 & . & . & . \\\\\n", ". & . & 0 & . & . \\\\\n", ". & . & . & 0 & . \\\\\n", ". & . & . & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & . & . & . \\\\\n", "3 & 4 & . & . & . \\\\\n", ". & . & 1 & 2 & 3 \\\\\n", ". & . & 4 & 5 & 6 \\\\\n", ". & . & 7 & 8 & 9 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . \\\\\n", "0 & . \\\\\n", ". & 0 \\\\\n", ". & 0 \\\\\n", ". & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 & . & . & . \\\\\n", ". & . & 0 & 0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "\"\\$S=\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . & . & . & . \\\\\\\\\\n. & 0 & . & . & . \\\\\\\\\\n. & . & 0 & . & . \\\\\\\\\\n. & . & . & 0 & . \\\\\\\\\\n. & . & . & . & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 & . & . & . \\\\\\\\\\n3 & 4 & . & . & \" ⋯ 146 bytes ⋯ \". \\\\\\\\\\n. & 0 \\\\\\\\\\n. & 0 \\\\\\\\\\n. & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & 0 & . & . & . \\\\\\\\\\n. & . & 0 & 0 & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\\$\"" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = S1 | S2; latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Composition en série" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & . & . & . \\\\\n", ". & 0 & . & . & . \\\\\n", ". & . & 0 & . & . \\\\\n", "0 & 0 & 0 & 0 & . \\\\\n", "0 & 0 & 0 & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & 3 & . & . \\\\\n", "4 & 5 & 6 & . & . \\\\\n", "7 & 8 & 9 & . & . \\\\\n", ". & . & . & 1 & 2 \\\\\n", ". & . & . & 3 & 4 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". & . & . & 0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "\"\\$S=\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . & . & . & . \\\\\\\\\\n. & 0 & . & . & . \\\\\\\\\\n. & . & 0 & . & . \\\\\\\\\\n0 & 0 & 0 & 0 & . \\\\\\\\\\n0 & 0 & 0 & . & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 & 3 & . & . \\\\\\\\\\n4 & 5 & 6 & . & \" ⋯ 105 bytes ⋯ \"left[\\n\\\\begin{array}{*{20}c}\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. & . & . & 0 & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\\$\"" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = S1 * S2; latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Entrées communes" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & . & . & . \\\\\n", ". & 0 & . & . & . \\\\\n", ". & . & 0 & . & . \\\\\n", ". & . & . & 0 & . \\\\\n", ". & . & . & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & . & . & . \\\\\n", "3 & 4 & . & . & . \\\\\n", ". & . & 1 & 2 & 3 \\\\\n", ". & . & 4 & 5 & 6 \\\\\n", ". & . & 7 & 8 & 9 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . \\\\\n", "0 & . \\\\\n", ". & 0 \\\\\n", ". & 0 \\\\\n", ". & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 & 0 & 0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "\"\\$S=\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . & . & . & . \\\\\\\\\\n. & 0 & . & . & . \\\\\\\\\\n. & . & 0 & . & . \\\\\\\\\\n. & . & . & 0 & . \\\\\\\\\\n. & . & . & . & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 & . & . & . \\\\\\\\\\n3 & 4 & . & . & \" ⋯ 125 bytes ⋯ \"*{20}c}\\n0 & . \\\\\\\\\\n0 & . \\\\\\\\\\n. & 0 \\\\\\\\\\n. & 0 \\\\\\\\\\n. & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & 0 & 0 & 0 & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\\$\"" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = [S1 S2]; latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Sorties communes" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & . & . & . \\\\\n", ". & 0 & . & . & . \\\\\n", ". & . & 0 & . & . \\\\\n", ". & . & . & 0 & . \\\\\n", ". & . & . & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & . & . & . \\\\\n", "3 & 4 & . & . & . \\\\\n", ". & . & 1 & 2 & 3 \\\\\n", ". & . & 4 & 5 & 6 \\\\\n", ". & . & 7 & 8 & 9 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "0 \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 & . & . & . \\\\\n", ". & . & 0 & 0 & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "\"\\$S=\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . & . & . & . \\\\\\\\\\n. & 0 & . & . & . \\\\\\\\\\n. & . & 0 & . & . \\\\\\\\\\n. & . & . & 0 & . \\\\\\\\\\n. & . & . & . & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 & . & . & . \\\\\\\\\\n3 & 4 & . & . & \" ⋯ 126 bytes ⋯ \"{20}c}\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & 0 & . & . & . \\\\\\\\\\n. & . & 0 & 0 & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\\$\"" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = [S1; S2]; latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Composition avec retro-action" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$S=\\left\\{\\begin{array}{lcl}\n", "x_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & . & 0 & 0 & 0 \\\\\n", ". & 0 & 0 & 0 & 0 \\\\\n", "0 & 0 & 0 & . & . \\\\\n", "0 & 0 & . & 0 & . \\\\\n", "0 & 0 & . & . & 0 \\\\\n", "\\end{array}\n", "\\right]\n", " x_n \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "1 & 2 & . & . & . \\\\\n", "3 & 4 & . & . & . \\\\\n", ". & . & 1 & 2 & 3 \\\\\n", ". & . & 4 & 5 & 6 \\\\\n", ". & . & 7 & 8 & 9 \\\\\n", "\\end{array}\n", "\\right]\n", " x_{n-1} \\oplus \\left[\n", "\\begin{array}{*{20}c}\n", "0 \\\\\n", "0 \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", " u_n\\\\ y_n & = & \\left[\n", "\\begin{array}{*{20}c}\n", "0 & 0 & . & . & . \\\\\n", "\\end{array}\n", "\\right]\n", " x_n\\\\ x_0 & = & \\left[\n", "\\begin{array}{*{20}c}\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", ". \\\\\n", "\\end{array}\n", "\\right]\n", "\\end{array}\\right.$" ], "text/plain": [ "\"\\$S=\\\\left\\\\{\\\\begin{array}{lcl}\\nx_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & . & 0 & 0 & 0 \\\\\\\\\\n. & 0 & 0 & 0 & 0 \\\\\\\\\\n0 & 0 & 0 & . & . \\\\\\\\\\n0 & 0 & . & 0 & . \\\\\\\\\\n0 & 0 & . & . & 0 \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n \\\\oplus \\\\left[\\n\\\\begin{array}{*{20}c}\\n1 & 2 & . & . & . \\\\\\\\\\n3 & 4 & . & . & \" ⋯ 105 bytes ⋯ \"left[\\n\\\\begin{array}{*{20}c}\\n0 \\\\\\\\\\n0 \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n u_n\\\\\\\\ y_n & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n0 & 0 & . & . & . \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n x_n\\\\\\\\ x_0 & = & \\\\left[\\n\\\\begin{array}{*{20}c}\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n. \\\\\\\\\\n\\\\end{array}\\n\\\\right]\\n\\\\end{array}\\\\right.\\$\"" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "S = S1 / S2; latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conversion système implicte Max-Plus vers système explicite Max-Plus" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# TODO S = mpexplicit(S1); latexify(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simulation de système linéaire Max-Plus\n", "\n", "La fonction `mpsimul` permet de retourner les états $X(n)$ (ou bien le dernier état) d'un système linéaire Max-Plus en injectant des données $U(n)$ Max-Plus sous la forme d'un vecteur." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9×1 (max,+) dense matrix:\n", " 1\n", " 5\n", " 9\n", " 13\n", " 17\n", " 21\n", " 25\n", " 29\n", " 33\n" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u = Vector(MP(1:0.5:5))\n", "y = mpsimul(S, u, true) # Retourne l'historiques des états" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1-element (max,+) vector:\n", " 33\n" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mpsimul(S, u, false) # Retourne le dernier état calculé" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut ploter le résultat directement les nombres Max-Plus." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "using Plots" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot(u, y, label=[\"simulation\"], legend=:topleft)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Autre exemple, système avec des entrées communes :" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9×1 (max,+) dense matrix:\n", " 1\n", " 10\n", " 19\n", " 28\n", " 37\n", " 46\n", " 55\n", " 64\n", " 73\n" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u = [MP(1:0.5:5) MP(1:0.5:5)]\n", "y = mpsimul([S1 S2], u, true)" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.8.1", "language": "julia", "name": "julia-1.8" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.8.1" } }, "nbformat": 4, "nbformat_minor": 2 }