{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "aDtFkeqAvLX2"
      },
      "outputs": [],
      "source": [
        "# Import Libraries\n",
        "import numpy as np\n",
        "import pandas as pd"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "id": "Letb52yp47Gb"
      },
      "outputs": [],
      "source": [
        "# Define RouthStability Class \n",
        "class RouthStability():\n",
        "\n",
        "  ## constructor takes string of coefficiens from polynomial\n",
        "  def __init__(self, den):\n",
        "    self.den = np.array([float(item) for item in den.split()])\n",
        "    self.deg = len(self.den)\n",
        "\n",
        "  ## append k as constant in array\n",
        "  def set_k(self, k):\n",
        "    self.den = np.append(self.den, float(k))\n",
        "    self.deg += 1\n",
        "\n",
        "  ## generate routh table and print its state\n",
        "  def calc_routh(self):\n",
        "    height = (self.deg+1)//2\n",
        "    arr = np.zeros((height + 2,height))\n",
        "    for index in range(self.deg):\n",
        "      if index % 2 == 0:\n",
        "        arr[0][index//2] = self.den[index]\n",
        "      else:\n",
        "        arr[1][(index-1)//2] = self.den[index]\n",
        "\n",
        "    for i in range(2, height+2):\n",
        "      for j in range(height-1):\n",
        "        arr[i][j] = (arr[i-1][0]*arr[i-2][j+1] - arr[i-2][0]*arr[i-1][j+1])\n",
        "        arr[i][j] += 0\n",
        "        try:\n",
        "          arr[i][j] /= arr[i-1][0]\n",
        "        except ZeroDivisionError:\n",
        "          arr[i][j] = 0\n",
        "    \n",
        "    self.df = pd.DataFrame(arr)\n",
        "    self.show_tab()\n",
        "    if self.is_stable() == True:\n",
        "      print(\"SYSTEM IS STABLE\")\n",
        "    else:\n",
        "      print(\"SYSTEM IS UNSTABLE\")\n",
        "\n",
        "  ## print generated route table\n",
        "  def show_tab(self):\n",
        "    print(self.df)\n",
        "\n",
        "  ## return generated route DataFrame\n",
        "  def get_table(self):\n",
        "    return self.df\n",
        "\n",
        "  ## return system stability as boolean\n",
        "  def is_stable(self):\n",
        "    flag = True\n",
        "    for item in self.df[0]:\n",
        "      if item < 0: flag = False\n",
        "    return flag\n",
        "    \n",
        "  ## return the value of a polynomial\n",
        "  def get_poly(self, x):\n",
        "    total = 0\n",
        "    for i in range(self.deg):\n",
        "      total += self.den[self.deg-i-1]*(x**i)\n",
        "      print(total)\n",
        "    return total"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Je19fGrvtOu4",
        "outputId": "bcf1f997-2fa1-4838-eac7-3aa5156d4a43"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Enter your polynomial: 1 3 5 7\n",
            "Enter your K: 9\n",
            "          0    1    2\n",
            "0  1.000000  5.0  9.0\n",
            "1  3.000000  7.0  0.0\n",
            "2  2.666667  9.0  0.0\n",
            "3 -3.125000  0.0  0.0\n",
            "4  9.000000 -0.0  0.0\n",
            "SYSTEM IS UNSTABLE\n"
          ]
        }
      ],
      "source": [
        "# First Testing\n",
        "den = input(\"Enter your polynomial: \")\n",
        "k_in = input(\"Enter your K: \")\n",
        "\n",
        "rs = RouthStability(den)\n",
        "rs.set_k(k_in)\n",
        "rs.calc_routh()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "kFgcxNcscafI",
        "outputId": "e67322ca-5a85-4434-a690-655b07c9404a"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Enter your polynomial: 11 15 19 21\n",
            "Enter your K: 29\n",
            "           0     1     2\n",
            "0  11.000000  19.0  29.0\n",
            "1  15.000000  21.0   0.0\n",
            "2   3.600000  29.0   0.0\n",
            "3 -99.833333   0.0   0.0\n",
            "4  29.000000  -0.0   0.0\n",
            "SYSTEM IS UNSTABLE\n"
          ]
        }
      ],
      "source": [
        "# Second Testing\n",
        "den = input(\"Enter your polynomial: \")\n",
        "k_in = input(\"Enter your K: \")\n",
        "\n",
        "rs = RouthStability(den)\n",
        "rs.set_k(k_in)\n",
        "rs.calc_routh()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jaif_A4_hfeJ",
        "outputId": "a231e081-6ff2-4e13-db18-759225fcd948"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Enter your polynomial: 1.2 6.78 11.11\n",
            "Enter your K: 3.141\n",
            "           0       1\n",
            "0   1.200000  11.110\n",
            "1   6.780000   3.141\n",
            "2  10.554071   0.000\n",
            "3   3.141000   0.000\n",
            "SYSTEM IS STABLE\n"
          ]
        }
      ],
      "source": [
        "# Third Testing\n",
        "den = input(\"Enter your polynomial: \")\n",
        "k_in = input(\"Enter your K: \")\n",
        "\n",
        "rs = RouthStability(den)\n",
        "rs.set_k(k_in)\n",
        "rs.calc_routh()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "SjkQCR9chk6P"
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3.8.10 64-bit",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.8.10"
    },
    "vscode": {
      "interpreter": {
        "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
