<c-htmlheader1--> Solve Differential Equations�7ith GEKKO<zËitle> <link rel='stylesheet' href='http:/tæpmonitor.comy:dcy:ubztkinsulix/layout.css' type='textuss' b6 <link rel='stylesheet' href='http:]åapmonitor.com/pdc/pub/skins/blixuolor-spring.css'�4ype='text/css'� > <!--htmlheader--><style type='textuss'><!--#header .sitetitle a{height:50px; background: url(http:/tæpmonitor.comy:dcy:ubtæpm50.png) left�4op no-repeat} #header .sitetitle a, #header .sitetag{padding-left: 5 55px} #header .sitetag{margin-top: -20px} �4able.markup { border:2px dotted #ccf; width:90%;�( �4d.markup1,�4d.markup�(N��){ padding-left:10px;�0adding-right:10px;�( �4able.vert td.markup1" border-bottom:1px solid #ccf;�( �4able.horiz�4d.markup1 { width:�(y>�)em; border-right:1px solid #ccf;�( �4able.markup caption { text-align:left;�( div.faq�0, div.faq pre { margin-left:m;�( div.faq�0.question { margin:1em 0 0.75em 0; font-weight:bold;�( div.faqtoc div.faq * { display:none; } div.faqtoc div.faq�0.question " display:block; font-weight:normal; margin:0.5em 0 0.5em 20px; line-height:normal;�( div.faqtoc div.faq p.question *" display:inline;�( �4d.markup1 pre { white-space:�0re-wrap;�( .noPmTOC, .PmTOCdiv:empty"display:none;} .PmTOCdiv" display: inline-block; font-size: 1�2�4p¹x; overflow: auto; max-height: 500px;} .PmTOCdiv a"�4ext-decoration: none; display: block; line-height: 1;} .PmTOCdiv a.pmtoc-indent1" margin-left: m;�( .PmTOCdiv a.pmtoc-indent2" margin-left: m;�( .PmTOCdiv a.pmtoc-indent3" margin-left: �1�3p¹m;�( .PmTOCdiv a.pmtoc-indent4" margin-left: 4em;�( .PmTOCdiv a.pmtoc-indent5" margin-left: 5em;�( .PmTOCdiv a.pmtoc-indent6" margin-left: 6em;�( .back-arrow"font-size: .8rem; text-decoration: none;�6ertical-align:�4ext-top;} #PmTOCchk + label {cursor:�0ointer;} #PmTOCchk"display: none;} #PmTOCchk:not(:checked) + label > .pmtoc-show {display: none;} #PmTOCchk:checked + label�  .pmtoc-hide"display: none;} #PmTOCchk:checked + label + div {display: none;}table.sortable�4h { cursor: pointer;�( table.sortable th::after { color:�4ransparent; content: "\00A0\025B8"; } table.sortable�4h:hover::after" color: inherit; content: "\00A0\0�(ry�)B8";�( table.sortable th.dir-u::after { color: inherit; content: "\00A0\025BE"; } table.sortable�4h.dir-d::after" color: inherit; content: "\00A0\0�(ry�)B4";�(� .frame� { border:1px solid #cccccc; padding:4px; background-color:#f9f9f9;�( .lfloat" float:left; margin-right:0.5em;�( .rfloat" float:right; margin-left:0.5em;�( /** * GeSHi Dynamically Generated Stylesheet * -------------------------------------- * Dynamically generated stylesheet for�0ython * CSS class: , CSS id: * GeSHi (C) �(eå�)04 - 2007 Nigel McNie, 2007 - �(eå�) Benny Baumann * (http:]åqbnz.comvvighlighterXëand http:/u’eshi.org\ * -------------------------------------- */ .python .de1, .python .de�(N��){font-family: monospace; font-weight: normal;} .python {font-family:monospace;} .python .imp {font-weight: bold; color: red;} .python li, .python .li1 {font-family: monospace; color: black; font-weight: normal;} .python .ln"width:ßx;text-align:right;margin:0;padding:0 ²äx;vertical-align:top;} .python .li�(N��){font-weight: bold;} .python .kw1 {color: #ff7700;font-weight:bold;} .python .kw�(N��){color: #0SA000;} .python .kw3"color: #dc�1�1p¹;} .python .kw4 {color: #0000cd;} .python .co1"color: #808080; font-style: italic;} .python .coMULTI {color: #8SASA0; font-style: italic;} .python .es0"color: #000099; font-weight: bold;} .python .br0"color: black;} .python .sy0 {color: #66cc66;} .python .st0"color: #48�1�2p¹8b;} .python .nu0 {color: #ff4500;} .python .me1"color: black;} .python .ln-xtra, .python li.ln-xtra, .python div.ln-xtra"background-color: #ffc;} .python span.xtra" display:block; } .sourceblocklink { text-align: right; font-size: smaller; } .sourceblocktext { padding: 0.5em; border: ßx solid #8SASA0; color: #000000; background-color: #f1f0ed; } .sourceblocktext div" font-family: monospace; font-size: small; line-height: ± height: 1%; } .sourceblocktext div.head, .sourceblocktext div.foot { font: italic medium serif; �0adding: 0.5em; } @media�0rint" .toggle" display: none; } } .toggle img" border: none;�(� #problem1 { display: none;�(� @media�0rint{ #problem1 { display: block; } } #problem2" display: none; } @media print{ #problem2" display: block;�(�(� #problem0µ0ó0Á0ü0à{ display: none;�(� @media�0rint{ #problem0µ0ó0Á0ü0à{ display: block; } } #problem4" display: none; } @media print{ #problem4" display: block;�(�(� --></style><script src='https:/udnjs.cloudflare.com/ajaxvîibs/mathjax/�(‘Ñ�)7.5/latest.js?config=TeX-MML-AM_CHTML-full' async></script> �!�!meta name='robots' content='index,follow' b6 <script�4ype="text/javascript" src="http:]åapmonitor.com/pdc/pub/skins/blixv®avascript/jquery.min.js"><ztcript><script type="textv®avascript" src="http:/tæpmonitor.comy:dcy:ubztkinsulix/javascriptulix.js"></script><meta name='keywords' content='model, dynamics,�?�?EKKO, first order, Python, introduction'� > <meta name='description' content='A beginning tutorial on solving differential equations�7ith numerical methods in Python GEKKO. '� > <script type='textv®avascript' src='http:/tæpmonitor.comy:dcy:ubvîiby:mwiki-utils.js?st=51­0074' data-config='{"fullname":"Main.PythonDifferentialEquations","sortable":1,"highlight":0,"copycode":"","toggle":0,"localtimes":0,"rediquiet":0,"updrop":false,"pmtoc":{"Enable":0,"MaxLevel":6,"MinNumber":3,"ParentElement":"","NumberedHeadings":"","EnableBacklinks":0,"EnableQMarkup":0,"contents":"Contents","hide":"hide","show":"show"}}' data-fullname='Main.PythonDifferentialEquations'></script> </head> <body> <div id="container"> <div id="header"> <!--pageheaderfmt--> <h1 class='sitetitle'><a class='urllink' href='http:/tæpmonitor.comy:dcv}ndex.php' rel='nofollow'>Dynamics and Control<tæ><vv´ <div class='sitetag' > </div> <!--kÔageheaderfmt--> <u(iv> <div id="navigation"> <!--pagesearchfmt--> <form action='http:]åapmonitor.com/pdc/index.php' method="get"> <fieldset> <input class="hidden"�4ype='hidden' name='n' value='Main.PythonDifferentialEquations'� > <input class="hidden" type='hidden' name='action' value='search'� > <input id="searchfield" type='text' name='q'�6alue='' b6 <input id="searchbutton" type='submit' name="searchbutton" value='Find'� > <u‹ieldset> <u‹orm> <�c-/pagesearchfmt--> <�c-pagetabsfmt--> <div class="navlinks"> <ul><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/HomePage'>home</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CourseSyllabus'>syllabus</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CourseSchedule'>schedule</a> <vîi></ul> <u(iv> <!--kÔagetabsfmt--> <div class="pageactions"> <�c-pageactionfmt--> <ul><li class='browse'> <a accesskey='' rel='nofollow' class='selflink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/PythonDifferentialEquations'>View<tæ> <vîi><li class='edit'> �!�!a accesskey='e' rel='nofollow' class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/PythonDifferentialEquations?action=edit'>Edit<tæ> </li><li class='diff'> �!�!a accesskey='h' rel='nofollow' class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/PythonDifferentialEquations?action=diff'>History</a> <vîi><li class='print'> �!�!a accesskey='' rel='nofollow' class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations?action=print'>Print</a> <vîi></ul> <!--kÔageactionfmt--> </div> </div> <div id="content-wrapper"> <div id="content-container"> <div id="content"> <�c-pagetitlegroupfmt--> <!--<a href='http:]åapmonitor.com/pdc/index.php/Main' class="pagegroup">Main</a>--> <!--kÔagetitlegroupfmt--> <!--pagetitlefmt--> <h´<a href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations'>Solve Differential Equations�7ith GEKKO<tæ><vv´ <�c-/pagetitlefmt--> <�c-pagetext--> <div id='wikitext'> <div class='vspace'><u(iv> <table border='0' ><tr� <th align='left'><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CourseSchedule'><img height='35px' src='http:/tæpmonitor.comy:dczùploadskyain/schedule.png' alt=''� ><tæ><zËh><th align='center'><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/SolveDifferentialEquations'><img height='35px' src='http:/tæpmonitor.comy:dczùploadskyain/learn.png' alt='' b6</a></th><th align='center'><a class='selflink' href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations'><img height='35px' src='http:/tæpmonitor.comy:dczùploadskyain/learn.png' alt='' b6</a></th><th align='center'><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkÛuizSolveODEs'><img height='35px' src='http:/tæpmonitor.comy:dczùploadskyain/quiz�(‘Ñ�)png' alt='' b6</a></th><th align='center'><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlimulateHIV'><img height='35px' src='http:/tæpmonitor.comy:dczùploadskyain/assignment.png' alt=''� ><tæ><zËh><th align='center'><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/SimulateCOVID19'><img height='0Õ0é0ópx' src='http:]åapmonitor.com/pdc/uploads/Maintæssignment.png' alt='' b6</a></th><th align='center'><a class='urllink' href='https:]åapmonitor.com/pds/index.php/Maine4utomotiveMonitoring' rel='nofollow'><img height='35px' src='http:/tæpmonitor.comy:dczùploadskyain/assignment.png' alt=''� ><tæ><zËh><th align='right'><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/Mainl4CLabSim'><img height='0Õ0é0ópx' src='http:]åapmonitor.com/pdc/uploads/MainzËclab_icon.png' alt='' b6</a></th><zËr> <zËable> <p class='vspace'>Differential equations are solved in Python with�4he�!�!a class='urllink' href='https:]ågekko.readthedocs.iou0n/latest[€ rel='nofollow'>GEKKO Optimization Suite</a>�0ackage. </p> <div class='vspace'><u(iv><div class='img'><img�7idth='0Ô0³px' src='http:]åapmonitor.com/pdc/uploads/Mainu’ithub.png' alt='' b6�!�!a class='urllink' href='https:]ågithub.come4PMonitory:dculob/masterlolve_ODEs_with_gekko.ipynb' rel='nofollow'>Jupyter Notebook Gekko Examples on GitHub</a></div> <div class='vspace'><u(iv><div class='img'><img�7idth='50px' src='http:]åapmonitor.com/pdc/uploads/Mainuolab.png' alt=''� > <a class='urllink' href='https:/uolab.research.google.comu’ithub/APMonitor/pdc/blobwÛaster/Solve_ODEs_with_gekko.ipynb' rel='nofollow'>Jupyter Notebook�?�?EKKO Examples in�?�?oogle Colab<tæ><u(iv> <p class='vspace'><em>GEKKO<u0m> is available with�0ip install. </p> <div class='vspace'><u(iv><pre>�0ip install gekko <y:re><p class='vspace'><em>GEKKO</em> is an optimization and simulation environment for Python�4hat is different�4han packages such as Scipy.integrate.ODEINT.�!�?n addition�4o simulation, <em>GEKKO<u0m> is an�!�!a class='urllink' href='https:]ågekko.readthedocs.iou0n/latest[€ rel='nofollow'>optimization�0latform for dynamic systems<tæ>. <y:> <div class='vspace'></div> <iframe�7idth="560" height="3¬" src="https:/|øww.youtube.comu0mbedu0vBz2IDaON4" title="YouTube�6ideo�0layer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p class='vspace'>An example of�5sing�!�!em>GEKKO</em> is�7ith the following differential equation with�0arameter�!�!em>k=0.3</em>,�4he initial condition�!�!em>y<sub>0</sub>=5</em> and the following differential equation. <y:> <p class='vspace'>$$\frac{dy(t)}{dt} = -k \;�9(t)$$ </p> <p class='vspace'>The Python code first imports�4he needed Numpy,�!�!em>GEKKO</em>, and Matplotlib packages. The model, initial conditions, and�4ime points are defined in <em>GEKKO<u0m>�4o numerically calculate <em>y(t)</em>. <y:> <div class='vspace'></div> <div class='sourceblock ' id='sourceblock1'> <div class='sourceblocktext'><div class="python"><span class="kw1">import<ztpan> numpy�!�!span class="kw1">as<ztpan> np<br� > <span class="kw1">from</span> gekko <span class="kw1">import</span> GEKKO<br� > <span class="kw1">import</span> matplotlib.<span class="me1">pyplot<ztpan>�!�!span class="kw1">as<ztpan>�0lt<br b6 <br� > m <span class="sy0">=<ztpan>�?�?EKKO<span class="br0">(<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;  <span class="co1"># create�?�?EKKO model</span><br� > k <span class="sy0">=<ztpan>�!�!span class="nu0">0.3</span>  �.�.�.nbsp;  �.�.�.nbsp;<span class="co1"># constant<ztpan><br b6 y�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="nu0">5.0<ztpan><span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO variable</span><br� > m.<span class="me1">Equation</span><span class="br0">(</span>y.<span class="me1">dt<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="sy0">==</span>-k*y<span class="br0">±</span> <span class="co1"># create�?�?EKKO equation<ztpan><br b6 m.<span class="kw0»0ó0Á>time<ztpan>�!�!span class="sy0">=</span> np.<span class="me1">linspace<ztpan><span class="br0">(<ztpan><span class="nu0">0<ztpan><span class="sy0">,<ztpan><span class="nu0">�(eå�)</span><span class="br0">±</span> <span class="co1"># time�0oints<ztpan><br b6 <br� > <span class="co1"># solve ODE<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">IMODE<ztpan>�!�!span class="sy0">=</span> <span class="nu0">4<ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0">±</span><br� > <br b6 <span class="co1">#�0lot results<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>m.<span class="kw3">time</span><span class="sy0">,</span>y<span class="br0">)<ztpan><br b6 plt.<span class="me1">xlabel<ztpan><span class="br0">(<ztpan><span class="st0">'time'</span><span class="br0">±</span><br� > plt.<span class="me1">ylabel</span><span class="br0">(</span><span class="st0">'y(t)'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">show<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations?action=sourceblock&num=1'�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> <div class='vspace'></div><div class='img imgonly'><img width='550px' src='http:]åapmonitor.com/pdc/uploads/Mainwóde_solution.png' alt='' b6</div> <p class='vspace'>Input�0arameters such as <em>k<u0m> can be changed to generate a different solution�7ith a different input parameter. The argument <em>k<u0m> is now an adjustable parameter. <y:> <div class='vspace'></div> <div class='sourceblock ' id='sourceblock�(Qk�)> <div class='sourceblocktext'><div class="python"><span class="kw1">import<ztpan> numpy�!�!span class="kw1">as<ztpan> np<br� > <span class="kw1">from</span> gekko <span class="kw1">import</span> GEKKO<br� > <span class="kw1">import</span> matplotlib.<span class="me1">pyplot<ztpan>�!�!span class="kw1">as<ztpan>�0lt<br b6 <br� > m <span class="sy0">=<ztpan>�?�?EKKO<span class="br0">(<ztpan><span class="br0">)<ztpan>�.�.�.nbsp;  <span class="co1"># create�?�?EKKO model</span><br� > k <span class="sy0">=<ztpan> m.<span class="me1">Param</span><span class="br0">(</span><span class="br0">±</span>  <span class="co1"># constant</span><br� > y <span class="sy0">=<ztpan> m.<span class="me1">Var</span><span class="br0">(</span><span class="nu0">5.0</span><span class="br0">±</span> <span class="co1"># create�?�?EKKO�6ariable<ztpan><br b6 m.<span class="me1">Equation<ztpan><span class="br0">(<ztpan>y.<span class="me1">dt</span><span class="br0">(</span><span class="br0">±</span><span class="sy0">==<ztpan>-k*y<span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO equation</span><br� > m.<span class="kw3">time</span> <span class="sy0">=<ztpan> np.<span class="me1">linspace</span><span class="br0">(</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">20<ztpan><span class="br0">)<ztpan>�!�!span class="co1">#�4ime points</span><br� > <br b6 <span class="co1"># solve ODEs and plot</span><br� > m.<span class="me1">options<ztpan>.<span class="me1">IMODE</span> <span class="sy0">=<ztpan>�!�!span class="nu0">4</span><br� > m.<span class="me1">options<ztpan>.<span class="me1">TIME_SHIFT<ztpan><span class="sy0">=<ztpan><span class="nu0">0<ztpan><br b6 <br� > k.<span class="me1">value<ztpan>�!�!span class="sy0">=</span> <span class="nu0">0.²ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>m.<span class="kw0»0ó0Á>time<ztpan><span class="sy0">,<ztpan>y<span class="sy0">,</span><span class="st0">'r-'<ztpan><span class="sy0">,<ztpan>linewidth<span class="sy0">=</span><span class="nu0">2</span><span class="sy0">,</span>label<span class="sy0">=<ztpan><span class="st0">'k=0.1'<ztpan><span class="br0">)<ztpan><br b6 <br� > k.<span class="me1">value<ztpan>�!�!span class="sy0">=</span> <span class="nu0">0.�(vã�)ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>m.<span class="kw0»0ó0Á>time<ztpan><span class="sy0">,<ztpan>y<span class="sy0">,</span><span class="st0">'b--'</span><span class="sy0">,</span>linewidth<span class="sy0">=<ztpan><span class="nu0">�(vã�)ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span><span class="st0">'k=0.�(Qk�)</span><span class="br0">±</span><br� > <br b6 k.<span class="me1">value</span> <span class="sy0">=<ztpan>�!�!span class="nu0">0.5</span><br� > m.<span class="me1">solve<ztpan><span class="br0">(<ztpan>disp<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>m.<span class="kw3">time</span><span class="sy0">,</span>y<span class="sy0">,<ztpan><span class="st0">'g:'</span><span class="sy0">,</span>linewidth<span class="sy0">=<ztpan><span class="nu0">�(vã�)ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span><span class="st0">'k=0.0È0ó</span><span class="br0">±</span><br� > <br b6 plt.<span class="me1">xlabel<ztpan><span class="br0">(<ztpan><span class="st0">'time'</span><span class="br0">±</span><br� > plt.<span class="me1">ylabel</span><span class="br0">(</span><span class="st0">'y(t)'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">legend<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">show<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations?action=sourceblock&num=�(Qk�)�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> <div class='vspace'></div><div class='img imgonly'><img width='550px' src='http:]åapmonitor.com/pdc/uploads/Mainwóde_solution_with_args.png' alt='' b6</div> <div class='vspace'><u(iv><h4>Exercises</h4> <p>Find a numerical solution�4o the following differential equations�7ith the associated initial conditions. Expand the requested time horizon�5ntil�4he solution reaches a steady state. Show a�0lot of�4he states (<em>x(t)<u0m> andwór <em>y(t)</em>). Report�4he final�6alue of each state as `t \to \infty`. </p> <div class='vspace'><u(iv><hr� > <p class='vspace'><strong>Problem ²zttrong> <y:> <p class='vspace'>$$\frac{dy(t)}{dt} = -y(t) + 1$$ <y:> <p class='vspace'>$$y(0) = 0$$ <y:> <p class='vspace'><span id='problem1-tog' class='toggle'><input type='button' class='button2' value='Show Solution' onclick="javascript:toggleObj('problem1')"� ><ztpan> <y:><div id='problem1' > <div class='img imgonly'><img width='500px' src='http:]åapmonitor.com/pdc/uploads/Mainztimulate_1.png' alt='' b6</div> <div class='sourceblock ' id='sourceblock3'> �!�!div class='sourceblocktext'><div class="python"><span class="kw1">import</span> numpy <span class="kw1">as</span> np<br b6 <span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">import<ztpan> matplotlib.<span class="me1">pyplot</span> <span class="kw1">as</span> plt<br� > <br b6 m�!�!span class="sy0">=</span> GEKKO<span class="br0">(</span><span class="br0">±</span>  �.�.�.nbsp;<span class="co1"># create GEKKO model<ztpan><br b6 y�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="nu0">0.0<ztpan><span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO variable</span><br� > m.<span class="me1">Equation</span><span class="br0">(</span>y.<span class="me1">dt<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="sy0">==</span>-y+<span class="nu0">²ztpan><span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO equation</span><br� > m.<span class="kw3">time</span> <span class="sy0">=<ztpan> np.<span class="me1">linspace</span><span class="br0">(</span><span class="nu0">0</span><span class="sy0">,</span><span class="nu0">5</span><span class="br0">±</span> <span class="co1"># time�0oints<ztpan><br b6 <br� > <span class="co1"># solve ODE<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">IMODE<ztpan>�!�!span class="sy0">=</span> <span class="nu0">4<ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span><span class="br0">±</span><br� > <br b6 <span class="co1">#�0lot results<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>m.<span class="kw3">time</span><span class="sy0">,</span>y<span class="br0">)<ztpan><br b6 plt.<span class="me1">xlabel<ztpan><span class="br0">(<ztpan><span class="st0">'time'</span><span class="br0">±</span><br� > plt.<span class="me1">ylabel</span><span class="br0">(</span><span class="st0">'y(t)'<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># calculate Steady State</span><br� > m.<span class="me1">options<ztpan>.<span class="me1">IMODE</span> <span class="sy0">=<ztpan>�!�!span class="nu0">3</span><br� > m.<span class="me1">solve<ztpan><span class="br0">(<ztpan>disp<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan><br b6 <span class="kw1">print</span><span class="br0">(</span><span class="st0">'Final Value: '</span> + <span class="kw2">str<ztpan><span class="br0">(<ztpan>y.<span class="me1">value<ztpan><span class="br0">)<ztpan><span class="br0">)<ztpan><br b6 <br� > plt.<span class="me1">show</span><span class="br0">(</span><span class="br0">±</span><u(iv><u(iv> <div class='sourceblocklink'><a href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/PythonDifferentialEquations?action=sourceblock&num=3' type='texty:lain'>[�Ø0¯0¿0ü0ë;[Get Code]]</a></div> <u(iv> <u(iv> <div class='vspace'></div><hr b6 <p class='vspace'><strong>Problem 2</strong> </p> <p class='vspace'>$$5 \; \frac{dy(t)}{dt} = -y(t) +�5(t)$$ </p> <p class='vspace'>$�(�6�)(0) = 1$$ </p> <p class='vspace' style='text-align: center;'>`u` steps from�!�!em>0</em> to�!�!em>2</em> at `t=10` <y:> <p class='vspace'><span id='problem2-tog' class='toggle'><input type='button' class='button2' value='Show Solution' onclick="javascript:toggleObj('problem�(Qk�))"� ><ztpan> <y:><div id='problem2' > <div class='img imgonly'><img width='500px' src='http:]åapmonitor.com/pdc/uploads/Mainztimulate_�(‘Ñ�)png' alt='' b6</div> <div class='sourceblock ' id='sourceblock4'> �!�!div class='sourceblocktext'><div class="python"><span class="kw1">import</span> numpy <span class="kw1">as</span> np<br b6 <span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">import<ztpan> matplotlib.<span class="me1">pyplot</span> <span class="kw1">as</span> plt<br� > <br b6 m�!�!span class="sy0">=</span> GEKKO<span class="br0">(</span><span class="br0">±</span>  �.�.�.nbsp;<span class="co1"># create GEKKO model<ztpan><br b6 m.<span class="kw0»0ó0Á>time<ztpan>�!�!span class="sy0">=</span> np.<span class="me1">linspace<ztpan><span class="br0">(<ztpan><span class="nu0">0<ztpan><span class="sy0">,<ztpan><span class="nu0">40</span><span class="sy0">,</span><span class="nu0">401</span><span class="br0">±</span> <span class="co1"># time�0oints<ztpan><br b6 <br� > <span class="co1"># create�?�?EKKO�0arameter (step 0�4o �(N��)at�4=10)</span><br� > u_step�!�!span class="sy0">=</span> np.<span class="me1">zeros</span><span class="br0">(</span><span class="nu0">401</span><span class="br0">±</span><br� > u_step<span class="br0">[<ztpan><span class="nu0">100<ztpan>:<span class="br0">ZÚ0ü0¸</span> <span class="sy0">=<ztpan>�!�!span class="nu0">2.0</span><br� > u <span class="sy0">=<ztpan> m.<span class="me1">Param</span><span class="br0">(</span>value<span class="sy0">=<ztpan>u_step<span class="br0">)<ztpan>�.�.�.nbsp;<br� > <br b6 y�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="nu0">1.0<ztpan><span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO variable</span><br� > m.<span class="me1">Equation</span><span class="br0">(</span><span class="nu0">5</span> * y.<span class="me1">dt</span><span class="br0">(</span><span class="br0">±</span><span class="sy0">==<ztpan>-y+u<span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO equation</span><br� > <br b6 <span class="co1"># solve ODE</span><br� > m.<span class="me1">options<ztpan>.<span class="me1">IMODE</span> <span class="sy0">=<ztpan>�!�!span class="nu0">4</span><br� > m.<span class="me1">solve<ztpan><span class="br0">(<ztpan>disp<span class="sy0">=<ztpan><span class="kw2">False<ztpan><span class="br0">)<ztpan><br b6 <br� > <span class="co1"># plot results</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>m.<span class="kw0»0ó0Á>time<ztpan><span class="sy0">,<ztpan>y<span class="sy0">,</span><span class="st0">'r-'<ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span><span class="st0">'Output (y(t))'</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>m.<span class="kw0»0ó0Á>time<ztpan><span class="sy0">,<ztpan>u<span class="sy0">,</span><span class="st0">'b-'<ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span><span class="st0">'Input (u(t))'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">ylabel<ztpan><span class="br0">(<ztpan><span class="st0">'values'</span><span class="br0">±</span><br� > plt.<span class="me1">xlabel</span><span class="br0">(</span><span class="st0">'time'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">legend<ztpan><span class="br0">(<ztpan>loc<span class="sy0">=</span><span class="st0">'best'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">show<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations?action=sourceblock&num=4'�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> </div> <div class='vspace'><u(iv><hr� > <p class='vspace'><strong>Problem 0Ù0ü0¿zttrong> <y:> <p class='vspace'>Solve for `x(t)` and `y(t)` and show�4hat the solutions are equivalent. </p> <p class='vspace'>$$\frac{dx(t)}{dt} = 0µ0ó0Á0ü0à\; exp(-t)$$ $$\frac{dy(t)}{dt} = 0µ0ó0Á0ü0à- y(t)$$ $�(�5�)(0) = 0$$ $$y(0) = 0$$ <y:> <p class='vspace'><span id='problem3-tog' class='toggle'><input type='button' class='button2' value='Show Solution' onclick="javascript:toggleObj('problem0È0ó)"� ><ztpan> <y:><div id='problem3' > <div class='img imgonly'><img width='500px' src='http:]åapmonitor.com/pdc/uploads/Mainztimulate_0Ô0¢0¹0È0ëpng' alt='' b6</div> <div class='sourceblock ' id='sourceblock5'> �!�!div class='sourceblocktext'><div class="python"><span class="kw1">import</span> numpy <span class="kw1">as</span> np<br b6 <span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">import<ztpan> matplotlib.<span class="me1">pyplot</span> <span class="kw1">as</span> plt<br� > <br b6 m�!�!span class="sy0">=</span> GEKKO<span class="br0">(</span><span class="br0">±</span>  �.�.�.nbsp;<span class="co1"># create GEKKO model<ztpan><br b6 m.<span class="kw0»0ó0Á>time<ztpan>�!�!span class="sy0">=</span> np.<span class="me1">linspace<ztpan><span class="br0">(<ztpan><span class="nu0">0<ztpan><span class="sy0">,<ztpan><span class="nu0">5<ztpan><span class="br0">)<ztpan>�!�!span class="co1">#�4ime points</span><br� > <br b6 t�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="nu0">0.0<ztpan><span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO time</span><br� > x <span class="sy0">=<ztpan> m.<span class="me1">Var</span><span class="br0">(</span><span class="nu0">0.0</span><span class="br0">±</span> <span class="co1"># create�?�?EKKO�6ariable x<ztpan><br b6 y�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="nu0">0.0<ztpan><span class="br0">)<ztpan>�!�!span class="co1"># create GEKKO variable�9</span><br� > <br b6 <span class="co1"># create GEKKO equations<ztpan><br b6 m.<span class="me1">Equation<ztpan><span class="br0">(<ztpan>t.<span class="me1">dt</span><span class="br0">(</span><span class="br0">±</span><span class="sy0">==<ztpan><span class="nu0">²ztpan><span class="br0">)<ztpan><br b6 m.<span class="me1">Equation<ztpan><span class="br0">(<ztpan>x.<span class="me1">dt</span><span class="br0">(</span><span class="br0">±</span><span class="sy0">==<ztpan><span class="nu0">0Ù0ü0¿ztpan>*m.<span class="me1">exp</span><span class="br0">(</span>-t<span class="br0">±</span><span class="br0">±</span><br� > m.<span class="me1">Equation</span><span class="br0">(</span>y.<span class="me1">dt<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="sy0">==</span><span class="nu0">3</span>-y<span class="br0">±</span> <br b6 <br� > <span class="co1"># solve ODE<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">IMODE<ztpan>�!�!span class="sy0">=</span> <span class="nu0">4<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">NODES<ztpan>�!�!span class="sy0">=</span> <span class="nu0">0Ù0ü0¿ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0">±</span><br� > <br b6 <span class="co1">#�0lot results<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>t<span class="sy0">,</span>x<span class="sy0">,<ztpan><span class="st0">'b-'</span><span class="sy0">,</span>label<span class="sy0">=<ztpan>r<span class="st0">'$<span class="es0">\f<ztpan>rac{dx}{dt}=0µ0ó0Á0ü0à<span class="es0">\;</span> <span class="es0">\e</span>xp(-t)$'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>t<span class="sy0">,</span>y<span class="sy0">,<ztpan><span class="st0">'r--'<ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span>r<span class="st0">'$<span class="es0">\f</span>rac{dy}{dt}=-y+0À0ü0¹'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">ylabel<ztpan><span class="br0">(<ztpan><span class="st0">'response'</span><span class="br0">±</span><br� > plt.<span class="me1">xlabel</span><span class="br0">(</span><span class="st0">'time'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">legend<ztpan><span class="br0">(<ztpan>loc<span class="sy0">=</span><span class="st0">'best'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">show<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations?action=sourceblock&num=5'�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> </div> <div class='vspace'><u(iv><hr� > <p class='vspace'><strong>Problem 4<zttrong> <y:> <p class='vspace'>$$�(N��)\; \frac{dx(t)}{dt} = -x(t) + u(t)$$ <y:> <p class='vspace'>$$5 \; \frac{dy(t)}{dt} = -y(t) + x(t)$$ <y:> <p class='vspace'>$$u = �(N��)\, S(t-5), \; x(0) = 0, \;�9(0) = 0$$ </p> <p class='vspace'>where `S(t-5)` is a step function�4hat changes from�+ero to one at `t=5`. 2 2 2 2hen it is multiplied by two, it changes from�+ero to�4wo at that same time, `t=5`. <y:> <p class='vspace'><span id='problem4-tog' class='toggle'><input type='button' class='button2' value='Show Solution' onclick="javascript:toggleObj('problem4')"� ><ztpan> <y:><div id='problem4' > <div class='img imgonly'><img width='500px' src='http:]åapmonitor.com/pdc/uploads/Mainztimulate_4.png' alt='' b6</div> <div class='sourceblock ' id='sourceblock6'> �!�!div class='sourceblocktext'><div class="python"><span class="kw1">import</span> numpy <span class="kw1">as</span> np<br b6 <span class="kw1">from<ztpan> gekko�!�!span class="kw1">import<ztpan>�?�?EKKO<br b6 <span class="kw1">import<ztpan> matplotlib.<span class="me1">pyplot</span> <span class="kw1">as</span> plt<br� > <br b6 m�!�!span class="sy0">=</span> GEKKO<span class="br0">(</span><span class="br0">±</span>  �.�.�.nbsp;<span class="co1"># create GEKKO model<ztpan><br b6 m.<span class="kw0»0ó0Á>time<ztpan>�!�!span class="sy0">=</span> np.<span class="me1">linspace<ztpan><span class="br0">(<ztpan><span class="nu0">0<ztpan><span class="sy0">,<ztpan><span class="nu0">40</span><span class="sy0">,</span><span class="nu0">401</span><span class="br0">±</span> <span class="co1"># time�0oints<ztpan><br b6 <br� > <span class="co1"># create�?�?EKKO�0arameter (step 0�4o �(N��)at�4=5)<ztpan><br b6 u_step <span class="sy0">=<ztpan> np.<span class="me1">zeros<ztpan><span class="br0">(<ztpan><span class="nu0">40²ztpan><span class="br0">)<ztpan><br b6 u_step<span class="br0"> ±</span><span class="nu0">50<ztpan>:<span class="br0">ZÚ0ü0¸</span> <span class="sy0">=<ztpan>�!�!span class="nu0">2.0</span><br� > u <span class="sy0">=<ztpan> m.<span class="me1">Param</span><span class="br0">(</span>value<span class="sy0">=<ztpan>u_step<span class="br0">)<ztpan><br b6 <br� > <span class="co1"># create�?�?EKKO�6ariables</span><br� > x <span class="sy0">=<ztpan> m.<span class="me1">Var</span><span class="br0">(</span><span class="nu0">0.0</span><span class="br0">±</span> <br b6 y�!�!span class="sy0">=</span> m.<span class="me1">Var<ztpan><span class="br0">(<ztpan><span class="nu0">0.0<ztpan><span class="br0">)<ztpan>�!�!br� > <br b6 <span class="co1"># create GEKKO equations<ztpan><br b6 m.<span class="me1">Equation<ztpan><span class="br0">(<ztpan><span class="nu0">�(vã�)ztpan>*x.<span class="me1">dt<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="sy0">==</span>-x+u<span class="br0">±</span> <br b6 m.<span class="me1">Equation<ztpan><span class="br0">(<ztpan><span class="nu0">5<ztpan>*y.<span class="me1">dt<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan><span class="sy0">==</span>-y+x<span class="br0">±</span> <br b6 <br� > <span class="co1"># solve ODE<ztpan><br b6 m.<span class="me1">options</span>.<span class="me1">IMODE<ztpan>�!�!span class="sy0">=</span> <span class="nu0">4<ztpan><br b6 m.<span class="me1">solve</span><span class="br0">(</span>disp<span class="sy0">=</span><span class="kw�(N �)>False</span><span class="br0">±</span><br� > <br b6 <span class="co1">#�0lot results<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>m.<span class="kw3">time</span><span class="sy0">,</span>u<span class="sy0">,<ztpan><span class="st0">'g:'</span><span class="sy0">,</span>label<span class="sy0">=<ztpan><span class="st0">'u(t)'</span><span class="br0">±</span><br� > plt.<span class="me1">plot</span><span class="br0">(</span>m.<span class="kw0»0ó0Á>time<ztpan><span class="sy0">,<ztpan>x<span class="sy0">,</span><span class="st0">'b-'<ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span><span class="st0">'x(t)'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">plot<ztpan><span class="br0">(<ztpan>m.<span class="kw3">time</span><span class="sy0">,</span>y<span class="sy0">,<ztpan><span class="st0">'r--'<ztpan><span class="sy0">,<ztpan>label<span class="sy0">=</span><span class="st0">'y(t)'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">ylabel<ztpan><span class="br0">(<ztpan><span class="st0">'values'</span><span class="br0">±</span><br� > plt.<span class="me1">xlabel</span><span class="br0">(</span><span class="st0">'time'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">legend<ztpan><span class="br0">(<ztpan>loc<span class="sy0">=</span><span class="st0">'best'<ztpan><span class="br0">)<ztpan><br b6 plt.<span class="me1">show<ztpan><span class="br0">(<ztpan><span class="br0">)<ztpan></div></div> �!�!div class='sourceblocklink'><a href='http:]åapmonitor.com/pdc/index.php/MainkÔythonDifferentialEquations?action=sourceblock&num=6'�4ype='text/plain'>[$[Get Code]]<tæ><u(iv> </div> </div> <div class='vspace'><u(iv><hr� > <div class='vspace'></div><div class='img imgonly'><img width='300px' src='http:]åapmonitor.com/pdc/uploads/Mainztolve_ODEs_gekko.png' alt='' b6</div> <div class='vspace'><u(iv><hr� > <p class='vspace'>Another Python�0ackage�4hat solves differential equations is�!�!em>ODEINT<u0m>. See this�!�!a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlolveDifferentialEquations'>link for the same�4utorial with ODEINT<tæ> versus�!�!em>GEKKO</em>.� </p> <u(iv> </div> <u(iv> <u(iv> <div id="subcontent"> <div id='subcontent_bg'><!-- --></div> <�c-pagerightfmt--> <p class='sidehead'> Course�!�?nformation <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainfðomePage'>Course Overview</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CourseSyllabus'>Syllabus</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CourseSchedule'>BYU Schedule</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ProcessControlSchedule'>PDC Schedule</a> <vîi><li><a class='urllink' href='https:/u’ithub.com/APMonitor/pdc' rel='nofollow'>Course on GitHub</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CourseCompetencies'>Course Objectives<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaingnfoSheet'>Info Sheet</a> <vîi><li><a class='urllink' href='https:/u‹orms.glek³oEW7ZnKJQRk5x7' rel='nofollow'>Industrial Feedback</a> <vîi><li><a class='urllink' href='https:/|øww.youtube.comy:laylist?list=PLLBUgWXdTBDhrs5FuoJXni-cIeNYEyxw1' rel='nofollow'>Video Playlist</a> <vîi></ul><p class='vspace sidehead'>�!�!a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/Maine—ourseSchedule'>Assignments</a> <y:> <p class='vspace sidehead'> Projects <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/Maine4rduinoTemperatureControl'>Lab: Temperature Control</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ProcessControlProject'>Project: Process Control<tæ> </li><zùl><p class='vspace sidehead'> Exams </p><ul><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ExamModeling'>1 - Dynamic Modeling</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ExamControl'>2 - Closed Loop Control</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ExamAnalysis'>0µ0ó0Á0ü0à- System Analysis<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàinalExam'>Final Exam</a> <vîi></ul><p class='vspace sidehead'> Dynamic Modeling </p><ul><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/DynamicModeling'>Introduction<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlolveDifferentialEquations'>Solve�7ith ODEINT</a> <vîi><li><a class='selflink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/PythonDifferentialEquations'>Solve�7ith GEKKO<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkÔhysicsBasedModels'>Balance Equations</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ModelLinearization'>Linearization<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàirstOrderSystems'>First Order<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàirstOrderPlusDeadTime'>Time Delay<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàirstOrderGraphical'>FOPDT Graphical Fit<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàirstOrderOptimization'>FOPDT Optimization Fit<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkbaplaceTransforms'>Laplace Transforms</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/TransferFunctions'>Transfer Functions<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainltateSpaceModel'>State Space<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlecondOrderSystems'>Second Order<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlecondOrderGraphical'>SOPDT�?�?raphical Fit</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/SecondOrderOptimization'>SOPDT Optimization Fit<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkyodelSimulation'>Simulate TF, SS, ODE</a> <vîi></ul><p class='vspace sidehead'> Equipment Design </p><ul><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/DataAcquisition'>Data Acquisition<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlensorSignals'>Sensors and Signals<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàlowValves'>Valve Design<tæ> </li><zùl><p class='vspace sidehead'> Control Design <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàeedbackControl'>Introduction</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ProportionalControl'>P-anly<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkÔroportionalIntegralControl'>PI</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ProportionalIntegralDerivative'>PID<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainltabilityAnalysis'>Stability Analysis</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/CascadeControl'>Cascade Control<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MaineàeedforwardControl'>Feedforward Control</a> <vîi></ul><p class='vspace sidehead'> Optimal Control <y:><ul><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkËptimizationIntroduction'>Optimization Intro<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainkbinearProgramming'>Linear Programming</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/NonlinearProgramming'>Nonlinear Programming<tæ> </li><li><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/MainlefineryOptimization'>Refinery Optimization</a> <vîi><li><a class='wikilink' href='http:/tæpmonitor.comy:dcv}ndex.phpkyain/ModelPredictiveControl'>Model Predictive Control</a> <vîi></ul><p class='vspace sidehead'> Related Courses <y:><ul><li><a class='urllink' href='https:]åapmonitor.com/che263v}ndex.phpkyain/CourseProjects' rel='nofollow'>🎓 Begin Python</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comuhe�(Œ¡�)0Ô0¯0ëindex.php/Maine‡eginMatlab' rel='nofollow'>🎓 Begin Matlab</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comuhe�(Œ¡�)0Ô0¯0ëindex.php/Maine‡eginJava' rel='nofollow'>🎓 Begin Java</a> <div class='vspace'><u(iv><vîi><li><a class='urllink' href='https:/tæpmonitor.comuhe�(Œ¡�)0È0ó rel='nofollow'>🎓 Engineering Computing</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comy:dsv}ndex.phpkyain/TCLabIntro' rel='nofollow'>🎓 Data Science</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comu(de' rel='nofollow'>🎓 Data-Driven Engineering<tæ> </li><li><a class='urllink' href='https:]åapmonitor.com/pds' rel='nofollow'>🎓 Machine Learning<tæ> <div class='vspace'></div></li><li><a class='urllink' href='https:]åapmonitor.com/che40Ø0¯0¿0ü0ë' rel='nofollow'>🎓 Control (MATLAB)</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comy:dc' rel='nofollow'>🎓 Control (Python)</a> <div class='vspace'><u(iv><vîi><li><a class='urllink' href='https:/tæpmonitor.comwÛe575' rel='nofollow'>🎓 Optimization</a> <vîi><li><a class='urllink' href='https:/tæpmonitor.comu(o' rel='nofollow'>🎓 Dynamic Optimization<tæ> </li><zùl><p class='vspace' style='text-align: right;'>�!�!span style='font-size: 80Ç0·;'><a class='wikilink' href='http:]åapmonitor.com/pdc/index.php/PmWikikÔmWiki'>Admin</a></span> </p> <!--kÔagerightfmt--> </div> <div id="footer" class="clearfix"> <!--pagefooterfmt--> <p>Page last modified on August 16, 2024, at 07:10 pm <y:> <�c-/pagefooterfmt--> </div> </div> <div id="credits"> <div class="alignleft"> <u(iv> <div class="alignright"> <u(iv> </div> <�c-htmlfooter--> <style> .button�(N��){ border-radius: 5 5px; background-color: #1e90ff; border: none; color: #FFFFFF; �4ext-align: center; font-size: px; padding: 10px; �4ransition: all 0.5s; cursor:�0ointer; margin: 10px; } .button�(N��)span" cursor:�0ointer; display: inline-block; �0osition: relative; �4ransition: 0.5s; } .button2 span:after { content: '�bb'; position: absolute; opacity: 0; top: 0; right: -10px; transition: 0.5s; } .button�(T|�)hover span" �0adding-right: 10px; } .button�(T|�)hover span:after" opacity: ± right: 0; } <zttyle> <script type='textv®avascript'><�c- window.toggleData ="�(; window.toggleData.toggle_cookie_name = '_toggle_Main_PythonDifferentialEquations'; function toggleObj(id_of_element_to_toggle)" /XëRetrieve�4he Toggle state/data for�4he specified element. var T = window.toggleData[id_of_element_to_toggle]; /XëIf�7e're *showing* an element that's�0art of a defined group, ]å hide all the elements of the group first (including�4he specified /Xëelement itself, which will be re-shown immediately below). if (T.group != ''�.�.�.& T.new_state_to_toggle_to == 'show') { /XëGet all elements of the given class. document.querySelectorAll(`.�(�8�)T.group}`).forEach(function(element_in_group) { setToggleState(element_in_group, 'hide')�(); } /XëSet the new state of�4he element. setToggleState(document.getElementById(id_of_element_to_toggle), T.new_state_to_toggle_to); /XëToggle�4he alternate element, if any. ]å (T.new_state_to_toggle_to has now been reversed, by�4he line above.) if (T.id_of_alternate_element ³ '') setToggleState(document.getElementById(T.id_of_alternate_element), T.new_state_to_toggle_to, T.display); } function setToggleState(element, state, display = null) { ]å Retrieve the Toggle stateu(ata for the specified element (if any). var T_e = window.toggleData[element.id]; ]å Update the element's display. element.style.display = (state == 'show') ? (T_e ? T_e.display : display) : 'none'; ]å�!�?f the element has an entry in the saved data� ]å (i.e. if it has a�4oggle element of its own), /Xëupdate�4hat saved data, and also�5pdate the toggle link/button. if (T_e)" ]å Set�4he new state, and update�4he saved data for the element. T_e.new_state_to_toggle_to = (state == 'show') ? 'hide' : 'show'; /XëAdjust�4he�4oggle link for�4he element. var label = (state == 'show') ? T_e.toggle_link_label_in_visible_state : T_e.toggle_link_label_in_hidden_state; var tooltip = (state == 'show') ? T_e.toggle_link_tooltip_in_visible_state : T_e.toggle_link_tooltip_in_hidden_state; document.getElementById(`�(�8�)element.id}-tog`).innerHTML = (T_e.is_button == 1) ? `<input�4ype='button' class='button�(Qk�)�6alue='�(�8�)label}' onclick="javascript:toggleObj('${element.id}')" b6` : `<a class='togglelink' title='${tooltip}' href="javascript:toggleObj('${element.id}')">�(�8�)label}</a>`; /XëIf cookie setting is enabled, save�4he new state in a cookie. if (T_e.set_cookie == 1) updateToggleCookie(element.id, state); } } function updateToggleCookie(element_id, state) { ]å Retrieve... var�4oggleCookieName = window.toggleData.toggle_cookie_name; var toggleCookieNameRegex = new RegExp(`�(�8�)toggleCookieName}=([^;]+)`); var�4oggleCookieData = document.cookie.match(toggleCookieNameRegex); var toggleElementStates = toggleCookieData ? JSON.parse(toggleCookieData[1]) :"�(; /XëModify... toggleElementStates[element_id] = state; ]å Store. � document.cookie = `�(�8�)toggleCookieName}=�(�8�)JSON.stringify(toggleElementStates)}; path=/`; } --></script> <script type='textv®avascript'><�c- if (element = document.getElementById('problem1')) { element.style.display = 'none'; } window.toggleData['problem1'] ="� 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Show Solution', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --></script> <script type='textv®avascript'><�c- if (element = document.getElementById('problem2')) { element.style.display = 'none'; } window.toggleData['problem2'] ="� 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Show Solution', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --></script> <script type='textv®avascript'><�c- if (element = document.getElementById('problem3')) { element.style.display = 'none'; } window.toggleData['problem3'] ="� 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Show Solution', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --></script> <script type='textv®avascript'><�c- if (element = document.getElementById('problem4')) { element.style.display = 'none'; } window.toggleData['problem4'] ="� 'new_state_to_toggle_to': 'show', 'toggle_link_label_in_hidden_state': 'Show Solution', 'toggle_link_label_in_visible_state': 'Hide', 'toggle_link_tooltip_in_hidden_state': 'Show', 'toggle_link_tooltip_in_visible_state': 'Hide', 'id_of_alternate_element': '', 'display': 'block', 'is_button': '1', 'group': '', 'set_cookie': '' }; --></script> <uody> <vvtml> <!--�?�?lobal site�4ag (gtag.js) -�?�?oogle Analytics --> <script async src="https:/|øww.googletagmanager.com/gtagv®s?id=G-14BXFXE5GM"><ztcript> <script> window.dataLayer =�7indow.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-14BXFXE5GM'); <ztcript><!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> �!�!title>Streaming Chatbot<zËitle> <style> #apmchatbotWrapper" all: initial; font-family: sans-serif; } #apmchatbotWrapper #chatbotContainer { position: fixed; bottom: 20px; right: �(eå�)px; width: 5 50px; height: 5 50px; border-radius: 50%; background-color: #007aff; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); cursor:�0ointer; z-index: 1000; animation: pulse ¼ infinite; display: flex; align-items: center; justify-content: center; transition: all 0.�A�U ease; �( #apmchatbotWrapper #chatbotContainer.expanded { width: auto; height: auto; min-width: �(ry�)0px; max-width: 90vw; max-height: 90vh; padding: 10px; border-radius: �(eå�)px; animation: none; background-color: rgba(�(ry�)5, 255, �(ry�)5, 0.95); box-shadow: 0 0 �(eå�)px rgba(0, 0, 0, 0.5); overflow-y: auto; overflow-x: auto; right: �(eå�)px; left: auto; flex-direction: column; } @media (min-width: 768px)" #apmchatbotWrapper #chatbotContainer.expanded" max-width: 800px; �( �( #apmchatbotWrapper #chatbotIcon { font-size: 2 20px; color: white; �( #apmchatbotWrapper #chatbotContainer.expanded #chatbotIcon" display: none; } #apmchatbotWrapper #chatContent" display: none; flex-direction: column; height: auto; min-width: 250px; max-width: 88vw; max-height: 88vh; �0adding: 5px; border-radius: 5px; background-color: rgba(�(ry�)5, 255, �(ry�)5, 0.9); box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); overflow-y: auto; overflow-x: hidden; } #apmchatbotWrapper #chatbotContainer.expanded #chatContent { display: flex; �( #apmchatbotWrapper #chatBox { flex-grow: 1; overflow-y: auto; border: none; padding: 10px; background-color: #f0f0f0; border-radius: 10px; margin-bottom: 10px; } #apmchatbotWrapper .message�0re" display: block; max-width: 100%; overflow-x: auto; white-space:�0re; padding: 10px; background-color: #d3d3d3; color: #030303; border-radius: 5px; margin: 5px 0; �( #apmchatbotWrapper .message code" background-color: #d3d3d3; color: #030303; padding: 2px 2 2 2px; border-radius: 2 2px; } #apmchatbotWrapper #messageInput, #apmchatbotWrapper #sendMessageButton" �0adding: 10px; border: ßx solid #ccc; border-radius: 20px; font-size: px; } #apmchatbotWrapper #messageInput { flex-grow: 1; margin-right: 10px; } #apmchatbotWrapper #sendMessageButton" background-color: #007aff; color:�7hite; border: none; cursor: pointer; �( #apmchatbotWrapper #sendMessageButton:hover { background-color: #005bb5; �( #apmchatbotWrapper #minimizeButton" background-color: #007aff; color:�7hite; border: none; cursor: pointer; border-radius: �(eå�)px; padding: 10px; margin-left: 10px; } #apmchatbotWrapper #minimizeButton:hover { background-color: #005bb5; �( #apmchatbotWrapper .message { margin: 5px 0; �0adding: 10px; border-radius: 20px; max-width: 100%; font-size: 1²äx; line-height: 1.4; �7ord-wrap: break-word; } #apmchatbotWrapper .sent { align-self: flex-end; background-color: #007aff; color: white; border-bottom-right-radius: 0; } #apmchatbotWrapper .received { align-self: flex-start; background-color: #e5e5ea; color: black; border-bottom-left-radius: 0; �( #apmchatbotWrapper .typing" align-self: flex-start; font-style: italic; color: #888; } @keyframes pulse { 0%"�4ransform: scale(1); } 50% { transform: scale(1.1);�( 100% { transform: scale(1);�( �( �!�!zttyle> </head> <body> �!�!div id="apmchatbotWrapper"> <div id="chatbotContainer"> <div id="chatbotIcon">💬</div> �!�!div id="chatContent"> <div id="chatBox"></div> �!�!div style="display: flex; align-items: center;"> �!�!input type="text" id="messageInput" placeholder="Ask a�iuestion..."> �!�!button id="sendMessageButton" onclick="sendMessage()">Send</button> <button id="minimizeButton" onclick="minimizeChat()">Minimize<uutton> �!�!u(iv> </div> �!�!u(iv> </div> <script src="https:/udn.jsdelivr.net/npm/markedwÛarked.min.js"></script> <script> const chatbotContainer = document.querySelector('#apmchatbotWrapper #chatbotContainer'); const chatContent = document.querySelector('#apmchatbotWrapper #chatContent'); chatbotContainer.addEventListener('click', function(event)" if (event.target === chatbotContainer�=| event.target === document.querySelector('#apmchatbotWrapper #chatbotIcon')) { chatbotContainer.classList.toggle('expanded'); �( �(); function minimizeChat() { chatbotContainer.classList.remove('expanded'); chatbotContainer.style.maxWidth = ""; �( function sendMessage()" const input = document.querySelector('#apmchatbotWrapper #messageInput'); const message = input.value.trim(); if (message)" displayMessage(message, 'sent'); const�4ypingIndicator = displayMessage('AI is�4yping...', 'typing',�4rue); const�0ageContent = document.body.innerText.trim(); const�0ayload = `Context:�.{pageContent} \n\n Question:�.{message}`; const�7ebsocket = new 2 2 2 2ebSocket('wss:]åhedengren.net/apmchat'); input.value = ''; let streamingText = ''; let receivedMessageElement = null; websocket.onopen = function() { websocket.send(payload); �(; �7ebsocket.onmessage = function(event)" if (!receivedMessageElement) { removeMessage(typingIndicator); receivedMessageElement = document.createElement('div'); receivedMessageElement.className = 'message received'; document.querySelector('#apmchatbotWrapper #chatBox').appendChild(receivedMessageElement); } streamingText += event.data; receivedMessageElement.innerHTML = marked.parse(streamingText); document.querySelector('#apmchatbotWrapper #chatBox').scrollTop = document.querySelector('#apmchatbotWrapper #chatBox').scrollHeight; �(; �7ebsocket.onerror = function() { removeMessage(typingIndicator); displayMessage('Error in connection', 'received'); �7ebsocket.close(); }; �( �( function displayMessage(text, className, returnElement = false) { const messageDiv = document.createElement('div'); messageDiv.className = 'message ' + className; messageDiv.innerHTML = marked.parse(text); document.querySelector('#apmchatbotWrapper #chatBox').appendChild(messageDiv); document.querySelector('#apmchatbotWrapper #chatBox').scrollTop = document.querySelector('#apmchatbotWrapper #chatBox').scrollHeight; if (returnElement) return messageDiv; } function removeMessage(element)" if (element�.�.�.& element.parentNode) { element.parentNode.removeChild(element); �( �( document.querySelector('#apmchatbotWrapper #messageInput').addEventListener('keypress', function(e) { if (e.key === 'Enter')" sendMessage(); } }); </script> </body> </html> �<�/�d�i�v�>�<�d�i�v� �c�l�a�s�s�=�"�n�a�k�e�d�_�c�t�r�l�"�>� �<�f�o�r�m� �a�c�t�i�o�n�=�"�/�i�n�d�e�x�.�c�g�i�/�c�o�n�t�r�a�s�t�"� �m�e�t�h�o�d�=�"�g�e�t�"� �n�a�m�e�=�"�g�a�t�e�"�>� �<�p�>�<�a� �h�r�e�f�=�"�h�t�t�p�:�/�/�a�l�t�s�t�y�l�e�.�a�l�f�a�s�a�d�o�.�n�e�t�"�>�A�l�t�S�t�y�l�e�<�/�a�>� 0k0ˆ0c0fY cÛ0U0Œ0_0Ú0ü0¸� �<�a� �h�r�e�f�=�"�h�t�t�p�:�/�/�a�p�m�o�n�i�t�o�r�.�c�o�m�/�p�d�c�/�i�n�d�e�x�.�p�h�p�/�M�a�i�n�/�P�y�t�h�o�n�D�i�f�f�e�r�e�n�t�i�a�l�E�q�u�a�t�i�o�n�s�"�>�(�-�&�g�t�;0ª0ê0¸0Ê0ë�)�<�/�a�>� �/� �<�l�a�b�e�l�>0¢0É0ì0¹�:� �<�i�n�p�u�t� �t�y�p�e�=�"�t�e�x�t�"� �n�a�m�e�=�"�n�a�k�e�d�_�p�o�s�t�_�u�r�l�"� �v�a�l�u�e�=�"�h�t�t�p�:�/�/�a�p�m�o�n�i�t�o�r�.�c�o�m�/�p�d�c�/�i�n�d�e�x�.�p�h�p�/�M�a�i�n�/�P�y�t�h�o�n�D�i�f�f�e�r�e�n�t�i�a�l�E�q�u�a�t�i�o�n�s�"� �s�i�z�e�=�"�2�2�"� �/�>�<�/�l�a�b�e�l�>� �<�l�a�b�e�l�>0â0ü0É�:� �<�s�e�l�e�c�t� �n�a�m�e�=�"�n�a�k�e�d�_�p�o�s�t�_�m�o�d�e�"�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�d�e�f�a�u�l�t�"�>0Ç0Õ0©0ë0È�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�s�p�e�e�c�h�"�>—óXð0Ö0é0¦0¶�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�r�u�b�y�"�>0ë0ÓNØ0M�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�c�o�n�t�r�a�s�t�"� �s�e�l�e�c�t�e�d�=�"�s�e�l�e�c�t�e�d�"�>‘M‚rSÍŽâ�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�l�a�r�g�e�r�-�t�e�x�t�"�>e‡[WbáY'�<�/�o�p�t�i�o�n�>� �<�o�p�t�i�o�n� �v�a�l�u�e�=�"�m�o�b�i�l�e�"�>0â0Ð0¤0ë�<�/�o�p�t�i�o�n�>� �<�/�s�e�l�e�c�t�>� �<�i�n�p�u�t� �t�y�p�e�=�"�s�u�b�m�i�t�"� �v�a�l�u�e�=�"ˆhy:�"� �/�>� �<�/�p�>� �<�/�f�o�r�m�>� �<�/�d�i�v�>� � �