{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Small induction motor example\n", "\n", "Illustrating basic functionality on a small induction motor example. The model equations are taken from the paper\n", "\n", "Aguilera, F., et al. \"_Current-sensor fault detection and isolation for induction-motor drives using a geometric approach._\", Control Engineering Practice 53 (2016): 35-46." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import faultdiagnosistoolbox as fdt\n", "import sympy as sym" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modelling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, define the model using the ``sympy`` symbolic toolbox in Python." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "model_def = {'type': 'Symbolic',\n", " 'x': ['i_a', 'i_b', 'lambda_a', 'lambda_b', 'w',\n", " 'di_a', 'di_b', 'dlambda_a', 'dlambda_b', 'dw', 'q_a', 'q_b', 'Tl'],\n", " 'f': ['f_a', 'f_b'], 'z': ['u_a', 'u_b', 'y1', 'y2', 'y3'],\n", " 'parameters': ['a', 'b', 'c', 'd', 'L_M', 'k', 'c_f', 'c_t']}\n", "\n", "i_a, i_b, lambda_a, lambda_b, w, di_a, di_b, dlambda_a, dlambda_b, dw, q_a, q_b, Tl = sym.symbols(model_def['x'])\n", "f_a, f_b = sym.symbols(model_def['f'])\n", "u_a, u_b, y1, y2, y3 = sym.symbols(model_def['z'])\n", "a, b, c, d, L_M, k, c_f, c_t = sym.symbols(model_def['parameters'])\n", "\n", "model_def['rels'] = [\n", " -q_a + w*lambda_a,\n", " -q_b + w*lambda_b, \n", " -di_a + -a*i_a + b*c*lambda_a + b*q_b + d*u_a,\n", " -di_b + -a*i_b + b*c*lambda_b + b*q_a + d*u_b,\n", " -dlambda_a + L_M*c*i_a - c*lambda_a-q_b, \n", " -dlambda_b + L_M*c*i_b - c*lambda_b-q_a, \n", " -dw + -k*c_f*w + k*c_t*(i_a*lambda_b - i_b*lambda_a) - k*Tl,\n", " fdt.DiffConstraint('di_a','i_a'),\n", " fdt.DiffConstraint('di_b','i_b'),\n", " fdt.DiffConstraint('dlambda_a','lambda_a'),\n", " fdt.DiffConstraint('dlambda_b','lambda_b'),\n", " fdt.DiffConstraint('dw','w'),\n", " -y1 + i_a + f_a,\n", " -y2 + i_b + f_b,\n", " -y3 + w]\n", "\n", "model = fdt.DiagnosisModel(model_def, name ='Induction motor')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Basic model information can be displayed using the `Lint` class method." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: Induction motor\n", "\n", " Type:Symbolic, dynamic\n", "\n", " Variables and equations\n", " 13 unknown variables\n", " 5 known variables\n", " 2 fault variables\n", " 15 equations, including 5 differential constraints\n", "\n", " Degree of redundancy: 2\n", " Degree of redundancy of MTES set: 1\n", "\n", "\n", " Model validation finished with 0 errors and 0 warnings.\n" ] } ], "source": [ "model.Lint()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To plot the structural model, use the `PlotModel` class method" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAHHCAYAAAB3K7g2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDkElEQVR4nO3de3gU9dn/8c8QSLJJSJRyMhogykGh7GJBubRVQKkhIihJxfpDGii1VUGKVKu0QgRb83goIh5Qez0SD20Vm4XHqqgo4PkAIi2Vk1BOyslaSUiAAMn398c2C0sIbDaTzM7k/bquvWZ3dnbmvnc2M3dmvvMdyxhjBAAA4BItnA4AAACgPiheAACAq1C8AAAAV6F4AQAArkLxAgAAXIXiBQAAuArFCwAAcBWKFwAA4CoULwAAwFUoXgBIkjZv3izLslRcXNzkyy4uLpZlWdq8eXOTLxuA+1C8AC5Us7Nfvny506HUyz333KMFCxY4HYYjXn31Vd11111OhwF4AsULgCZTV/EyevRo7d+/X507d276oJrIq6++qunTpzsdBuAJFC8AHJeQkKDk5GRZluV0KK5SXV2tAwcOOB0G0OQoXgCPGDNmjNLS0vTVV1/pqquuUlpamtq1a6dbb71VVVVVEdPu2bNHY8aMUUZGhk455RQVFBRoz549teY5cOBADRw48LjL6tKlS8S46upqPfTQQ+rdu7eSk5PVrl07DRkyJHxqy7IsVVRU6Omnn5ZlWbIsS2PGjJFUd5uXxx57TL169VJSUpIyMzM1fvz4WnEOHDhQ3/3ud7V69WoNGjRIKSkpOv3003XfffdF9b1ZlqUJEyboxRdfVM+ePeXz+XTBBRdo1apVkqQnnnhCXbt2VXJysgYOHHjcdjkvvvii+vbtK5/Pp7Zt2+q6667TV199FfF9Pfroo+Hl1TxqVFRU6Fe/+pWysrKUlJSkHj166IEHHpAx5rix/ulPfwp/L6+99lpUeQJe0tLpAADYp6qqSjk5Oerfv78eeOABvfnmm/rDH/6gs846SzfeeKMkyRijK6+8Uu+9955uuOEGnXPOOZo/f74KCgoatOxx48apuLhYubm5+tnPfqbDhw/r3Xff1UcffaR+/frp2Wef1c9+9jOdf/75+vnPfy5JOuuss+qc31133aXp06dr8ODBuvHGG7Vu3TrNmTNHy5Yt0/vvv69WrVqFp/322281ZMgQ5eXlaeTIkfrrX/+q22+/Xb1791Zubu5JY3/33Xf10ksvafz48ZKkoqIiXXHFFfr1r3+txx57TDfddJO+/fZb3XffffrpT3+qxYsXhz9bXFyssWPH6rzzzlNRUZF27dqlhx56SO+//74+++wznXLKKfrFL36h7du3a9GiRXr22Wcjlm2M0fDhw7VkyRKNGzdOffr00euvv67bbrtNX331lR588MGI6RcvXqx58+ZpwoQJatu2ba0iEmgWDADXmTt3rpFkli1bFh5XUFBgJJkZM2ZETHvuueeavn37hl8vWLDASDL33XdfeNzhw4fNRRddZCSZuXPnhscPGDDADBgwoNbyCwoKTOfOncOvFy9ebCSZiRMn1pq2uro6/Dw1NdUUFBTUmc+mTZuMMcbs3r3bJCYmmssuu8xUVVWFp3vkkUeMJPPUU09FxCjJPPPMM+FxlZWVpmPHjiY/P7/Wso4lySQlJYWXbYwxTzzxhJFkOnbsaMrKysLjp0yZEhHnwYMHTfv27c13v/tds3///vB0L7/8spFkpk2bFh43fvx4c7xNbs36+N3vfhcx/kc/+pGxLMts2LAhItYWLVqYzz///KR5AV7GaSPAY2644YaI1xdddJH+9a9/hV+/+uqratmyZfhIjBRqc3LzzTfHvMySkhJZlqXCwsJa78XSjuXNN9/UwYMHNWnSJLVocWQzdf311ys9PV2vvPJKxPRpaWm67rrrwq8TExN1/vnnR+R9IpdeemnEEYz+/ftLkvLz89W6deta42vmu3z5cu3evVs33XSTkpOTw9MNHTpUZ599dq04j+fVV19VQkKCJk6cGDH+V7/6lYwxWrhwYcT4AQMGqGfPnlHlBXgVxQvgITVtTY526qmn6ttvvw2/3rJli0477TSlpaVFTNejR4+Yl7tx40ZlZmaqTZs2Mc/jaFu2bDluTImJiTrzzDPD79c444wzahVJx+Z9Ip06dYp4nZGRIUnKyso67via+dYVpySdffbZteI8ni1btigzMzOiSJKkc845J2IZNbKzs086T8DrKF4AD0lISLB1fnUdNTm2AbDT6srbHNPgtb6fb+h8G4PP53Ns2UC8oHgBmpnOnTtrx44dKi8vjxi/bt26WtOeeuqpx70K6dijAWeddZa2b9+u//znPydcdrSnkGr6ezk2poMHD2rTpk1x0x9MXXHWjDs6zrpy79y5s7Zv3669e/dGjF+7dm3EMgAcQfECNDOXX365Dh8+rDlz5oTHVVVV6eGHH6417VlnnaW1a9fq66+/Do/7+9//rvfffz9iuvz8fBljjtsJ29FHKVJTU49bDB1r8ODBSkxM1OzZsyM+/7//+78qLS3V0KFDTzqPptCvXz+1b99ejz/+uCorK8PjFy5cqDVr1kTEmZqaKkm18r/88stVVVWlRx55JGL8gw8+KMuyorpaCmhuuFQaaGaGDRum73//+7rjjju0efNm9ezZU8FgUKWlpbWm/elPf6qZM2cqJydH48aN0+7du/X444+rV69eKisrC083aNAgjR49WrNnz9YXX3yhIUOGqLq6Wu+++64GDRqkCRMmSJL69u2rN998UzNnzlRmZqays7PDjWCP1q5dO02ZMkXTp0/XkCFDNHz4cK1bt06PPfaYzjvvvIjGuU5q1aqV7r33Xo0dO1YDBgzQtddeG75UukuXLrrlllvC0/bt21eSNHHiROXk5CghIUE//vGPNWzYMA0aNEi//e1vtXnzZgUCAb3xxhv6v//7P02aNOmEl5MDzZaTlzoBiE1dl0qnpqbWmrawsLDWJbrffPONGT16tElPTzcZGRlm9OjR5rPPPqt1qbQxxjz33HPmzDPPNImJiaZPnz7m9ddfr3WptDGhy63vv/9+c/bZZ5vExETTrl07k5ubaz799NPwNGvXrjUXX3yx8fl8RlL4suljL5Wu8cgjj5izzz7btGrVynTo0MHceOON5ttvv42YZsCAAaZXr1618j5ejMcjyYwfPz5i3KZNm4wkc//990eMX7JkiZFkXnzxxYjxL7zwgjn33HNNUlKSadOmjRk1apT58ssva30/N998s2nXrp2xLCtinezdu9fccsstJjMz07Rq1cp069bN3H///RGXmdcVK9AcWcY42PIMAACgnmjzAgAAXIXiBQAAuArFCwAAcBWKFwAA4CoULwAAwFUoXgAAgKt4vpO66upqbd++Xa1bt47p7rYAAKBpGGO0d+9eZWZmRtxR/lieL162b99e686wAAAgfm3btk1nnHFGne97vnipuc38tm3blJ6e7nA0AACgLmVlZcrKygrvu+vi+eKl5lRReno6xQsAAC5wsmYeNNgFAACuQvECAABcheIFAAC4CsULAABwFYoXAADgKq4oXh59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ulpFRUXKzs6Wz+dTIBDQX//61/D73377rUaNGqV27drJ5/OpW7dumjt3bgzfFAA7UbwAiFnLli31k5/8RMXFxTr6NmkvvviiqqqqdN1116lv37565ZVX9M9//lM///nPNXr0aH3yyScR83n66aeVmJio999/X48//vhxl9W6dWsVFxdr9erVeuihh/THP/5RDz74YMQ0GzZs0Lx58/S3v/1Nr732mj777DPddNNNdcZfVFSkZ555Ro8//rg+//xz3XLLLbruuuv09ttvS5KmTp2q1atXa+HChVqzZo3mzJmjtm3bxvp1AbCLwzeGBOBya9asMZLMkiVLwuMuuugic9111x13+qFDh5pf/epX4dcDBgww5557bq3pJJn58+fXudz777/f9O3bN/y6sLDQJCQkmC+//DI8buHChaZFixZmx44dxhhjCgoKzJVXXmmMMebAgQMmJSXFfPDBBxHzHTdunLn22muNMcYMGzbMjB07ts4YADijpdPFEwB3O/vss3XhhRfqqaee0sCBA7Vhwwa9++67mjFjhqqqqnTPPfdo3rx5+uqrr3Tw4EFVVlYqJSUlYh59+/Y96XJeeOEFzZ49Wxs3blR5ebkOHz6s9PT0iGk6deqk008/Pfz6ggsuUHV1tdatW6eOHTtGTLthwwbt27dPP/zhDyPGHzx4UOeee64k6cYbb1R+fr5WrFihyy67TFdddZUuvPDCen0/AOzHaSMADTZu3DiVlJRo7969mjt3rs466ywNGDBA999/vx566CHdfvvtWrJkiVauXKmcnJxwo9waqampJ5z/hx9+qFGjRunyyy/Xyy+/rM8++0y//e1va82nPsrLyyVJr7zyilauXBl+rF69OtzuJTc3V1u2bNEtt9yi7du369JLL9Wtt94a8zIB2IMjLwAabOTIkfrlL3+pP//5z3rmmWd04403yrIsvf/++7ryyit13XXXSQo1kF2/fr169uxZr/l/8MEH6ty5s37729+Gx23ZsqXWdFu3btX27duVmZkpSfroo4/UokUL9ejRo9a0PXv2VFJSkrZu3aoBAwbUuex27dqpoKBABQUFuuiii3TbbbfpgQceqFf8AOxF8QKgwdLS0nTNNddoypQpKisr05gxYyRJ3bp101//+ld98MEHOvXUUzVz5kzt2rWr3sVLt27dtHXrVj3//PM677zz9Morr2j+/Pm1pktOTlZBQYEeeOABlZWVaeLEiRo5cmStU0ZSqAHwrbfeqltuuUXV1dX6wQ9+oNLSUr3//vtKT09XQUGBpk2bpr59+6pXr16qrKzUyy+/rHPOOSem7wiAfThtBMAW48aN07fffqucnJzwkY8777xT3/ve95STk6OBAweqY8eOMfVwO3z4cN1yyy2aMGGC+vTpow8++EBTp06tNV3Xrl2Vl5enyy+/XJdddpn8fr8ee+yxOud79913a+rUqSoqKtI555yjIUOG6JVXXlF2drYkKTExUVOmTJHf79fFF1+shIQEPf/88/WOH4C9LGOOur4RAAAgznHkBQAAuArFCwAAcBWKFwAA4CoULwAAwFUoXgAAgKtQvAAAAFeheAEAAK5C8QIAAFyF4gUAALgKxQsAAHAVihcAAOAqFC8AAMBV/j+VBZGcTEAP5gAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_, ax = plt.subplots(num=10)\n", "model.PlotModel(ax=ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic Analysis\n", "A basic tool in structural analysis is the Dulmage-Mendelsohn decomposition. You can perform the decomposition directly using the function `fdt.dmperm.GetDMParts` och using the class method `GetDMParts`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DMResult(Mm=EqBlock(row=[], col=[]), M0=[EqBlock(row=array([6], dtype=int64), col=array([12], dtype=int64)), EqBlock(row=array([11], dtype=int64), col=array([9], dtype=int64))], Mp=EqBlock(row=array([ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14], dtype=int64), col=array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11], dtype=int64)), rowp=array([ 6, 11, 2, 3, 9, 10, 14, 7, 8, 4, 5, 0, 1, 12, 13],\n", " dtype=int64), colp=array([12, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11], dtype=int64), M0eqs=array([ 6, 11], dtype=int64), M0vars=array([12, 9], dtype=int64))\n", "DMResult(Mm=EqBlock(row=[], col=[]), M0=[EqBlock(row=array([6], dtype=int64), col=array([12], dtype=int64)), EqBlock(row=array([11], dtype=int64), col=array([9], dtype=int64))], Mp=EqBlock(row=array([ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14], dtype=int64), col=array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11], dtype=int64)), rowp=array([ 6, 11, 2, 3, 9, 10, 14, 7, 8, 4, 5, 0, 1, 12, 13],\n", " dtype=int64), colp=array([12, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11], dtype=int64), M0eqs=array([ 6, 11], dtype=int64), M0vars=array([12, 9], dtype=int64))\n" ] } ], "source": [ "dm = fdt.dmperm.GetDMParts(model.X)\n", "print(dm)\n", "dm = model.GetDMParts()\n", "print(dm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also visualize the decomposition using the `PlotDM` class method. It is also possible to do an extended Dulmage-Mendelsohn where equations are grouped in equivalence classes, see paper \n", "\n", "Krysander, M., Åslund, J., & Nyberg, M. (2007). \"_An efficient algorithm for finding minimal overconstrained subsystems for model-based diagnosis_\". IEEE Transactions on Systems, Man, and Cybernetics-Part A: Systems and Humans, 38(1), 197-206.\n", "\n", "for more details." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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ixcDMF/sLTMzExqNxvKc0WjEl19+iWHDhjk1QaLL3XHHGbz55gAcPapDSkq5pO994cIFrFq1CgDw6KOPIiAgQNL3J/IEdhWeo0ePAjDv8Xz99dedfnQBAQEYOnQolixZ4twMiS6j0zVDq21FZaVW8vdubW3Fk08+CQBYunQpCw+RA+wqPO292ebMmYOcnByer0OyCQxsQ1OTw+c/E5GMHPrlbtiwwdl5ENmludkPISGNcqdBRA5w+F/Gw4cPY9u2bSgvL+8yPPy//vWvq06MyJra2kAYDP6IijLInQoROcChXm1btmzB6NGj8e2332L79u1obW3FN998g3379iEkJMTZORJ1UlBwLQBg+PCzMmdCRI5wqPCsWrUKL774Ij788EMEBAQgJycH3333HWbMmIHY2Fhn50hkcexYKLZsuREREQaMG3dG7nSIyAEONbX98MMPmDRpEgBzbzaDwQBBELBo0SL8+te/tvT6IboaR46E4/TpXjAaBZw/r8JXX4WiuDgMYWFNyMw8jIAAaU8eJSLncKjw9O7dG/X15uFKrr32WpSUlGDw4ME4f/48Ght5wJec4623bgIA+Pm1j9VWjwcf/EbWsdoCAwNx6NAhy30isp9DhedXv/oVdu/ejcGDB2P69OlYuHAh9u3bh927d2P8+PHOzpG8THLyaSQnn5Y7jW75+vpi5MiRcqchqdmzzRORszhUeNauXYvm5mYAwGOPPQZ/f3989tlnuOeee/D44487NUEiIvIsDhWe9ssjAOZBEx955BGnJUTkzi5cuICcnBwAwMKFCzlyAZEDBFEURXtfVF5ue3wsd+rZptfrERISgrq6Oo8YacFgAHr1Mt9vaAC00o8aowh5eXkuWW5zczOmT58OwDworpYfALkRa9sHd9sOOrTHc/3113c7OnU7XhaBiIiscajwtA8W2q61tRVHjx7FCy+8gGeffdYpiRERkWdyqPAMHTq0y7ykpCRER0fjueeew913333ViRERkWdyaOQCa2666SYUFhY6c5FERORhHNrj0ev1nR6LoojKyko88cQTiI+Pd0piRETkmRwqPNdcc02XzgWiKCImJgZbtmxxSmJEROSZHCo87ReEa+fj44OwsDD0798ffn68OBd5Ln9/f6xatQq33norh8whcpBDVWLs2LHOzqNbRqMRTzzxBDZv3oyqqipER0dj9uzZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_, ax = plt.subplots(num=23)\n", "model.PlotDM(fault=True, eqclass=True, ax=ax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Isolability Analysis\n", "\n", "Isolability properties of the model can be computed using the `IsolabilityAnalysis` method." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Mixed causality')" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAosAAADwCAYAAABokC48AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAuD0lEQVR4nO3de1RU9d7H8c+ACsgdxAvCEUXT1CyjU96hi1GJR8l7PSr2ZLZMzSwr63iBLi7rMUM7VupJPWqlkqVZahezOpmmld2sDpGKhnoSFbwr8Hv+YDE5wuYWAwPzfq01S2dm79m/+e39mfnOvvywGWOMAAAAgBJ41HQDAAAA4LooFgEAAGCJYhEAAACWKBYBAABgiWIRAAAAligWAQAAYIliEQAAAJYoFgEAAGCJYhEAAACWKBYraMmSJbLZbNq7d2+1L3vLli2y2WzasmVLtS+7tktKSlJUVJTDYzabTTNmzKiR9qB2iYuLU1xcXE03w+lK+owpKTuoXWrqsy4qKkpJSUnVvtzqVlJdUNc+M2ptsVi0copu3t7eCg8PV3x8vObOnasTJ07UdBMrbf78+VqyZElNN8PtbN26VTNmzNDx48druikuryh/O3furPC8p0+f1owZM/jRU0ux/mrGxd95//73v4s9b4xRZGSkbDabEhISaqCFKE1WVpZmzJihXbt21XRTKqVeTTfgz0pJSVHLli114cIFHTp0SFu2bNHEiRP13HPPad26derUqVOVLm/48OEaOnSovLy8qvR1LzZ//nw1atSo2C+yXr166cyZM2rQoIHTlu1Ozpw5o3r1/ojA1q1blZycrKSkJAUFBdVcw+q406dPKzk5WZLq1C/vumrhwoUqKCiw32f91Sxvb2+9+uqr6tGjh8PjH3/8sQ4cOFDid9Oln3Vwvvfee8/hflZWlpKTkxUVFaWrrrqqZhr1J9T6refWW2/VNddcY78/ZcoUbd68WQkJCfrb3/6mH3/8UT4+Pn96OadOnZKvr688PT3l6en5p1+vMjw8POTt7V0jy66L6Ev3ZIzR2bNnq+RzwR3Ur1+/ppuAi9x2221avXq15s6d61AAvvrqq4qJidGRI0eKzcNnXfWrazt1au1h6NLccMMNmjp1qvbt26fly5c7PPfTTz9p4MCBCgkJkbe3t6655hqtW7fOYZqi3f0ff/yxxo4dq8aNGysiIsLhuaJzExISEtSqVasS29G1a1eHQnbx4sW64YYb1LhxY3l5eal9+/Z68cUXHeaJiorSDz/8oI8//th+yKHo1/ul5xONGzdOfn5+On36dLFlDxs2TE2bNlV+fr79sQ0bNqhnz57y9fWVv7+/+vTpox9++KHsDpV0/PhxPfDAA4qKipKXl5ciIiI0YsQI+wfT+fPnNW3aNMXExCgwMFC+vr7q2bOnPvroI4fXsTrvcu/evbLZbA6H3w8dOqRRo0YpIiJCXl5eatasmfr16+dwXsjatWvVp08fhYeHy8vLS9HR0XriiScc3reVi8/jmTFjhiZPnixJatmypb3v9+7dq9jYWF155ZUlvkbbtm0VHx9f5rLcQVJSkvz8/PTbb7+pf//+8vPzU1hYmB566CH7+ti7d6/CwsIkScnJyfZ+vvh8qvJkVJK+/fZbxcbGysfHRxEREXryySe1ePHiYucORUVFKSEhQZs2bdI111wjHx8fvfzyy5LKl8mKWr58ua699lo1bNhQwcHB6tWrl8NehvJus1bne5V0LtS8efPUoUMH+zKvueYavfrqq/bn9+3bp7Fjx6pt27by8fFRaGioBg0aVK5zry8+Z7G09VfU919//XWx13j66afl6emp3377rczloXTDhg1Tdna23n//fftj58+fV1pamu64444S57k4Y2fOnFG7du3Url07nTlzxj7N0aNH1axZM3Xr1s2+LRYUFOj5559Xhw4d5O3trSZNmmjMmDE6duyYw+sbY/Tkk08qIiJCDRs21PXXX1/u75ai5aSmpuqKK66Qt7e3wsLCdMsttzic5lLerFqdn3lpni5cuKDk5GS1adNG3t7eCg0NVY8ePRz69dtvv1VSUpJatWolb29vNW3aVHfddZeys7PLfE8X53TLli3661//KkkaNWqUPTdLlizR9OnTVb9+ff3+++/FXuOee+5RUFCQzp49W+bynK1OFotS4eFiyXFX8A8//KAuXbroxx9/1KOPPqrZs2fL19dX/fv315tvvlnsNcaOHavdu3dr2rRpevTRR0tczpAhQ7Rnzx7t2LHD4fF9+/Zp27ZtGjp0qP2xF198US1atNBjjz2m2bNnKzIyUmPHjtU//vEP+zTPP/+8IiIi1K5dOy1btkzLli3T448/brnsU6dO6Z133nF4/PTp03r77bc1cOBA+17QZcuWqU+fPvLz89OsWbM0depU7d69Wz169CjzC+PkyZPq2bOn5s2bp5tvvlmpqam699579dNPP+nAgQOSpNzcXC1atEhxcXGaNWuWZsyYod9//13x8fGVPkdjwIABevPNNzVq1CjNnz9fEyZM0IkTJ5SZmWmfZsmSJfLz89OkSZOUmpqqmJiYUteXldtvv13Dhg2TJM2ZM8fe92FhYRo+fLi+/fZbff/99w7z7NixQ//5z3/0P//zP5V6f3VRfn6+4uPjFRoaqv/7v/9TbGysZs+erQULFkiSwsLC7B/wiYmJ9n6+/fbbJZU/o7/99pv9C2nKlCl64IEHtGLFCqWmppbYrp9//lnDhg1T7969lZqaaj8MVJ5MVkRycrKGDx+u+vXrKyUlRcnJyYqMjNTmzZvt01TVNltk4cKFmjBhgtq3b6/nn39eycnJuuqqq7R9+3b7NDt27NDWrVs1dOhQzZ07V/fee68+/PBDxcXFlfhj00pp62/gwIHy8fHRihUris23YsUKxcXFqXnz5pV6j/hDVFSUunbtqtdee83+2IYNG5STk+PwfWPFx8dHS5cu1S+//OLw3XLfffcpJydHS5YssX9vjBkzRpMnT1b37t2VmpqqUaNGacWKFYqPj9eFCxfs806bNk1Tp07VlVdeqWeffVatWrXSzTffrFOnTpXrPf3v//6vJk6cqMjISM2aNUuPPvqovL29tW3bNvs0VZ3VGTNmKDk5Wddff71eeOEFPf744/rLX/6ir776yj7N+++/r19//VWjRo3SvHnzNHToUL3++uu67bbbZIwp97Iuv/xypaSkSCosAIty06tXLw0fPlx5eXlauXKlwzxFPwAGDBjgGnuGTS21ePFiI8ns2LHDcprAwEDTuXNn+/0bb7zRXHHFFebs2bP2xwoKCky3bt1MmzZtir12jx49TF5eXonL3bNnjzHGmJycHOPl5WUefPBBh+meeeYZY7PZzL59++yPnT59ulgb4+PjTatWrRwe69Chg4mNjS027UcffWQkmY8++sje9ubNm5sBAwY4TLdq1SojyXzyySfGGGNOnDhhgoKCzOjRox2mO3TokAkMDCz2+KWmTZtmJJk1a9YUe66goMAYY0xeXp45d+6cw3PHjh0zTZo0MXfddZfleyiyZ88eI8ksXrzYPq8k8+yzz5batpL6dMyYMaZhw4YO63nkyJGmRYsWDtNJMtOnT7fff/bZZx3WbZHjx48bb29v88gjjzg8PmHCBOPr62tOnjxZahvropLyN3LkSCPJpKSkOEzbuXNnExMTY7//+++/F+v7IuXN6Pjx443NZjNff/21/bHs7GwTEhJSbB22aNHCSDIbN24strzyZjI2NrbETF4sPT3deHh4mMTERJOfn+/wXFFOrJZZ0jbbokULM3LkyGLTXtqWfv36mQ4dOpTatpKW+fnnnxtJ5l//+pf9sZLyeWl2Slt/w4YNM+Hh4Q7v/6uvvnLINirn4sy98MILxt/f375eBw0aZK6//npjTOF206dPH4d5S1pfU6ZMMR4eHuaTTz4xq1evNpLM888/b3/+008/NZLMihUrHObbuHGjw+P//e9/TYMGDUyfPn0ctvPHHnvMSCpxG77Y5s2bjSQzYcKEYs+VlZuSsmq1bV6apyuvvLJYP12qpGW+9tprDt+vxhSvC4wpntMdO3ZY5qBr167muuuuc3hszZo1JX5X1pQ6u2dRkvz8/OxXRR89elSbN2/W4MGDdeLECR05ckRHjhxRdna24uPjlZ6eXuwQyejRo8s8PzEgIEC33nqrVq1a5fBLY+XKlerSpYv+8pe/2B+7+BypnJwcHTlyRLGxsfr111+Vk5NT4fdns9k0aNAgvfvuuzp58qTDsps3b24/Afr999/X8ePHNWzYMPv7PnLkiDw9PXXdddcVO1R8qTfeeENXXnmlEhMTS2yDJHl6etrP0SgoKNDRo0eVl5ena665xuGXWnn5+PioQYMG2rJlS7FDHpdOV6Rovfbs2VOnT5/WTz/9VOHlliQwMFD9+vXTa6+9Zl/H+fn5Wrlypfr37y9fX98qWU5dce+99zrc79mzp3799dcy56tIRjdu3KiuXbs6nCgeEhKiO++8s8TXbtmyZYmnC1RlJt966y0VFBRo2rRp8vBw/Ggtysmly6yKbTYoKEgHDhwodnTjYhcv88KFC8rOzlbr1q0VFBRUqXxaGTFihLKyshw+U1asWCEfHx8NGDCgypbj7gYPHqwzZ85o/fr1OnHihNavX295CNrKjBkz1KFDB40cOVJjx45VbGysJkyYYH9+9erVCgwMVO/evR2+N2JiYuTn52dfxx988IHOnz+v8ePHO2znEydOLFc73njjDdlsNk2fPr3Yc1a5qYrvz6CgIP3www9KT0+3nObiZZ49e1ZHjhxRly5dJKnKc7N9+3ZlZGTYH1uxYoUiIyMVGxtbZcv5M+p0sXjy5En5+/tLkn755RcZYzR16lSFhYU53Io20v/+978O87ds2bJcyxkyZIj279+vzz//XJKUkZGhL7/8UkOGDHGY7rPPPtNNN90kX19fBQUFKSwsTI899pgkVWpjL1r2mTNn7Od0nTx5Uu+++64GDRpkD1pRGG644YZi7/29994r9r4vlZGRoY4dO5bZlqVLl6pTp0728z/CwsL0zjvvVOq9eXl5adasWdqwYYOaNGmiXr166ZlnntGhQ4ccpvvhhx+UmJiowMBABQQEKCwszH5YuLJ9WpIRI0YoMzNTn376qaTCD8jDhw/bT3dAoaLzjS4WHBxcasFfpCIZ3bdvn1q3bl3sNUp6TLLOclVmMiMjQx4eHmrfvn2p01X1NvvII4/Iz89P1157rdq0aaP77rtPn332mcM0Z86c0bRp0xQZGSkvLy81atRIYWFhOn78eJXmpHfv3mrWrJn9UHRBQYFee+019evXz/5ZjD8vLCxMN910k1599VWtWbNG+fn5GjhwYIVeo0GDBnrllVe0Z88enThxwn7OaZH09HTl5OSocePGxfJ48uRJhyxKUps2bYq1MTg4uMx2ZGRkKDw8XCEhIaVOV9XfnykpKTp+/Lguu+wyXXHFFZo8ebK+/fZbh2mOHj2q+++/X02aNJGPj4/CwsLsnyVVmZshQ4bIy8vLnpucnBytX79ed955p8M6qUm1/mpoKwcOHFBOTo79y6No6IeHHnrI8oKES79oynu1ZN++fdWwYUOtWrVK3bp106pVq+Th4aFBgwbZp8nIyNCNN96odu3a6bnnnlNkZKQaNGigd999V3PmzHEYmqIiunTpoqioKK1atUp33HGH3n77bZ05c8ahUC167WXLlqlp06bFXqMqhlRYvny5kpKS1L9/f02ePFmNGzeWp6enZs6c6fBryWrDL+mClIkTJ6pv37566623tGnTJk2dOlUzZ87U5s2b1blzZx0/flyxsbEKCAhQSkqKoqOj5e3tra+++kqPPPJIpfu0JPHx8WrSpImWL1+uXr16afny5WratKluuummKltGXfBnRgqoTEbLq6QsOyuTpanINltaVi7u58svv1w///yz1q9fr40bN+qNN97Q/PnzNW3aNPsQN+PHj9fixYs1ceJEde3aVYGBgbLZbBo6dGiVvk9PT0/dcccdWrhwoebPn6/PPvtMWVlZnNfrBHfccYdGjx6tQ4cO6dZbb63UcF+bNm2SVLjXLD093eFHVUFBgRo3blziOaiSiv0odKaqyOql3zG9evVSRkaG1q5dq/fee0+LFi3SnDlz9NJLL+nuu++WVLgHd+vWrZo8ebKuuuoq+fn5qaCgQLfcckuV5iY4OFgJCQlasWKFpk2bprS0NJ07d86lclNni8Vly5ZJkv1Lp+iK5fr161f5F7yvr68SEhK0evVqPffcc1q5cqV69uyp8PBw+zRvv/22zp07p3Xr1jkcmi7pEHBFf0kMHjxYqampys3N1cqVKxUVFWXfVS5J0dHRkqTGjRtX6r1HR0cXu7jjUmlpaWrVqpXWrFnj0P5LDy0U/dK8dODrol+nJS37wQcf1IMPPqj09HRdddVVmj17tpYvX64tW7YoOztba9asUa9evezz7NmzpyJvz660fi/6ElyyZIlmzZqlt956q1ynKaA4q36uSEZbtGihX375pdjjJT1mpSKZLI/o6GgVFBRo9+7dluOoVWSbDQ4OLnGA+H379hUbgcHX11dDhgzRkCFDdP78ed1+++166qmnNGXKFHl7eystLU0jR47U7Nmz7fOcPXu2UgPQl/X5NGLECM2ePVtvv/22NmzYoLCwMEYMcILExESNGTNG27ZtK3ZxRHl8++23SklJ0ahRo7Rr1y7dfffd+u677xQYGCipcHv+4IMP1L1791J3nLRo0UJS4Z7Ii7fL33//vVxHFKKjo7Vp0yYdPXrUcu9iRbJaUm7Onz+vgwcPFps2JCREo0aN0qhRo3Ty5En16tVLM2bM0N13361jx47pww8/VHJysqZNm2afp7TD1qUpT2769eunHTt2aMWKFercubM6dOhQqWU5Q508DL1582Y98cQTatmypf0cpsaNGysuLk4vv/xyiRtNSZetV8SQIUOUlZWlRYsW6Ztvvil2CLqoqLj4vMacnBwtXry42Gv5+vpW6EN8yJAhOnfunJYuXaqNGzdq8ODBDs/Hx8crICBATz/9tMMVbEXKeu8DBgzQN998U+IV40Xvp6T3t337dvuh+SItWrSQp6enPvnkE4fH58+f73D/9OnTxYYLiI6Olr+/v86dO2e5zPPnzxd7rfIqOvfQqu+HDx+uY8eOacyYMTp58qRL/eqrTRo2bCipeD9XJKPx8fH6/PPPHa60P3r0qOVekJJUJJPl0b9/f3l4eCglJaXYXofScmK1zUZHR2vbtm06f/68/bH169dr//79DtNdOoxHgwYN1L59exlj7Hn39PQsdvXmvHnzyjXE1KWs1l+RTp06qVOnTlq0aJHeeOMNDR06lAGhncDPz08vvviiZsyYob59+1Zo3gsXLigpKUnh4eFKTU3VkiVLdPjwYT3wwAP2aQYPHqz8/Hw98cQTxebPy8uzr/+bbrpJ9evX17x58xy2seeff75cbRkwYICMMfa94BcrLTdWWY2Oji72/bJgwYJi2/qlufHz81Pr1q1L/X6Ryv++LlXW98utt96qRo0aadasWfr4449d7vul1id4w4YN+umnn5SXl6fDhw9r8+bNev/999WiRQutW7fO4ZLzf/zjH+rRo4euuOIKjR49Wq1atdLhw4f1+eef68CBA/rmm28q3Y7bbrtN/v7+euihh+Tp6VnsZO6bb75ZDRo0UN++fe3FxsKFC9W4ceNiX4wxMTF68cUX9eSTT6p169Zq3LixbrjhBstlX3311WrdurUef/xxnTt3rlihGhAQoBdffFHDhw/X1VdfraFDhyosLEyZmZl655131L17d73wwguWrz958mSlpaVp0KBBuuuuuxQTE6OjR49q3bp1eumll3TllVcqISFBa9asUWJiovr06aM9e/bopZdeUvv27R0uvgkMDNSgQYM0b9482Ww2RUdHa/369cXOm/zPf/6jG2+8UYMHD1b79u1Vr149vfnmmzp8+LB9eIhu3bopODhYI0eO1IQJE2Sz2bRs2bIKDWlwsZiYGEnS448/rqFDh6p+/frq27evPeSdO3dWx44dtXr1al1++eW6+uqrK7Ucd+fj46P27dtr5cqVuuyyyxQSEqKOHTuqY8eO5c7oww8/rOXLl6t3794aP368fH19tWjRIv3lL3/R0aNHy7V3viKZLI+iDD7xxBPq2bOnbr/9dnl5eWnHjh0KDw/XzJkzK7TN3n333UpLS9Mtt9yiwYMHKyMjQ8uXL7cfKbj4fTRt2lTdu3dXkyZN9OOPP+qFF15Qnz597OcJJiQkaNmyZQoMDFT79u31+eef64MPPlBoaGiF32dp66/IiBEj9NBDD0mSy33p1SUjR46s1HxPPvmkdu3apQ8//FD+/v7q1KmTpk2bpr///e8a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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_, ax = plt.subplots(1, 3, num=20, layout=\"constrained\")\n", "model.IsolabilityAnalysis(ax=ax[0], causality='der')\n", "model.IsolabilityAnalysis(ax=ax[1], causality='int')\n", "model.IsolabilityAnalysis(ax=ax[2])\n", "\n", "ax[0].set_title('Derivative causality')\n", "ax[1].set_title('Integral causality')\n", "ax[2].set_title('Mixed causality')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Redundant sets of equations\n", "\n", "MSO and MTES sets of equations are very useful when designing residual generators. These can be directly computed using the `MSO` and `MTES` class methods as" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 9 MSO sets and 2 MTES sets.\n" ] } ], "source": [ "# Find set of MSOS and MTES\n", "msos = model.MSO()\n", "mtes = model.MTES()\n", "print(f\"Found {len(msos)} MSO sets and {len(mtes)} MTES sets.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Low differential-index and observability can be directly analyzed for the MSO sets" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Out of 9 MSO sets, 9 observable, 4 low (structural) differential index\n" ] } ], "source": [ "oi_mso = [model.IsObservable(m_i) for m_i in msos]\n", "li_mso = [model.IsLowIndex(m_i) for m_i in msos]\n", "print(f'Out of {len(msos)} MSO sets, {sum(oi_mso)} observable, {sum(li_mso)} low (structural) differential index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and also for the MTES sets" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Out of 2 MTES sets, 2 observable, 2 low (structural) differential index\n" ] } ], "source": [ "oi_mtes = [model.IsObservable(m_i) for m_i in mtes]\n", "li_mtes = [model.IsLowIndex(m_i) for m_i in mtes]\n", "print(f'Out of {len(mtes)} MTES sets, {sum(oi_mtes)} observable, {sum(li_mtes)} low (structural) differential index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Isolability analysis for the MSO and MTES sets of equations\n", "\n", "The isolability performance of hte full sets of MSO/MTES should be the same as the isolability performance of the model. This can be verified as below" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Fault Signature Matrix (MSO sets)')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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0GN3C/ZW/ByIiKgjGATvck0h6tixY6Yupcf961//wuuvv27qMjrN3OsnIqLej0GQer3f//730Gg08PLyarWNl5cXNBoNfv/73+vW/etf/8Ibb7zREyUaRWfqb+lzICIiag1vFqFeTyKRtPj0gtsJggA7O7seqqj3qa+vR2NjI2xtbS36cyAioo7hiKAFunLlCmJiYuDu7g6pVIoBAwZg+vTpetfgAcCaNWtw3333QSqVYuDAgViwYAEqKiraff/33nsPgYGB6NOnD+zt7REQEIAvv/yy1fZffPEFhg8fDjs7OwQEBOC7777T297SNYJ3uvPaOKVSiY8//hjArZDYtIiiCG9vb91jrm5XU1MDhUKB5557rs3ja7q2cdu2bfD19YW9vT3Gjh2LU6dOAQDWr1+PoUOHws7ODiEhIc3qPnjwIJ566il4enpCKpXCw8MDf/jDH6DRaHRtWqv/9mN977338P7772PIkCGQSqU4ffp0s8/h6tWrcHNzQ0hICG6fKerHH3+Eo6Mjnn766TaPlYiI7m4cEbRAkZGR+O9//4uFCxfC29sbV69exf79+1FaWqq78eP111/HG2+8gcceewzx8fE4e/Ys1q5di6NHjyInJwc2Nq1PMrp69WpERERg9uzZqKurQ3p6Op566il89dVXCA8P12t74MAB/P3vf8eLL74IqVSKNWvWICwsDEeOHIGfn1+nj/G5557DpUuXsH//fnz++ee69YIgIDo6GsuXL8e1a9fg6uqq2/aPf/wDlZWViI6Obvf9Dx48iMzMTCxYsAAAkJycjMcffxyvvPIK1qxZg+effx7Xr1/H8uXLERsbi2+//VbXd9u2baiurkZ8fDz69OmDI0eO4MMPP8TFixexbdu2Nuu/XUpKCmpqajBv3jxIpVK4urqisbFRr02/fv2wdu1aPPXUU/jwww/x4osvorGxEUqlEk5OTlizZo3hHyoREd19RLqrpaSkiADEo0ePiqIoitevXxcBiO+++26rfa5evSra2tqKkydPFhsaGnTrP/roIxGAuGnTJt26OXPmiF5eXnr9q6ur9V7X1dWJfn5+4oQJE/TW49ZTjcRjx47p1pWUlIh2dnbiE0880ewYzp8/r1sXHBwsBgcH616fP39eBCCmpKTo1i1YsEBs6Vf87NmzIgBx7dq1eusjIiJEb29vsbGxsfmHckfdUqlU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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "FSM = model.FSM(msos)\n", "fig, ax = plt.subplots(1, 2, num=30, clear=True, layout=\"constrained\")\n", "_ = model.IsolabilityAnalysisArrs(msos, ax=ax[0])\n", "ax[0].set_title('Isolability matrix')\n", "\n", "ax[1].spy(FSM, markersize=10, marker='o')\n", "ax[1].xaxis.tick_bottom()\n", "ax[1].set_xticks(range(model.nf()))\n", "ax[1].set_xticklabels(model.f)\n", "ax[1].set_yticks(range(len(msos)))\n", "ax[1].set_yticklabels([f\"MSO {i + 1}\" for i in range(len(msos))])\n", "ax[1].set_xlabel('Fault')\n", "ax[1].set_title('Fault Signature Matrix (MSO sets)')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Fault Signature Matrix (MTES sets)')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApUAAAFfCAYAAAAfyjfoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3HklEQVR4nO3deXxNd/7H8fdNIjebhESINJFYSoqWSlHRokXRUNOi01oqTKuWWka3MZ0qupgumFDSThHGMlXL0JpStLS1b6OqOraSaFHEEhUkku/vD7/ccbPHSSSR1/PxuI9H7rnn3Ps5J+d8z/ue5XttxhgjAAAAwAKXki4AAAAAZR+hEgAAAJYRKgEAAGAZoRIAAACWESoBAABgGaESAAAAlhEqAQAAYBmhEgAAAJYRKgEAAGAZoRKKiYlReHj4DU1rs9n03HPP5TverFmzZLPZdOTIEcewNm3aqE2bNo7nR44ckc1m06xZs26ollsFywGlVdZttjiFh4crJibmpnwWit66detks9m0bt26In3fwYMHq3379kX6nnC2d+9eubm5ac+ePYWellBZBmQGsu3bt5d0KTfd559/rjFjxpR0GTesrNeP0iuzXcjp8ac//emm1HDs2DGNGTNGu3btKvA033//vbp3766wsDB5eHjotttuU/v27TVlypTiK9SiG5nPmyXzS6jNZtMbb7yR4zi9evWSzWaTj4/PDX3G/Pnz9be//c1ClUXj8OHDmj59uv785z87ht3I/Oe17Vz/yDzYMmbMmDzHO3HihOOzTp06peHDhysiIkKenp6qWrWqmjVrppdfflm//fZb8S2cLDZu3KgxY8bo3LlzhZ62fv36io6O1ujRows9rVuhpwBuQJ8+ffTEE0/IbrfnOk5YWJguXbqkChUqOIZ9/vnnmjp1apkNZjdSf07LAcjNuHHjVLNmTadhDRs2vCmffezYMY0dO1bh4eFq3LhxvuNv3LhRDzzwgGrUqKFnnnlGQUFBOnr0qDZv3qzY2FgNHTrUMe6+ffvk4lI6jnsUdj5LgoeHh/75z3/qL3/5i9PwixcvatmyZfLw8Ljh954/f7727NmjESNGFHiaVq1a6dKlS3J3d7/hz80qNjZWNWvW1AMPPJDttcLMf6tWrTRnzhyn8Z5++mk1a9ZMAwYMcAzLGsLj4uJyDOaVKlWSJJ05c0b33HOPkpOT1b9/f0VERCgpKUm7d+9WXFycBg0adMPBvrA2btyosWPHKiYmxlFfYQwcOFAPP/ywDh06pNq1axd4OkIlbgpXV1e5urrmOY7NZrPU8JV1V69eVUZGhtzd3cv1ckDhdOrUSffcc09Jl1Egb775pvz8/LRt27ZsO7qTJ086Pc/rC+it4vLly3J3dy+S8Pzwww9ryZIl+u6779SoUSPH8GXLlik1NVUdO3bUV199Zflz8nP9PBVlO5aWlqZ58+Zp4MCBOb5emPmvVauWatWq5TT9wIEDVatWLfXu3TvXGrp3764qVark+vqMGTOUmJioDRs2KCoqyum15OTkIg3Yxa1du3aqXLmyZs+erXHjxhV4utLxNRCFduLECfXr108hISGy2+2qXr26unbt6nTNoiRNmzZNDRo0kN1uV3BwsIYMGVKgw+HvvfeeoqKiFBAQIE9PT0VGRmrRokW5jj9v3jzVq1dPHh4eioyM1DfffOP0ek7XVGaV9VrCmJgYTZ06VZKcTjUYYxQeHq6uXbtme4/Lly/Lz89Pzz77bJ7zl3kt6MKFC1W/fn15enqqRYsW+v777yVJH374oerUqSMPDw+1adMmW93ffvutevTooRo1ashutys0NFR//OMfdenSJcc4udV//by+9957+tvf/qbatWvLbrdr79692ZbDyZMnFRgYqDZt2sgY43j/gwcPytvbW7///e/znFeUTwkJCRo8eLDq1asnT09PBQQEqEePHtnW5cxTe1nlt82uW7dOTZs2lST169fPsX7ndS3woUOH1KBBgxyPnFStWtXpeU7XVO7evVutW7eWp6enQkJC9MYbbyg+Pj5bneHh4ercubPWr1+vZs2aycPDQ7Vq1dI//vEPp/c7c+aMXnjhBd15553y8fGRr6+vOnXqpO+++67A85nbtZ9Zrz/NvMbw448/1l/+8hfddttt8vLyUnJysiRpy5Yt6tixo/z8/OTl5aXWrVtrw4YNuS7LrFq0aKGaNWtq/vz5TsPnzZunjh07yt/fP9s0y5YtU3R0tIKDg2W321W7dm29/vrrSk9Pd5qPf//730pISMh2Wjivecp6TeWPP/4oT09PPfXUU041rF+/Xq6urnr55ZfznL/169fr9OnTateuXZHNf1E7dOiQXF1dde+992Z7zdfXN9+QfeHCBY0YMULh4eGy2+2qWrWq2rdvr507dzqNl9+6MmbMGL344ouSpJo1azr+b5nbyOrVq3XfffepUqVK8vHxUb169ZwuKZCkChUqqE2bNlq2bFmhlgFHKsuobt266YcfftDQoUMVHh6ukydPavXq1UpMTHS6DmTs2LFq166dBg0apH379ikuLk7btm3Thg0b8jy9Ghsbq0ceeUS9evVSamqqPv74Y/Xo0UPLly9XdHS007hff/21FixYoGHDhslut2vatGnq2LGjtm7dauk03LPPPqtjx45p9erVTqcqbDabevfurXfeeUdnzpxxaiw+++wzJScn5/ltM9O3336rTz/9VEOGDJEkjR8/Xp07d9ZLL72kadOmafDgwTp79qzeeecd9e/f3+lb/sKFC5WSkqJBgwYpICBAW7du1ZQpU/Tzzz9r4cKFedZ/vfj4eF2+fFkDBgyQ3W6Xv7+/MjIynMapWrWq4uLi1KNHD02ZMkXDhg1TRkaGYmJiVLFiRU2bNq3gCxW3nPPnz+v06dNOw6pUqaJt27Zp48aNeuKJJxQSEqIjR44oLi5Obdq00d69e+Xl5WXpc++44w6NGzdOo0eP1oABA3T//fdLUrYjNNcLCwvTpk2btGfPnkK3Db/88oseeOAB2Ww2jRo1St7e3po+fXquRzQPHjyo7t276w9/+IP69u2rmTNnKiYmRpGRkWrQoIEk6aefftLSpUvVo0cP1axZU7/++qs+/PBDtW7dWnv37lVwcPANzWdeXn/9dbm7u+uFF17QlStX5O7urq+++kqdOnVSZGSkXnvtNbm4uCg+Pl4PPvigvv32WzVr1qxA7/3kk09q7ty5+utf/yqbzabTp09r1apVmjNnjlauXJlt/FmzZsnHx0cjR46Uj4+PvvrqK40ePVrJycl69913JUmvvPKKzp8/r59//lmTJk2SlP20cE7zlNUdd9yh119/XS+++KK6d++uRx55RBcvXlRMTIwiIiLyPRq2ceNG2Ww23X333UU2/4V15syZbMPc3NwcX5LCwsKUnp6uOXPmqG/fvoV+/4EDB2rRokV67rnnVL9+fSUlJWn9+vX68ccf1aRJE0kq0Lry2GOPaf/+/frnP/+pSZMmOY6uBgYG6ocfflDnzp111113ady4cbLb7Tp48GCOX2AiIyO1bNkyJScny9fXt2AzYVDqxcfHG0lm27Ztxhhjzp49aySZd999N9dpTp48adzd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+aYef/xxffLJJ1q1apVWr16tgIAAp3U0tx1GcZ1lyOTu7q6mTZvqrbfeUlxcnNLS0hzXIxeF/LZjSXrrrbc0cuRItWrVSnPnztUXX3yh1atXq0GDBgXejgu7/LJu85mf8+6772Y7Cpb5KEw3NE8++aROnz6tZ555RgEBAXrooYdyHO/cuXNq3bq1vvvuO40bN06fffaZVq9erbffftuproIobDu2atUqSde6akpKSirQNAEBAbmembteQee/uNlsNtWtW1dDhw7VN998IxcXF6czazl5/PHH9dNPP2nKlCkKDg7Wu+++qwYNGmjFihWSimZd8fT01DfffKM1a9aoT58+2r17t37/+9+rffv22dbZzOWd1x3vWXGjThlWu3ZtPf/883r++ed14MABNW7cWBMmTNDcuXMVFhYm6Vpfb9d3nZCamqrDhw/negeddO0Qv4eHh7744guni+CvP8x/vcxvT9fbv3+/vLy8CnxqNzd5fUPy9/dXdHS05s2bp169emnDhg03pYPe77//Xvv379fs2bOd7mTMPO14vcJ8w8vPypUrNX36dL300kuaN2+e+vbtqy1btsjNjc0Y2S1atEh9+/bVhAkTHMMuX76crfeHzFNc586dc7orO7+zGVLRrd+Zpz+PHz+e6zhhYWE6ePBgtuE5DSuoRYsW6YEHHsh2BOncuXNOO9K85rNy5co59qiRkJCQrduanGT2Aejr65tnu1xQNWrUUMuWLbVu3ToNGjQo1/Zh3bp1SkpK0pIlS9SqVSvH8MOHD2cbtyjbsQ8++ECrV6/Wm2++qfHjx+vZZ58t0B3GERERmjdvns6fP+84e5STgs7/zVSrVi1Vrlw5z/U7U/Xq1TV48GANHjxYJ0+eVJMmTfTmm2+qU6dOhVpX8vqfubi4qG3btmrbtq0mTpyot956S6+88orWrl3r9L6HDx+Wi4uL6tatW8A55UhlmZSSkqLLly87Datdu7YqVqyoK1euSLrWx5S7u7smT57s9M18xowZOn/+fLY7uK/n6uoqm83m9K3lyJEjWrp0aY7jb9q0yen6o6NHj2rZsmV66KGH8u2bMj/e3t6SlGs3SH369NHevXv14osvytXVVU888YSlzyuIzHm6frkaYxQbG5tt3PzqL6hz5845Oud96623NH36dO3cuVNvvfWWpffFrcvV1TXbmYUpU6ZkOxqR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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "FSM = model.FSM(mtes)\n", "fig, ax = plt.subplots(1, 2, num=31, clear=True, layout=\"constrained\")\n", "_ = model.IsolabilityAnalysisArrs(mtes, ax=ax[0])\n", "ax[0].set_title('Isolability matrix')\n", "\n", "ax[1].spy(FSM, markersize=10, marker='o')\n", "ax[1].xaxis.tick_bottom()\n", "ax[1].set_xticks(range(model.nf()))\n", "ax[1].set_xticklabels(model.f)\n", "ax[1].set_yticks(range(len(mtes)))\n", "ax[1].set_yticklabels([f\"MTES {i + 1}\" for i in range(len(mtes))])\n", "ax[1].set_xlabel('Fault')\n", "ax[1].set_title('Fault Signature Matrix (MTES sets)')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generate code for residual generator\n", "Code for a residual generator, based on an MSO/MTES, can be generated. Note that this part of the toolbox is experimental and could fail at any moment." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The basic principle in sequential residual generation is to use a single equation as redundant/residual equation and use the remaining equations in the MSO/MTES to compute all unknown variables. This is done by performing a matching and then symbolically compute the analytical expressions. See below for an example.\n", "\n", "But first, we need to determine which equation to use as a residual equation. For this, the `MSOCausalitySweep` is a usefuyl class method." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['mixed', 'mixed', 'mixed', 'mixed', 'mixed', 'mixed', 'mixed', 'int', 'mixed', 'mixed', 'int', 'mixed']\n" ] } ], "source": [ "print(model.MSOCausalitySweep(mtes[0]))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This indicates that equations 8 and 11 results in integral causality residual generators and all other requires numerical differentiation. Let's choose equation 11 (index 10) as redundant equation and generate the code." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generating residual generator ResGen (C, batch)\n", " Generating code for the exactly determined part: ..\n", " Generating code for the residual equations\n", " Writing residual generator file\n", "Files ResGen.cc and ResGen_setup.py generated\n", "Compile by running: python ResGen_setup.py build_ext --inplace\n" ] } ], "source": [ "red_eq = mtes[0][10] \n", "model.syme[red_eq]\n", "M0 = [e for e in mtes[0] if e != red_eq]\n", "\n", "Gamma = model.Matching(M0)\n", "model.SeqResGen(Gamma, red_eq, 'ResGen', batch=True, language='C')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also possible to generate Python code" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generating residual generator ResGen (Python, batch)\n", " Generating code for the exactly determined part: ..\n", " Generating code for the residual equations\n", " Writing residual generator file\n", "File ResGen.py generated.\n" ] } ], "source": [ "model.SeqResGen(Gamma, red_eq, 'ResGen', batch=True, language='Python')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "fdt_312", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 2 }