{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Chapter 3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "using ControlSystems" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 伝達関数モデルの記述" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Np = [0, 1] # 伝達関数の分子多項式の係数 (0*s + 1)\n", "Dp = [1, 2, 3] # 伝達関数の分母多項式の係数 (1*s^2 + 2*s + 3)\n", "P = tf(Np, Dp)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "P = tf([0, 1], [1, 2, 3])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = tf(\"s\")\n", "P = 1/(s^2+2s+3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 練習問題" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "P = tf([1, 2], [1, 5, 3, 4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "分母多項式の展開" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "using Symbolics\n", "@variables s\n", "expand( (s+1)*(s+2)^2 )" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "P = tf([1, 3],[1, 5, 8, 4])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "P1 = tf([1, 3], [0, 1])\n", "P2 = tf([0, 1], [1, 1])\n", "P3 = tf([0, 1], [1, 2])\n", "P = P1 * P2 * P3^2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = tf(\"s\")\n", "P = 1/(s+1)/(s+2)^2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 分母・分子多項式の係数の抽出" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "den(P)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "num(P)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 状態空間モデルの記述" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A = [0 1; -1 -1]\n", "B = [0; 1]\n", "C = [1 0]\n", "D = 0\n", "P = ss(A, B, C, D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 練習問題" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "A = [1 1 2; 2 1 1; 3 4 5]\n", "B = [2; 0; 1]\n", "C = [1 1 0]\n", "D = 0\n", "P = ss(A, B, C, D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A,B,C,D行列の抽出" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "println(\"A=\", P.A)\n", "println(\"B=\", P.B)\n", "println(\"C=\", P.C)\n", "println(\"D=\", P.D)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sysA, sysB, sysC, sysD = ssdata(P)\n", "println(\"A=\", sysA)\n", "println(\"B=\", sysB)\n", "println(\"C=\", sysC)\n", "println(\"D=\", sysD)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ブロック線図の結合" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S1 = tf( [0, 1], [1, 1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S2 = tf( [1, 1], [1, 1, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 直列結合" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S = S2 * S1;\n", "println(S)\n", "\n", "S = series(S1, S2);\n", "println(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "分母分子の共通因子 s+1 が約分されない\n", "この場合は,minreal を使う" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "minreal(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 並列結合" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S = S1 + S2;\n", "println(S)\n", "\n", "S = parallel(S1, S2)\n", "println(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### フィードバック結合" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S = S1*S2 / (1 + S1*S2)\n", "println(S)\n", "\n", "S = feedback(S1*S2, 1)\n", "println(S)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "minreal(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 練習問題" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S1 = tf(1, [1, 1])\n", "S2 = tf(1, [1, 2])\n", "S3 = tf([3, 1], [1, 0])\n", "S4 = tf([2, 0], [0, 1])\n", "\n", "S12 = feedback(S1, S2)\n", "S123 = series(S12, S3)\n", "S = feedback(S123, S4)" ] }, { "cell_type": "markdown", "metadata": { "toc-hr-collapsed": true, "toc-nb-collapsed": true }, "source": [ "## 補遺(実現問題とプロパー性)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 実現問題" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "P = tf( [0, 1], [1, 1, 1])\n", "\n", "Pss = ss(P) # 伝達関数モデルから状態空間モデルへの変換\n", "println(Pss)\n", "Ptf = tf(Pss) # 状態空間モデルから伝達関数モデルへの変換\n", "println(Ptf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### プロパー性" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "S1 = tf([1, 1], [0, 1])\n", "S2 = tf([0, 1], [1, 1])\n", "\n", "S = series(S1, S2)\n", "minreal(S)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(S2)\n", "ss(S2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(S1)\n", "ss(S1)" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.7.0", "language": "julia", "name": "julia-1.7" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.7.0" } }, "nbformat": 4, "nbformat_minor": 4 }