{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 11章 オブザーバ" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from control.matlab import *\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "#plt.rcParams['font.family'] ='sans-serif' #使用するフォント\n", "plt.rcParams['font.family'] = 'Times New Roman' # font familyの設定\n", "plt.rcParams['mathtext.fontset'] = 'cm' # math fontの設定\n", "plt.rcParams['xtick.direction'] = 'in' #x軸の目盛線が内向き('in')か外向き('out')か双方向か('inout')\n", "plt.rcParams['ytick.direction'] = 'in' #y軸の目盛線が内向き('in')か外向き('out')か双方向か('inout')\n", "plt.rcParams['xtick.major.width'] = 1.0 #x軸主目盛り線の線幅\n", "plt.rcParams['ytick.major.width'] = 1.0 #y軸主目盛り線の線幅\n", "plt.rcParams['font.size'] = 11 #フォントの大きさ\n", "plt.rcParams['axes.linewidth'] = 0.5 # 軸の線幅edge linewidth。囲みの太さ\n", "plt.rcParams['mathtext.default'] = 'it'#'regular'\n", "plt.rcParams['axes.xmargin'] = '0'\n", "plt.rcParams['axes.ymargin'] = '0.05'\n", "plt.rcParams['savefig.facecolor'] = 'None'\n", "plt.rcParams['savefig.edgecolor'] = 'None'\n", "\n", "plt.rcParams[\"legend.fancybox\"] = True # 丸角\n", "# plt.rcParams[\"legend.framealpha\"] = 1 # 透明度の指定、0で塗りつぶしなし\n", "# plt.rcParams[\"legend.edgecolor\"] = 'gray' # edgeの色を変更\n", "plt.rcParams[\"legend.handlelength\"] = 1.8 # 凡例の線の長さを調節\n", "plt.rcParams[\"legend.labelspacing\"] = 0.4 # 垂直方向(縦)の距離の各凡例の距離\n", "plt.rcParams[\"legend.handletextpad\"] = 0.7 # 凡例の線と文字の距離の長さ\n", "plt.rcParams[\"legend.markerscale\"] = 1.0 # 点がある場合のmarker scale" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def linestyle_generator():\n", " linestyle = ['-', '--', '-.', ':']\n", " lineID = 0\n", " while True:\n", " yield linestyle[lineID]\n", " lineID = (lineID + 1) % len(linestyle)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def plot_set(fig_ax, *args):\n", " fig_ax.set_xlabel(args[0])\n", " fig_ax.set_ylabel(args[1])\n", " fig_ax.grid(ls=':', lw=0.5)\n", " if len(args)==3:\n", " fig_ax.legend(loc=args[2])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def bodeplot_set(fig_ax, *args):\n", " fig_ax[0].grid(which=\"both\", ls=':', lw=0.5)\n", " fig_ax[0].set_ylabel('Gain [dB]')\n", "\n", " fig_ax[1].grid(which=\"both\", ls=':', lw=0.5)\n", " fig_ax[1].set_xlabel('$\\omega$ [rad/s]')\n", " fig_ax[1].set_ylabel('Phase [deg]')\n", " \n", " if len(args) > 0:\n", " fig_ax[1].legend(loc=args[0])\n", " if len(args) > 1:\n", " fig_ax[0].legend(loc=args[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## オブザーバ\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -2.]\n" ] } ], "source": [ "# 安定なシステム\n", "A = '0 1; -2 -3'\n", "B = '0; 1'\n", "C = '1 0 ; 0 1'\n", "D = '0; 0'\n", "P = ss(A, B, C, D)\n", "print(P.pole())\n", "\n", "C1 = np.matrix([1,0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 例11.1: 同一次元オブザーバ" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-13.]\n", " [-27.]]\n" ] } ], "source": [ "# オブザーバ極\n", "observer_poles=[-8+2j,-8-2j]\n", "\n", "# オブザーバゲインの設計(状態フィードバックの双対) \n", "L = -acker(P.A.T, C1.T, observer_poles).T\n", "print(L)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-8.+2.j, -8.-2.j])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.eigvals(P.A + L * C1)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "Gsf = ss(P.A, P.B, np.eye(2), [[0],[0]])\n", "Obs = ss(P.A + L*C1, np.c_[P.B, -L], np.eye(2), [[0,0],[0,0]] )" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-8.+2.j, -8.-2.j])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pole(Obs)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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zWP27Nnceeed19zZbUYqLkOQAEnPI7fb3eEzJq/Xy+9+9ztKS0sT1KquU/V4UzWueBm+7EV7HA4H06ZN49ChQ9TV1ZGdndBBgAl17tw53njjDd5//30OHjzI+fPnAbjllluYO3cuCxcuZMGCBYwcOdKyd9b35O6HDkh6HuXk5FBRUdGh97z55ptMnz7d1PcQqnq8qRpXvAxd9iIewWCQ9PR0Jk+ezObNm/mLv/iLRO+yW4TDYc6ePctvfvMbPvroI2pra9m/fz8ul4uRI0dyzz338NBDDzFp0iTLFqG29PS+8XgYkUcZGRl8/vnnHXrPihUrWLp0aYJa1D1UPd5UjSteRi97Ec/+AJg9ezYbNmwwbWHy+/288847/O53v+Pjjz+msrKSXr16cdtttzFw4ED+4R/+gfHjx8e641S936en943HK9l5lJWVxalTp+J+fXTQg9lvbFf1eFM1rniZviMzejZx7733UlxczLJly0xxsb++vp7a2lrefvttfvrTn1JTU4Pdbmfo0KHMmTOHBQsWMHny5OueDZl9DrfOUjUuq8vMzOTSpUs0NjZeMyt1W1555RVTD3qIUvV4UzWueJm+MEWL0LBhwxgxYgQbN240ZHReIBBg586dfPTRR4TDYZYvX05TUxN33HEH9913Hw899BBf/vKX4+6Ws8JAhs5QNS6rczqdDBkyhPLy8nanFfJ6vaxZs8YSi3SqerypGle8TF+YQqFQ7PG3v/1tVq9enZTCJKXks88+49133+WNN97g0KFDRCIRcnNzWbBgAW+99RaTJ0/u9ESjfr9fyT5kVeOyulAoxNChQzl16lS7henNN99k2rRpFBQUJKl1nafq8aZqXPEy/fliy77WBx98kE2bNnH69OmE7EtKyR/+8Adqa2t55JFHGDduHE899RR+v5/nn3+e06dPU1VVxc9//nNmzJjRpdmvWxZclagal9VFIpFYYWrPypUrWbx4cRJa1XWqHm+qxhUv058xteway8nJYdGiRfziF7/g3/7t37r82aFQiN27d7Nx40by8/MpKCjg7/7u7/B4PEyfPp1f/epXzJs3LyEzKKjah6xqXFYnhIirMB04cIDq6mpmz56dpJZ1jarHm6pxxcv0han1QIclS5YwduxY/uqv/orRo0d3+PPKy8vZsGED77//Plu2bKF///5kZmZy6tQpRo0axZNP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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1,2, figsize=(6, 2.3))\n", "\n", "T = np.arange(0, 3, 0.01)\n", "X0 = [-1, 0.5]\n", "x, t = initial(Gsf, T, X0)\n", "ax[0].plot(t, x[:, 0], ls='-.', label='${x}_1$', c='k', lw=1)\n", "ax[1].plot(t, x[:, 1], ls='-.', label='${x}_2$', c='k', lw=1)\n", "\n", "# 入力 u = Fx\n", "# u = [ [F[0,0]*x[i,0]+F[0,1]*x[i,1]] for i in range(len(x))]\n", "\n", "u = 0*(T>0)\n", "# 出力 y = Cx\n", "y = x[:, 0]\n", "# オブザーバで推定した状態の振る舞い\n", "xhat, t, x0 = lsim(Obs, np.c_[u, y], T, [0, 0])\n", "ax[0].plot(t, xhat[:, 0], label='$\\hat{x}_1$', c='k', lw=1)\n", "ax[1].plot(t, xhat[:, 1], label='$\\hat{x}_2$', c='k', lw=1)\n", "\n", "for i in [0, 1]:\n", " plot_set(ax[i], '$t$', '', 'best')\n", " ax[i].set_xlim([0, 3])\n", "\n", "ax[0].set_ylim([-2, 2])\n", "ax[0].set_ylabel('$x_1, \\hat{x}_1$')\n", "ax[1].set_ylabel('$x_2, \\hat{x}_2$')\n", "ax[1].set_ylim([-2, 2])\n", "\n", "fig.tight_layout()\n", "#fig.savefig(\"ex_obs.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### コーヒーブレーク: 外乱オブザーバ" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上記の同一次元オブザーバでは,外乱の影響をうける" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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En369FFahk4LsNTHrIGUkjVr1rBmzRqefvpp4uPjG52unpOTw/79+/n222954YUXGDlyJPPmzeOBBx7glltuue741uqT3bp1Y8WKFbz44oscOnSITZs28d5775GUlERRUREeHh60adOmxedxRB9TPDA1RseOHS067mZBxBY0t4Kt1jI/9OjRQ2kJOi3EUh9rKUajkXnz5pGens6vv/5qcUYDT09PZs+ezezZszEYDGzfvp1PP/2U5cuXs3DhQhYvXsxtt91We3xr90khBOHh4YSHh1NVVYWzszNr1qxhwIABzJ49m3PnztG/f/9mt++IPqaW6eI3xDwFW200t4Kt1jI55+fnKy1Bp4W0ho9VVVXx0EMP0aZNGw4cONDsNDu33norc+bMYc+ePfz8889UV1czbNgwpk6dyv79+5FSKtonzRWq3377bebOnUtKSgqTJ09mwIABvPXWW6Smpja5TUf0MdUHJrXeYTS3gq3WCgXaW1lunetpDR9bvHgxQgi++uqrBoffmkNwcDDvvvsuaWlp3H///SxZsoShQ4eyd+9eVVwACiEIDg7mwoULrFu3jtTUVMLCwhg9ejQbNmywuASOI/qY6ofyampqlJbQIM2tYNvaQ462RmvZ0h0RW/vYF198wdGjRzl+/HjtHYU1ad++PU888QSLFi1ix44dvP7667zxxhs899xzLFy4UPElGk5OTrVDfe+//z67d+/m8OHDODk58fnnnxMUFMSoUaNu+HlH9DHVX77b2xe5o1Ww1VrhQ0fElj52/vx5/vu//5t//OMfNg8QTk5OTJ8+ncjISP72t7+xf/9+evfuzSuvvEJeXp5Nz20p7dq1Y+rUqbz55pvAlVRIXbt2JT09nWHDhvHmm28SHx9/zWcc0cdUH5hscYWlJFobytPSmixHxZY+9uyzz/Lcc8+1aiJSV1dXhg8fztatWzl8+DA5OTmEhISwbNkyzp8/32o6LGHMmDGEhITg6enJG2+8QUZGBuPHj6dv37688MIL/Pjjj6p9nGFLVP8taTQaGz/IjlDD2Lc1ac2pxjq2wVY+tnv3bmJjY3nuueds0v6NqNsng4KC+PDDD4mLi6NTp04MHTqUOXPm1OZtVAvOzs6MHz+edevWcfHiRf7617/SoUMHVq1aRV5eHgcOHGD37t1Ky2w1VB+Y3NzclJZgVbR29aO1dDaOiC18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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1,2, figsize=(6, 2.3))\n", "\n", "Td = np.arange(0, 3, 0.01)\n", "X0 = [-1, 0.5]\n", "d = 0.5*(T>0)\n", "\n", "x, t = initial(Gsf, Td, X0)\n", "ax[0].plot(t, x[:, 0], ls='-.', label='${x}_1$', c='k', lw=1)\n", "ax[1].plot(t, x[:, 1], ls='-.', label='${x}_2$', c='k', lw=1)\n", "\n", "# 入力 \n", "u = 0*(Td>0)\n", "# 出力 y = Cx+d\n", "y = x[:, 0]+d\n", "\n", "xhat, t, x0 = lsim(Obs, np.c_[u, y], T, [0, 0])\n", "ax[0].plot(t, xhat[:, 0], label='$\\hat{x}_1$', c='k', lw=1)\n", "ax[1].plot(t, xhat[:, 1], label='$\\hat{x}_2$', c='k', lw=1)\n", "\n", "for i in [0, 1]:\n", " ax[i].grid(ls=':')\n", " ax[i].set_xlim([0, 3])\n", " ax[i].set_xlabel('$t$')\n", " ax[i].legend()\n", "\n", "ax[0].set_ylim([-2, 2])\n", "ax[0].set_ylabel('$x_1, \\hat{x}_1$')\n", "ax[1].set_ylabel('$x_2, \\hat{x}_2$')\n", "#ax[1].set_ylim([-2, 2])\n", "\n", "fig.tight_layout()\n", "#fig.savefig(\"dis_obs.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "外乱を推定する" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 86.]\n", " [ -66.]\n", " [-102.]]\n" ] } ], "source": [ "# オブザーバ極\n", "observer_poles=[-8+2j,-8-2j, -3] \n", "\n", "# オブザーバゲインの設計(状態フィードバックの双対)\n", "E = [[0], [0]]\n", "Abar = np.r_[ np.c_[P.A, E], np.zeros((1,3))] \n", "Bbar = np.c_[ P.B.T, np.zeros((1,1)) ].T\n", "Cbar = np.c_[ C1, 1 ]\n", "\n", "Lbar = -acker(Abar.T, Cbar.T, observer_poles).T\n", "print(Lbar)\n", "\n", "# Obs = ss(Abar+Bbar*Fbar+Lbar*Cbar, -Lbar, np.eye(3), [[0],[0],[0]] )\n", "Aob = Abar + Lbar*Cbar\n", "Bob = np.c_[Bbar, -Lbar]\n", "Obs = ss(Aob, Bob, np.eye(3), [[0,0],[0,0],[0,0]] )" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5, 1.0)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1,2, figsize=(6, 2.3))\n", "\n", "Td = np.arange(0, 3, 0.01)\n", "X0 = [-1, 0.5]\n", "d = 0.5*(T>0)\n", "x, t = initial(Gsf, Td, X0)\n", "ax[0].plot(t, x[:, 0], ls='-.', label='${x}_1$', c='k', lw=1)\n", "ax[1].plot(t, x[:, 1], ls='-.', label='${x}_2$', c='k', lw=1)\n", "\n", "\n", "# 入力 \n", "u = 0*(Td>0)\n", "# 出力 y = Cx+d\n", "y = x[:, 0]+d\n", "xhat, t, x0 = lsim(Obs, np.c_[u, y], T, [0, 0, 0])\n", "#xhat, t, x0 = lsim(Obs, x[:, 0]+d, T, [0, 0, 0])\n", "ax[0].plot(t, xhat[:, 0], label='$\\hat{x}_1$', c='k', lw=1)\n", "ax[1].plot(t, xhat[:, 1], label='$\\hat{x}_2$', c='k', lw=1)\n", "\n", "for i in [0, 1]:\n", " ax[i].grid(ls=':')\n", " ax[i].set_xlim([0, 3])\n", " ax[i].set_xlabel('$t$')\n", " ax[i].legend()\n", "\n", "ax[0].set_ylim([-2, 2])\n", "ax[0].set_ylabel('$x_1, \\hat{x}_1$')\n", "ax[1].set_ylabel('$x_2, \\hat{x}_2$')\n", "ax[1].set_ylim([-2, 2])\n", "\n", "fig.tight_layout()\n", "# fig.savefig(\"dis_obs2.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)\n", "\n", "fig, ax = plt.subplots(figsize=(3, 2.3))\n", "ax.plot(t, xhat[:, 2], label='$\\hat{x}_2$', color='k')\n", "ax.grid(ls=':')\n", "ax.set_xlabel('$t$')\n", "ax.set_ylabel('$\\hat{d}$')\n", "ax.set_ylim([-0.5, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 例11.2: 併合系" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-16. -3.]]\n" ] } ], "source": [ "# レギュレータ極\n", "regulator_poles = [-3+3j, -3-3j]\n", "# 極配置\n", "F = -acker(P.A, P.B, regulator_poles)\n", "print(F)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "Gsf = ss(P.A + P.B*F, P.B, np.eye(2), [[0],[0]])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# オブザーバ極\n", "observer_poles=[-8+2j,-8-2j]\n", "# オブザーバゲインの設計(状態フィードバックの双対) \n", "L = -acker(P.A.T, C1.T, observer_poles).T" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "Aob1 = np.c_[P.A, P.B@F]\n", "Aob2 = np.c_[-L@C1, P.A+L@C1+P.B@F]\n", "Aob = np.r_[Aob1, Aob2]\n", "Bob = np.zeros([4,1])\n", "Cob = [[ 1, 0 ,0 ,0 ], [0, 1, 0, 0]]\n", "Dob = np.zeros([2,1])\n", "Gobsf = ss(Aob, Bob, Cob, Dob)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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+8GrKHrQqEVK+k5iYiKjRo0iJSXFJYHJz8+PmTNn0r9/f5o3b84tt9zC4sWLefbZZyuVn/Kd0uhBozO8OywrFIorkpiYSHR0NKGhoQQHB7skz3PnzrFkyRIAunXrxpYtWxztTgqFK9BkYPK2NqaKUrhEhy+jB41apKjvpKamkpGRQU5Ojkvelgp59NFHWb58OXl5eURERNCsWTO2b9/usvyvhB7KlR40OkOTgUmhUFSdxMREWrduTXJysks6PhTSpEkTmjdvztq1awHXdRtXKArRZGDy9e6jhYsZ+jJ60KhFivpORkYG3bp1c1mPvKIMGzaMd999F4Bbbrml2gba6qFc6UGjMzQZmBQKRdXp06cP06dPJzk52aVVeQB3330327dv559//uHGG29kz549pKenu/QaCv2iycDk7YManaHlFVBdhR40apGivjNjxgz++usvt7wxBQYGsnjxYscKv9dffz0///yzS69RFnooV3rQ6AxNBiZnyyF7O94+RqE86EGjFinqO23atCE8PNzlbUyF3H333eTl5WG326utnUkP5UoPGp2hyW/A19uYMjMzPW2C29GDRi1S6Dt2u51u3bphNBoxGo2Eh4e75XojRozgwIED1Tahqx7KlR40OkOTgUmhUFSNAwcO0KZNG7e9LRXyww8/0LRpU6699lqOHj3KyZMn3XYthX7QZGDy9rminFF0ShdfRQ8atUih7+zfv5+mTZu6bCqiyyGl5N577yUtLY2uXbs65tFzF3ooV3rQ6IxK9TIQQkRKKa2uNqYQrdexWq1WEhMTSUpK4u+//+bkyZOcPn2a1NRU8vLyyMvLIz8/H7PZTEBAAAEBAQQGBhIREUFkZCRhYWHUqlWLyMhIoqKiiImJISYmhujoaJ8plL7egaUqCCGCgd7AUSnlViFEAyBOSrmxqnkX+s5///tfmjRp4paOD0URQuDv78+KFSu45ZZbWL9+PQMHDnTb9fRQrvSg0RlOvwEhxK2UfrO6FRhblQsLIUYDeUBt4E0pZVrhPq21MeXl5REfH893333Hxo0b+eeff2jbti0tW7akefPm3HjjjURHRxMREYGfnx8WiwWTyUR+fj7Z2dlkZ2eTlZXFuXPnOHr0KEeOHOHIkSMkJCRgtVo5ffq04y84OJiYmBhiY2MdAausdExMjKaDWGZmpupddHn+A+wAWgkhOgJz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3LlziYuLY86cOXzyySekpKSQlJREbGws119/PbGxscTGxmIymVixYgUHDx5k0aJF+Pv707NnT7p06cINN9xAw4YNXfpmVhTlOxoNTO664VpBD09VetDoKaSUsy+3z5d85z//+Q8hISF06tSJ999/n169el2xXAkhMJlMhIaGMm7cuCvmXTiT+b333su9995LdnY2v/zyC/Hx8fz4448cOXKE7t2707NnT1588UUaNWrkUm1XQvmORgNTfn6+p01wK5mZmT7/VKQHjVrE13xn1KhRtGrVioEDB9KvXz+eeeYZmjRpUuV87XY7u3fvZt26dcTHx7Nt2zbatm1Lz549WbBgAR06dPDY26fyHY0GJoVCoSika9eu/Pnnn0yePJlOnToxfPhwRo4cSb169cqdh81mY9++fWzevJn169ezYcMGIiMjufnmmxk1ahSff/45oaGhblShqAiaDExGo9HTJrgVPz8/T5vgdvSgUYv4qu+Eh4fz1ltvMWzYMJYsWUK7du1o2LAhXbp04eqrryY2NpaaNWsipSQ3N5fTp09z6NAhUlJS+OOPP0hISKBWrVp07NiR22+/nddff52rrrrK07LKRPmORgOTr9ex+koD9ZXQg0Yt4uu+06xZM9566y3mzJnD5s2b2b59Oz/88AOnT58mNTUVIQR+fn5ERkbSoEED6tevT79+/bj22msJDw/3tPnlQvmORgOTr9WTl0QPdch60KhF9OI7JpOJbt260a1bN0+b5HKU72h0rrwtW7Z42gS34u0DIMuDDjR287QBZaF8x/vRgcZuzg6o9pkfhBCzgH8DEnhQSvlXGcdILc5I4SqEEF65PEFF8HWNl/Rprm+28h3vx9c1lsd3qjUwCSGuBmxSyj+FEI8DN0sp7ynjOOVcXo6va1SByTP4erkC39dYHt+p1jYmKeXuIsmtQIvLHHpSCBFbJL0J2OguuzxANyHERk8b4WZ8XWM/TxtwGRKEED43TVERfL1cge9rdOo7bntjEkJMARqX3C6lHHRp/7PASinlIbcYoFAoFAqvxCOzi1+q0guXUm6s9osrFAqFQtNUe688IURrIFRKuVEIESKECK5uGxQKhUKhXaq1jUkI0QX4ALBemmxSAtdXpw0KhUKh0DaaWyhQCDEayOPiypxvSinTPGuRaxFCNAdmA69KKTd52h5XIoQIAd4DWgH7gQFSykzPWuVahBAm4BWgE3ABuFNKmeNZqy6ifMd78XXfqajfaGqArRCiPXCDlHIxsB540cMmuRwp5T4u3hjNdTV2AV2AR7jY2zITGOpZc9zCVcD/Sin/BZgpo4OPJ1C+4/X4uu9UyG80FZiAO4C9lz7/cSnti+R52gB3IKX8Wkp5/tJAmu3AcU/b5GqklIeklBeEEIHAL1LKPz1t0yXuQPmO1+LrvlNRv9FaYIoFzl76nMPFKgmFd1IfH1z2GxzVLlOB4Zd6mGoB5Tu+Q3180Hcq4jdaC0yngMBLn2sApz1oi6KSCCHuBN6QUhZ42hZ3IKVMl1KOB54DHvO0PZdQvuMD+LLvVMRvtBaYvgSuufS5DT741ODrCCF6AolSyiNCiDqetsfN/A2UmuvRQyjf8XJ05DtO/UZTy15IKROEEElCiGFAPWCSp21yNUKIOKApcKMQYoeUMtvTNrkKIcRTwNPAGSGEAfgVGOlRo1yMEOLfwLPAp1wc7rDIsxZdRPmOd+PrvlNRv9Fcd3GFQqFQ6ButVeUpFAqFQueowKRQKBQKTaECk0KhUCg0hQpMCoVCodAUKjApFAqFQlOowKRQKBQKTaECk0KhUCg0hQpMOkAI4S+E+NLTdigU3obyHc+gApM+uBHY52kjFAovRPmOB1CByccRQtwC/OfS504eNkeh8BqU73gONSWRDhBCrAf6+dKKmApFdaB8xzOoNyYfRwjhDxiVYykUFUP5judQgcn3uQ7YKYQIE0J08LQxCoUXoXzHQ6jA5PucAizAbVLKnZ42RqHwIpTveAjVxqRQKBQKTaHemBQKhUKhKVRgUigUCoWmUIFJoVAoFJpCBSaFQqFQaAoVmBQKhUKhKVRgUigUCoWmUIFJoVAoFJpCBSaFQqFQaIr/A1ZnVjMVusQ9AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1,2, figsize=(6, 2.3))\n", "\n", "T = np.arange(0, 3, 0.01)\n", "X0 = [-1, 0.5]\n", "x, t = initial(Gsf, T, X0)\n", "ax[0].plot(t, x[:, 0], ls='-.', label='State Feedback', c='k', lw=1)\n", "ax[1].plot(t, x[:, 1], ls='-.', label='State Feedback', c='k', lw=1)\n", "\n", "# オブザーバベースコントローラ\n", "xhat, t = initial(Gobsf, T, [X0[0], X0[1], 0, 0] )\n", "ax[0].plot(t, xhat[:, 0], label='Observer based SF', c='k', lw=1)\n", "ax[1].plot(t, xhat[:, 1], label='Observer based SF', c='k', lw=1)\n", "\n", "for i in [0, 1]:\n", " plot_set(ax[i], '$t$', '', 'best')\n", " ax[i].set_xlim([0, 3])\n", "\n", "ax[0].set_ylim([-2, 2])\n", "ax[0].set_ylabel('$x_1$')\n", "ax[1].set_ylabel('$x_2$')\n", "\n", "fig.tight_layout()\n", "#fig.savefig(\"obs_base_control.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 例11.3: 最小次元オブザーバ" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -2.]\n" ] } ], "source": [ "A = '0 1; -2 -3'\n", "B = '0; 1'\n", "C = '1 0 ; 0 1'\n", "D = '0; 0'\n", "P = ss(A, B, C, D)\n", "print(P.pole())\n", "C1 = np.matrix([1,0])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "A11 = P.A[0,0]\n", "A12 = P.A[0,1]\n", "A21 = P.A[1,0]\n", "A22 = P.A[1,1]\n", "B1 = P.B[0]\n", "B2 = P.B[1]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A11" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A = [[-8.]]\n", "\n", "B = [[ 1. -42.]]\n", "\n", "C = [[1.]]\n", "\n", "D = [[0. 5.]]\n", "\n" ] } ], "source": [ "obs_pole = -8\n", "L = (obs_pole-A22)/A12\n", "Obs = ss(A22+L*A12, np.c_[B2+L*B1, A21-A22*L+L*(A11-A12*L)], 1, np.c_[0, -L] )\n", "print(Obs)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-5.0" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Gsf = ss(P.A, P.B, np.eye(2), [[0],[0]])\n", "\n", "fig, ax = plt.subplots(1,2, figsize=(6, 2.3))\n", "\n", "T = np.arange(0, 3, 0.01)\n", "X0 = [-1, 0.5]\n", "x, t = initial(Gsf, T, X0)\n", "ax[0].plot(t, x[:, 0], ls='-.', label='${x}_1$', c='k', lw=1)\n", "ax[1].plot(t, x[:, 1], ls='-.', label='${x}_2$', c='k', lw=1)\n", "\n", "# 入力 u = Fx\n", "# u = [ [F[0,0]*x[i,0]+F[0,1]*x[i,1]] for i in range(len(x))]\n", "u = 0*(T>0)\n", "# 出力 y = Cx\n", "y = x[:, 0]\n", "# オブザーバで推定した状態の振る舞い\n", "xhat, t, x0 = lsim(Obs, np.c_[u, y], T, [0])\n", "ax[0].plot(t, y, label='$y$', c='k', lw=1)\n", "ax[1].plot(t, xhat, label='$\\hat{x}_2$', c='k', lw=1)\n", "\n", "for i in [0, 1]:\n", " plot_set(ax[i], '$t$', '', 'best')\n", " ax[i].set_xlim([0, 3])\n", "\n", "ax[0].set_ylim([-2, 2])\n", "ax[0].set_ylabel('$y=x_1$')\n", "ax[1].set_ylabel('$x_2, \\hat{x}_2$')\n", "ax[1].set_ylim([-6, 2])\n", "\n", "fig.tight_layout()\n", "#fig.savefig(\"ex_minimal_obs.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 例11.4: 線形関数オブザーバ" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A = [[-5.]]\n", "\n", "B = [[12.]]\n", "\n", "C = [[3.]]\n", "\n", "D = [[-22.]]\n", "\n" ] } ], "source": [ "E = -5\n", "G = -1\n", "W = -22\n", "V = 3\n", "H = 12\n", "Obs = ss(E, H, V, W )\n", "print(Obs)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-16., -3.]])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Gsf = ss(P.A + P.B*F, P.B, np.eye(2), [[0],[0]])\n", "\n", "fig, ax = plt.subplots(1,2, figsize=(6, 2.3))\n", "\n", "T = np.arange(0, 3, 0.01)\n", "X0 = [-1, 0.5]\n", "x, t = initial(Gsf, T, X0)\n", "#ax[0].plot(t, x[:, 0], ls='-.', label='${x}_1$', c='k')\n", "#ax[1].plot(t, x[:, 1], ls='-.', label='${x}_2$', c='k')\n", "\n", "# 入力 u = Fx\n", "u = [ [F[0,0]*x[i,0]+F[0,1]*x[i,1]] for i in range(len(x))]\n", "# u = 0*(T>d)\n", "ax[1].plot(t, u, ls='-.', label='$Fx$', c='k', lw=1)\n", "\n", "# 出力 y = Cx\n", "y = x[:, 0]\n", "# オブザーバで推定した状態の振る舞い\n", "#xhat, t, x0 = lsim(Obs, np.c_[u, y], T, [0])\n", "xhat, t, x0 = lsim(Obs, y, T, [0])\n", "ax[0].plot(t, y, label='$y$', c='k', lw=1)\n", "ax[1].plot(t, xhat, label='$v$', c='k', lw=1)\n", "\n", "for i in [0, 1]:\n", " plot_set(ax[i], '$t$', '', 'best')\n", " ax[i].set_xlim([0, 3])\n", "\n", "ax[0].set_ylim([-2, 2])\n", "ax[0].set_ylabel('$y$')\n", "ax[1].set_ylabel('$Fx,v$')\n", "\n", "fig.tight_layout()\n", "# fig.savefig(\"ex_linfunc_obs.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 例11.5: カルマンフィルタ" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -2.]\n" ] } ], "source": [ "A = '0 1; -2 -3'\n", "B = '0; 1'\n", "C = '1 0 ; 0 1'\n", "D = '0; 0'\n", "P = ss(A, B, C, D)\n", "print(P.pole())\n", "C1 = np.matrix([1,0])" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-0.07768354]\n", " [-0.00301737]]\n" ] } ], "source": [ "QN = 1\n", "RN = 1\n", "L, X, _ = lqe(P.A, P.B, C1, QN, RN)\n", "L = -L\n", "print(L)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9710980760898553\n", "0.027545156261989744\n", "[[-0.07768354]\n", " [-0.00301737]]\n" ] }, { "data": { "image/png": "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5HI5/vnPf4JhGPz73/+2GmPXmyxZVp+11z9bcEQFW0eaH0IBnAbwDACl5Wt///vf7bKU7A9ms5k8+OCDZMGCBUSv11u9ptfrye7du4nZbO71dZuamuzVRM7R174dOXKEiEQismXLFju3yL6Ag6Y8W+WotLS03wlWu+K9994jw4YNG7CNukVFRcTHx4de32w2k9OnTxOz2cx7WeKCKS8lJYVUV1eTyspKsnjxYlJTU0NOnDhBXnrpJZKbm0u+++478sUXX3T52f6Y8hwW/EAIKQLQZWx1V6Ghg83bb7+N48eP4+TJk51mma+//jpOnTqFP/7xj72+LusI5CN97ducOXNw8OBBrFmzBnFxcZg3b56dW8ZfbJGjixcvQi6XIy4uzm73bW1txaOPPopTp07h1KlTCA8Pt9u1LQkJCcFbb72F22+/HRcuXIBYLMa9996LRx99FCtXrhyQe3IBrjwnRo8eDQD4+uuvrSrYssUBDx8+jNjYWLvfl5OmPEfz7bff4l//+hd++uknuLm5Wb2Wnp6OLVu24MMPP7zu7cD2ZO7cudiyZQsWLFiAn3/+2dHN4RWbNm3ChQsX7HItnU6HnTt30ofR+fPnB0wpsbB7355++mnIZDL873//w9NPPy3shRsEHFXB1tHh4l3iSB/TuXPncN9992Hfvn1dJh3973//i5deeqnPCUmvN7t4b7j11ltx+PBh3HTTTTh58iQmT55sp5Zdn8hkMjQ0NODo0aP49NNPbf4cIQR1dXWoqalBbW0tamtrUVpairNnz2L//v0YM2YMdu/e3eNmcnvBMAw++OADxMfHY+nSpZg3bx7+/e9/4z//+U+XaY74gLOzM2pqahzdDBw4cABOTk60gm12djZuueUWANYVbCMiIux6X04qJkeZ8i5fvoxly5Zhx44dSExM7PS6Xq/H66+/3q976PV6KBSKfl2Dq9ijbx999BEqKipwww03ICsrC4GBgXZq3fWHyWTC3r17MW/ePLi6unb7PkIIzp49i//+9784fvw4cnNzoVKp4OvrCx8fH3h7e8Pf3x9z5szBP/7xD4SFhQ1eJ37D09MT27dvx5///GdcuXIFN998M+bPn4+KigqYzWbejROumPKefPLJLs/v3LkTH330Ed5//308/fTTdldMDnfedvXPEfuYUlNTib+/P/nf//7X5es5OTlk+PDh/c5o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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(2,2, figsize=(6, 4.6))\n", "\n", "T = np.arange(0, 6, 0.01)\n", "u = 3*np.sin(1*T)+np.cos(5*T)+2\n", "\n", "QN = 1\n", "RN = 1\n", "w = np.random.normal(loc=0, scale=np.sqrt(QN), size=len(T))\n", "v = np.random.normal(loc=0, scale=np.sqrt(RN), size=len(T))\n", "\n", "print(np.var(w))\n", "print(np.mean(w))\n", "\n", "L, _, _ = lqe(P.A, P.B, C1, QN, RN)\n", "L = -L\n", "print(L)\n", "#L = np.matrix([[-10], [-10]])\n", "Obs = ss(P.A + L*C1, np.c_[P.B, -L], np.eye(2), [[0,0],[0,0]] )\n", "\n", "X0 = [-1, 0.5]\n", "x, t, _= lsim(P, u+w, T, X0)\n", "\n", "xorg, t, _= lsim(P, u, T, X0)\n", "\n", "# 出力 y = Cx\n", "y = x[:, 0]+v\n", "\n", "ax[0,1].plot(t, y, ls='-.', label='$y$', c='gray', lw=0.5)\n", "ax[1,0].plot(t, xorg[:,0], ls='--', label='$x_1$', c='k', lw=1)\n", "ax[1,1].plot(t, xorg[:,1], ls='--', label='$x_2$', c='k', lw=1)\n", "ax[0,0].plot(t, u+w, ls='-.', label='$u+w$', c='gray', lw=0.5)\n", "\n", "# 入力 u = Fx\n", "#u = [ [F[0,0]*x[i,0]+F[0,1]*x[i,1]] for i in range(len(x))]\n", "#u = np.sin(T)\n", "#u = 0*(T>0)\n", "\n", "# オブザーバで推定した状態の振る舞い\n", "xhat, t, x0 = lsim(Obs, np.c_[u, y], T, [0, 0])\n", "ax[1,0].plot(t, xhat[:, 0], label='$\\hat{x}_1$', c='k', lw=1)\n", "ax[1,1].plot(t, xhat[:, 1], label='$\\hat{x}_2$', c='k', lw=1)\n", "ax[0,0].plot(t, u, label='$u$', c='k', ls='--',lw=1)\n", "\n", "for i in [0, 1]:\n", " for j in [0, 1]:\n", " plot_set(ax[i,j], '$t$', '', 'best')\n", " ax[i,j].set_xlim([0, 6])\n", "\n", "ax[0,1].set_ylim([-5, 10])\n", "ax[0,1].set_ylabel('$y$')\n", "ax[0,0].set_ylabel('$u$')\n", "ax[0,0].set_ylim([-5, 10])\n", "ax[1,0].set_ylim([-2, 2])\n", "ax[1,0].set_ylabel('$x_1$')\n", "ax[1,1].set_ylim([-2, 2])\n", "ax[1,1].set_ylabel('$x_2$')\n", "\n", "\n", "fig.tight_layout()\n", "# fig.savefig(\"ex_kalman.pdf\", transparent=True, bbox_inches=\"tight\", pad_inches=0.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 章末問題" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-4.],\n", " [ 3.]])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 章末問題1\n", "A = [[0, 1],[-3, -4]]\n", "B = [[0],[1]]\n", "C = [1,0]\n", "P = ss(A,B,C,0)\n", "\n", "L = -acker(P.A.T,P.C.T, [-4, -4]).T\n", "L" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ -9.]\n", " [-27.]\n", " [-27.]]\n" ] } ], "source": [ "# 章末問題2\n", "A = [[0, 1],[0, 0]]\n", "B = [[1],[1]]\n", "C = [1,0]\n", "P = ss(A,B,C,0)\n", "\n", "B2 = np.matrix([[0], [1]])\n", "\n", "# オブザーバ極\n", "observer_poles=[-3,-3, -3] \n", "\n", "# オブザーバゲインの設計(状態フィードバックの双対)\n", "Abar = np.r_[ np.c_[P.A, B2], np.zeros((1,3))] \n", "Bbar = np.c_[ P.B.T, np.zeros((1,1)) ].T\n", "Cbar = np.c_[ P.C, 0 ]\n", "\n", "Lbar = -acker(Abar.T, Cbar.T, observer_poles).T\n", "print(Lbar)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# 章末問題3\n", "A = [[0,1],[0,0]]\n", "B = [[0],[1]]\n", "C = [1,0]\n", "P = ss(A,B,C,0)\n", "\n", "L = -acker(P.A.T,P.C.T,[-3+3j, -3-3j]).T\n", "F = -acker(P.A, P.B, [-1+1j, -1-1j])" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\frac{-48 s - 36}{s^2 + 8 s + 32}$$" ], "text/plain": [ "TransferFunction(array([-48., -36.]), array([ 1., 8., 32.]))" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = ss(A+B*F+L*C, L, -F, 0)\n", "tf(G)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# 章末問題4\n", "A = [[0,1],[0,0]]\n", "B = [[0],[1]]\n", "C = [1,0]\n", "P = ss(A,B,C,0)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-18., -6.]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F = -acker(P.A, P.B, [-3+3j, -3-3j])\n", "F" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\[\n", "\\left(\\begin{array}{rll|rll}\n", "-11\\phantom{.}&\\hspace{-1em}&\\hspace{-1em}\\phantom{\\cdot}&-73\\phantom{.}&\\hspace{-1em}&\\hspace{-1em}\\phantom{\\cdot}\\\\\n", "\\hline\n", "-6\\phantom{.}&\\hspace{-1em}&\\hspace{-1em}\\phantom{\\cdot}&-48\\phantom{.}&\\hspace{-1em}&\\hspace{-1em}\\phantom{\\cdot}\\\\\n", "\\end{array}\\right)\n", "\\]" ], "text/plain": [ "StateSpace(array([[-11.]]), array([[-73.]]), array([[-6.]]), array([[-48.]]))" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A11 = 0\n", "A12 = 1\n", "A21 = 0\n", "A22 = 0\n", "B1 = 0\n", "B2 = 1\n", "\n", "f1 = -18\n", "f2 = -6\n", "pole = -5\n", "L = ((pole)-A22)/A12\n", "\n", "Ak = A22+L*A12+(B2+L*B1)*f2\n", "Bk = -Ak*L+A21+L*A11+(B2+L*B1)*f1\n", "Ck = f2\n", "Dk = f1-f2*L\n", "\n", "K = ss(Ak,Bk,Ck,Dk)\n", "K" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$$\\frac{-48 s - 90}{s + 11}$$" ], "text/plain": [ "TransferFunction(array([-48., -90.]), array([ 1., 11.]))" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tf(K)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.+1.41421356j 0.-1.41421356j]\n" ] } ], "source": [ "#章末問題 7\n", "A = '0 1; -2 0'\n", "B = '0; 1'\n", "C = '1 0 ; 0 1'\n", "D = '0; 0'\n", "P = ss(A, B, C, D)\n", "print(P.pole())\n", "C1 = np.matrix([1,0])" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.6871215 0.23606798]\n", " [0.23606798 1.53645038]]\n" ] } ], "source": [ "QN = 1\n", "RN = 1\n", "L, X, _ = lqe(P.A, P.B, C1, QN, RN)\n", "L = -L\n", "print(X)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.2360679774997898" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "-2+np.sqrt(4+1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }