<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Synapsys Blog</title>
        <link>https://synapsys-lab.github.io/synapsys/blog</link>
        <description>Tutorials, case studies and research insights from the Synapsys control systems framework.</description>
        <lastBuildDate>Thu, 23 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Synapsys Contributors</copyright>
        <item>
            <title><![CDATA[PID with Anti-Windup: Theory, Tuning and Experimental Validation]]></title>
            <link>https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research</link>
            <guid>https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research</guid>
            <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A research-oriented deep-dive into discrete PID with back-calculation anti-windup — from the integral windup problem to experimental step-response validation, with Synapsys code throughout.
]]></description>
            <content:encoded><![CDATA[<p>Integral windup is one of the most common failure modes in deployed PID controllers.
This post covers the problem from first principles, derives the back-calculation
anti-windup scheme, shows how Synapsys implements it, and validates the design
against a simulated second-order plant.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-windup-problem">The windup problem<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#the-windup-problem" class="hash-link" aria-label="Direct link to The windup problem" title="Direct link to The windup problem">​</a></h2>
<p>A PID controller with output saturation has a nasty interaction: when the actuator
is saturated, the integrator keeps accumulating error even though the output is
clamped. When the error sign reverses, the integrator takes a long time to "wind
down" before the output leaves saturation — causing overshoot and oscillation.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">Error ─► [P]──────────────► sum ─► [saturation] ─► u</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">         [I → accumulate] ──►          │</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">         [D] ────────────► ┘           │</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                 ▲                     │</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                 └─── windup occurs ───┘</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                      when e &gt; 0 and u = u_max</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="toy-example-windup-in-action">Toy example: windup in action<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#toy-example-windup-in-action" class="hash-link" aria-label="Direct link to Toy example: windup in action" title="Direct link to Toy example: windup in action">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PID</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> c2d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pid_no_aw </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> PID</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Kp</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">5.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Ki</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">2.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Kd</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                u_min</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_max</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                anti_windup</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">False</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)"># windup enabled</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">x </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">setpoint </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5.0</span><span class="token plain">       </span><span class="token comment" style="color:rgb(106, 153, 85)"># large step — will saturate the output</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">outputs </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> _ </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">range</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">500</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># 5 s</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    y </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> x              </span><span class="token comment" style="color:rgb(106, 153, 85)"># y = x for this plant</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    u </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">pid_no_aw</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">compute</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">setpoint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">float</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    u_sat </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">clip</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">u</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># saturation outside PID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> _ </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> plant</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">evolve</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_sat</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    outputs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token builtin" style="color:rgb(86, 156, 214)">float</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The output reaches setpoint but then heavily overshoots because the integrator
accumulated <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn><mo>×</mo><mn>500</mn><mo>×</mo><mn>0.01</mn><mo>=</mo><mn>25</mn></mrow><annotation encoding="application/x-tex">5 \times 500 \times 0.01 = 25</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em"></span><span class="mord">500</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">0.01</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">25</span></span></span></span> (units) of error during saturation.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="back-calculation-anti-windup">Back-calculation anti-windup<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#back-calculation-anti-windup" class="hash-link" aria-label="Direct link to Back-calculation anti-windup" title="Direct link to Back-calculation anti-windup">​</a></h2>
<p>The back-calculation scheme feeds the saturation error back to the integrator
with gain <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mi mathvariant="normal">/</mi><msub><mi>T</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">1/T_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord">1/</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span> (tracking time constant):</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>I</mi><mo>˙</mo></mover><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>K</mi><mi>i</mi></msub><mo>⋅</mo><mi>e</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>+</mo><mfrac><mn>1</mn><msub><mi>T</mi><mi>t</mi></msub></mfrac><mo fence="true" stretchy="true" minsize="1.2em" maxsize="1.2em">[</mo><msub><mi>u</mi><mrow><mi>s</mi><mi>a</mi><mi>t</mi></mrow></msub><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><msub><mi>u</mi><mrow><mi>u</mi><mi>n</mi><mi>s</mi></mrow></msub><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo fence="true" stretchy="true" minsize="1.2em" maxsize="1.2em">]</mo></mrow><annotation encoding="application/x-tex">\dot{I}(t) = K_i \cdot e(t) + \frac{1}{T_t}\bigl[u_{sat}(t) - u_{uns}(t)\bigr]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1702em;vertical-align:-0.25em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9202em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0785em">I</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0278em"><span class="mord">˙</span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal">e</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:2.1574em;vertical-align:-0.836em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen"><span class="delimsizing size1">[</span></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">s</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mclose"><span class="delimsizing size1">]</span></span></span></span></span></span>
<p>When the output is <em>not</em> saturated, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>u</mi><mrow><mi>s</mi><mi>a</mi><mi>t</mi></mrow></msub><mo>=</mo><msub><mi>u</mi><mrow><mi>u</mi><mi>n</mi><mi>s</mi></mrow></msub></mrow><annotation encoding="application/x-tex">u_{sat} = u_{uns}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">s</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span> so the correction term is
zero — the integrator behaves normally. When saturated, the correction reduces the
integrator at a rate proportional to the saturation error.</p>
<p>A common choice is <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mi>t</mi></msub><mo>=</mo><msqrt><mrow><msub><mi>T</mi><mi>i</mi></msub><mi mathvariant="normal">/</mi><msub><mi>T</mi><mi>d</mi></msub></mrow></msqrt></mrow><annotation encoding="application/x-tex">T_t = \sqrt{T_i / T_d}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.305em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.935em"><span class="svg-align" style="top:-3.2em"><span class="pstrut" style="height:3.2em"></span><span class="mord" style="padding-left:1em"><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span><span style="top:-2.895em"><span class="pstrut" style="height:3.2em"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.305em"><span></span></span></span></span></span></span></span></span> (geometric mean), or simply
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mi>t</mi></msub><mo>=</mo><msub><mi>T</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">T_t = T_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span> when there is no derivative term.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="synapsys-implementation">Synapsys implementation<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#synapsys-implementation" class="hash-link" aria-label="Direct link to Synapsys implementation" title="Direct link to Synapsys implementation">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PID</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Anti-windup ON (default) — u_min/u_max trigger back-calculation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pid </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> PID</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    Kp    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">5.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    Ki    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    Kd    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    dt    </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    u_min </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    u_max </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">  </span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)"># anti_windup=True is default</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">u </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> pid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">compute</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">setpoint</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">5.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> measurement</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The <code>compute()</code> method returns the <strong>clamped</strong> output and applies back-calculation
internally — no external saturation needed.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="comparative-simulation">Comparative simulation<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#comparative-simulation" class="hash-link" aria-label="Direct link to Comparative simulation" title="Direct link to Comparative simulation">​</a></h2>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Simulation</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">Results</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> matplotlib</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">pyplot </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> plt</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PID</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> c2d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">run_sim</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">anti_windup</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">bool</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> n_steps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">800</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    pid </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> PID</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Kp</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">5.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Ki</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">2.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Kd</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.05</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              u_min</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_max</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> anti_windup</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">anti_windup</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    x </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    ys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> us </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">range</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">n_steps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        setpoint </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3.0</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">if</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">400</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">else</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">3.0</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># step then negative step</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        y </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">float</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        u </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">pid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">compute</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">setpoint</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> _ </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> plant</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">evolve</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        ys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> us</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token builtin" style="color:rgb(86, 156, 214)">float</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">u</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">us</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">t </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">arange</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">800</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">y_no</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_no </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> run_sim</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">anti_windup</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">False</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">y_aw</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_aw </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> run_sim</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">anti_windup</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">fig</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">subplots</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> figsize</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">9</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">6</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sharex</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y_no</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'No anti-windup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linestyle</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'--'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y_aw</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'Anti-windup'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linewidth</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">axhline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">3.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  color</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'gray'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linestyle</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">':'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linewidth</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">axhline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">3.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> color</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'gray'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linestyle</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">':'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linewidth</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">set_ylabel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Output"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">legend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> ax1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">grid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_no</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linestyle</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'--'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_aw</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linewidth</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">axhline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  color</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linestyle</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">':'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linewidth</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'u_max'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">axhline</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> color</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'red'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linestyle</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">':'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> linewidth</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.8</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> label</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">'u_min'</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">set_ylabel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Control (u)"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">set_xlabel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Time (s)"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">legend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> ax2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">grid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tight_layout</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">savefig</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"pid_antiwindup_comparison.png"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dpi</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">150</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><p><strong>Without anti-windup:</strong></p><ul>
<li>Positive step: output overshoots ~40% before settling</li>
<li>Negative step: large transient because integrator was wound up to limit</li>
</ul><p><strong>With anti-windup:</strong></p><ul>
<li>Both steps: clean first-order-like response</li>
<li>Overshoot &lt; 5%</li>
<li>Settling time reduced by ~60%</li>
</ul></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="tuning-guidelines-for-research">Tuning guidelines for research<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#tuning-guidelines-for-research" class="hash-link" aria-label="Direct link to Tuning guidelines for research" title="Direct link to Tuning guidelines for research">​</a></h2>
<table><thead><tr><th>Parameter</th><th>Effect</th><th>Starting point</th></tr></thead><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>p</mi></msub></mrow><annotation encoding="application/x-tex">K_p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span></td><td>Speed of response</td><td>FOPDT: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>p</mi></msub><mo>=</mo><mn>0.6</mn><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><msub><mi>K</mi><mrow><mi>p</mi><mi>l</mi><mi>a</mi><mi>n</mi><mi>t</mi></mrow></msub><mo>⋅</mo><mi>τ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">K_p = 0.6 / (K_{plant} \cdot \tau)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em"></span><span class="mord">0.6/</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0197em">pl</span><span class="mord mathnormal mtight">an</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.1132em">τ</span><span class="mclose">)</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>i</mi></msub><mo>=</mo><msub><mi>K</mi><mi>p</mi></msub><mi mathvariant="normal">/</mi><msub><mi>T</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">K_i = K_p / T_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mord">/</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span></td><td>Steady-state error elimination</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mi>i</mi></msub><mo>=</mo><mn>2</mn><mi>τ</mi></mrow><annotation encoding="application/x-tex">T_i = 2\tau</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.1132em">τ</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>K</mi><mi>d</mi></msub><mo>=</mo><msub><mi>K</mi><mi>p</mi></msub><mo>⋅</mo><msub><mi>T</mi><mi>d</mi></msub></mrow><annotation encoding="application/x-tex">K_d = K_p \cdot T_d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span></td><td>Damping, noise amplification</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mi>d</mi></msub><mo>=</mo><mi>τ</mi><mi mathvariant="normal">/</mi><mn>4</mn></mrow><annotation encoding="application/x-tex">T_d = \tau / 4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.1132em">τ</span><span class="mord">/4</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>u</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow></msub><mo separator="true">,</mo><msub><mi>u</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub></mrow><annotation encoding="application/x-tex">u_{min}, u_{max}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span></span></span></span></td><td>Actuator limits</td><td>Physical actuator spec</td></tr></tbody></table>
<p>For discrete implementations, always use a <strong>sampling rate at least 10× the closed-loop bandwidth</strong> to avoid discretisation artefacts in the derivative term.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="connection-to-the-broader-literature">Connection to the broader literature<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#connection-to-the-broader-literature" class="hash-link" aria-label="Direct link to Connection to the broader literature" title="Direct link to Connection to the broader literature">​</a></h2>
<p>The back-calculation scheme used in Synapsys follows <strong>Åström &amp; Hägglund (2006)</strong>
<em>Advanced PID Control</em>, Chapter 6. The discrete formulation uses the <strong>bilinear
(Tustin) approximation</strong> for the integrator, which avoids the frequency-domain
distortion of forward Euler at high gains.</p>
<div class="language-bibtex codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bibtex codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">@book{astrom2006advanced,</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  author    = {Åström, Karl Johan and Hägglund, Tore},</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  title     = {Advanced PID Control},</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  publisher = {ISA — The Instrumentation, Systems, and Automation Society},</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  year      = {2006},</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  isbn      = {978-1556175169},</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://synapsys-lab.github.io/synapsys/blog/pid-anti-windup-research#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<table><thead><tr><th>Feature</th><th>Synapsys <code>PID</code></th></tr></thead><tbody><tr><td>Discrete time</td><td>✓ (fixed <code>dt</code>)</td></tr><tr><td>Anti-windup</td><td>✓ back-calculation (default on)</td></tr><tr><td>Output limits</td><td><code>u_min</code>, <code>u_max</code></td></tr><tr><td>Derivative filter</td><td>✓ first-order Tustin</td></tr><tr><td>Reset</td><td><code>pid.reset()</code></td></tr></tbody></table>
<p>The full API reference is at <a href="https://synapsys-lab.github.io/synapsys/docs/api/algorithms">synapsys.algorithms →</a>.</p>]]></content:encoded>
            <category>Artigo</category>
            <category>Research</category>
            <category>PID</category>
            <category>Control Theory</category>
            <category>Simulation</category>
            <category>Python</category>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[From Model to Hardware: MIL → SIL → HIL in Three Steps]]></title>
            <link>https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment</link>
            <guid>https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical guide to the MIL/SIL/HIL development workflow with Synapsys — swap from simulation to real hardware by changing one line, keeping your control algorithm untouched.
]]></description>
            <content:encoded><![CDATA[<div align="center"><p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/synapsys-lab/synapsys/main/website/static/img/examples/03_sil_ai_controller.gif" alt="SIL Neural-LQR" class="img_ev3q"></p></div>
<p><strong>MIL → SIL → HIL</strong> is the standard V-model progression for embedded control:
simulate everything first, then replace the plant model with real hardware one
layer at a time. In most frameworks this requires rewriting large parts of the
control loop. In Synapsys the transition is a <strong>one-line swap</strong> because the
transport layer is fully abstracted from the algorithm.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-three-stages">The three stages<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#the-three-stages" class="hash-link" aria-label="Direct link to The three stages" title="Direct link to The three stages">​</a></h2>
<table><thead><tr><th>Stage</th><th>Plant</th><th>Controller</th><th>Transport</th><th>Purpose</th></tr></thead><tbody><tr><td><strong>MIL</strong> — Model-in-the-Loop</td><td>Simulated (<code>StateSpace</code>)</td><td>Algorithm code</td><td>Shared memory</td><td>Rapid iteration, unit tests</td></tr><tr><td><strong>SIL</strong> — Software-in-the-Loop</td><td>Simulated</td><td>Compiled binary / external process</td><td>ZeroMQ</td><td>Integration tests, latency profiling</td></tr><tr><td><strong>HIL</strong> — Hardware-in-the-Loop</td><td>Real device</td><td>Algorithm code or MCU firmware</td><td><code>HardwareInterface</code></td><td>Acceptance testing on real plant</td></tr></tbody></table>
<p>The Synapsys abstraction that makes this work:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">Agent ──► TransportStrategy (read / write)</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              │</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              ├── SharedMemoryTransport   ← MIL</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              ├── ZMQTransport            ← SIL</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              └── HardwareInterface       ← HIL</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The <code>Agent</code> never calls transport directly — it calls <code>_read()</code> / <code>_write()</code>.
Swap the transport, leave the agent unchanged.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stage-1--mil-everything-in-one-process">Stage 1 — MIL: everything in one process<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#stage-1--mil-everything-in-one-process" class="hash-link" aria-label="Direct link to Stage 1 — MIL: everything in one process" title="Direct link to Stage 1 — MIL: everything in one process">​</a></h2>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">agents </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncMode</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PID</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">transport </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> SharedMemoryTransport</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant_d </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> c2d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pid </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> PID</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Kp</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">4.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Ki</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">pid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">compute</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">setpoint</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">3.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> measurement</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">with</span><span class="token plain"> SharedMemoryTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"demo"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string" style="color:rgb(206, 145, 120)">"y"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"u"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> create</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"y"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"u"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    sync </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">LOCK_STEP</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"plant"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">False</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"ctrl"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>All in one script. Fast, deterministic, easy to unit-test.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stage-2--sil-two-processes-over-zeromq">Stage 2 — SIL: two processes over ZeroMQ<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#stage-2--sil-two-processes-over-zeromq" class="hash-link" aria-label="Direct link to Stage 2 — SIL: two processes over ZeroMQ" title="Direct link to Stage 2 — SIL: two processes over ZeroMQ">​</a></h2>
<p>Split plant and controller into separate processes. The controller algorithm
<strong>does not change at all</strong>:</p>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">plant_process.py</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">controller_process.py</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">agents </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncMode</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">transport </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ZMQTransport</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant_d </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> c2d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pub </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ZMQTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"tcp://*:5555"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      mode</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"pub"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># publish y</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sub </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ZMQTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"tcp://localhost:5556"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> mode</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"sub"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(106, 153, 85)"># subscribe u</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># ZMQTransport wraps both sockets in a single bus-like interface</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># (see ZMQReqRepTransport for request-reply pattern)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sync </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">WALL_CLOCK</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"plant"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> pub</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sub_transport</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">sub</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">agents </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncMode</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PID</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">transport </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ZMQTransport</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pid </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> PID</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">Kp</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">4.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Ki</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">pid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">compute</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">setpoint</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">3.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> measurement</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sub </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ZMQTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"tcp://localhost:5555"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> mode</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"sub"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># subscribe y</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pub </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ZMQTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"tcp://*:5556"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">         mode</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"pub"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># publish u</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sync </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">WALL_CLOCK</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"ctrl"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sub</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> pub_transport</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">pub</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<p>The <code>law</code> function is <strong>identical</strong> to the MIL version. Only the transport changed.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stage-3--hil-real-hardware">Stage 3 — HIL: real hardware<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#stage-3--hil-real-hardware" class="hash-link" aria-label="Direct link to Stage 3 — HIL: real hardware" title="Direct link to Stage 3 — HIL: real hardware">​</a></h2>
<p>Replace the <code>StateSpace</code> plant with a <code>HardwareInterface</code> implementation for your
device. Everything else — the PID, the sync engine, the ZMQ transport — stays:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">agents </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> HardwareAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncMode</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">hw </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> HardwareInterface</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">transport </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ZMQTransport</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">MyDAQInterface</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">HardwareInterface</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(206, 145, 120)">"""Wrapper around a USB DAQ card (e.g. NI-DAQ, Arduino, STM32)."""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">__init__</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token builtin" style="color:rgb(86, 156, 214)">super</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">__init__</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">n_inputs</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> n_outputs</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)"># self.daq = ...  initialise your hardware SDK here</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">read_outputs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> timeout_ms</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">float</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)"># return np.array([self.daq.read_channel(0)])</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># stub</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">write_inputs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> timeout_ms</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">float</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">100.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)"># self.daq.write_channel(0, float(u[0]))</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">pass</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Drop-in replacement: HardwareAgent instead of PlantAgent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sub </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ZMQTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"tcp://localhost:5556"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> mode</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"sub"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">pub </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ZMQTransport</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"tcp://*:5555"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">         mode</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"pub"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sync </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">WALL_CLOCK</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">HardwareAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"hw"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> MyDAQInterface</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> pub</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sub_transport</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">sub</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The controller process <strong>does not change</strong>. The swap is surgical.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="common-pitfalls">Common pitfalls<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#common-pitfalls" class="hash-link" aria-label="Direct link to Common pitfalls" title="Direct link to Common pitfalls">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="timing-jitter-in-sil">Timing jitter in SIL<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#timing-jitter-in-sil" class="hash-link" aria-label="Direct link to Timing jitter in SIL" title="Direct link to Timing jitter in SIL">​</a></h3>
<p><code>WALL_CLOCK</code> sync relies on <code>time.sleep()</code> precision. On Linux with a standard
kernel, expect ±0.5 ms jitter at 100 Hz. For tighter requirements:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Use LOCK_STEP for in-process simulation (no timing issues)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sync </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">LOCK_STEP</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Use WALL_CLOCK for cross-process / HIL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sync </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">WALL_CLOCK</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="initial-condition-mismatch">Initial condition mismatch<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#initial-condition-mismatch" class="hash-link" aria-label="Direct link to Initial condition mismatch" title="Direct link to Initial condition mismatch">​</a></h3>
<p>Always initialise shared channels <strong>before</strong> starting agents:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"y"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># ← do this</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">bus</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"u"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># ← do this</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">False</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>A controller that reads before the first plant write will get stale zeros — fine
for ZOH semantics, but worth being explicit.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary">Summary<a href="https://synapsys-lab.github.io/synapsys/blog/mil-sil-hil-control-deployment#summary" class="hash-link" aria-label="Direct link to Summary" title="Direct link to Summary">​</a></h2>
<p>The MIL → SIL → HIL transition with Synapsys is:</p>
<ol>
<li><strong>MIL</strong>: <code>SharedMemoryTransport</code> + <code>PlantAgent</code> + <code>ControllerAgent</code></li>
<li><strong>SIL</strong>: swap to <code>ZMQTransport</code>, split into two processes</li>
<li><strong>HIL</strong>: swap <code>PlantAgent</code> for <code>HardwareAgent(MyDAQInterface(), ...)</code></li>
</ol>
<p>The control <strong>algorithm never changes</strong>. The <code>law</code> function you wrote on day one
runs unchanged on the real hardware.</p>
<p>See the full SIL example at
<a href="https://github.com/synapsys-lab/synapsys/tree/main/examples/advanced/02_sil_ai_controller" target="_blank" rel="noopener noreferrer"><code>examples/advanced/02_sil_ai_controller/</code></a>.</p>]]></content:encoded>
            <category>Post</category>
            <category>Tutorial</category>
            <category>SIL</category>
            <category>HIL</category>
            <category>Simulation</category>
            <category>Python</category>
            <category>Control Theory</category>
        </item>
        <item>
            <title><![CDATA[MIMO Control of a Quadcopter with Neural-LQR]]></title>
            <link>https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr</link>
            <guid>https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr</guid>
            <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How to model a 12-state linearised quadrotor, design a MIMO LQR, augment it with a residual MLP, and simulate the closed-loop in 3D — a research-grade case study using Synapsys.
]]></description>
            <content:encoded><![CDATA[<div align="center"><p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/synapsys-lab/synapsys/main/website/static/img/examples/06_quadcopter_3d.gif" alt="Quadcopter 3D tracking" class="img_ev3q"></p></div>
<p>A quadrotor has four rotors, six rigid-body degrees of freedom, and fully coupled
rotational dynamics — it is the MIMO benchmark of aerial robotics. This post walks
through the complete design pipeline: physics → linearisation → LQR → Neural-LQR
residual → 3D simulation.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="state-space-model">State-space model<a href="https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr#state-space-model" class="hash-link" aria-label="Direct link to State-space model" title="Direct link to State-space model">​</a></h2>
<p>The 12-state linearisation around the hover equilibrium uses position
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x, y, z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0359em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.044em">z</span><span class="mclose">)</span></span></span></span>, velocity <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mover accent="true"><mi>x</mi><mo>˙</mo></mover><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo>˙</mo></mover><mo separator="true">,</mo><mover accent="true"><mi>z</mi><mo>˙</mo></mover><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\dot x, \dot y, \dot z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">x</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1111em"><span class="mord">˙</span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0359em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0833em"><span class="mord">˙</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em"><span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.044em">z</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0833em"><span class="mord">˙</span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>, Euler angles
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>ϕ</mi><mo separator="true">,</mo><mi>θ</mi><mo separator="true">,</mo><mi>ψ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\phi, \theta, \psi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord mathnormal">ϕ</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0359em">ψ</span><span class="mclose">)</span></span></span></span> and angular rates <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>p</mi><mo separator="true">,</mo><mi>q</mi><mo separator="true">,</mo><mi>r</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(p, q, r)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord mathnormal">p</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0359em">q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0278em">r</span><span class="mclose">)</span></span></span></span>.
The four inputs are rotor thrust deviations <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>δ</mi><msub><mi>T</mi><mn>1</mn></msub><mo>…</mo><mi>δ</mi><msub><mi>T</mi><mn>4</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\delta T_1 \ldots \delta T_4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0379em">δ</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0379em">δ</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>,
mixed into collective thrust <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi><mi>F</mi></mrow><annotation encoding="application/x-tex">\delta F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em"></span><span class="mord mathnormal" style="margin-right:0.0379em">δ</span><span class="mord mathnormal" style="margin-right:0.1389em">F</span></span></span></span> and three torques <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>τ</mi><mi>ϕ</mi></msub><mo separator="true">,</mo><msub><mi>τ</mi><mi>θ</mi></msub><mo separator="true">,</mo><msub><mi>τ</mi><mi>ψ</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\tau_\phi, \tau_\theta, \tau_\psi)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">ϕ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0359em">ψ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> lqr</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Build matrices (from examples/advanced/06_quadcopter_mimo/quadcopter_dynamics.py)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> quadcopter_dynamics </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> build_matrices</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> C</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> D </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> build_matrices</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">          </span><span class="token comment" style="color:rgb(106, 153, 85)"># A: 12×12, B: 12×4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> C</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> D</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f"Poles: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">np</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation">sort</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation">np</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation">real</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation">plant</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation">poles</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Several poles at 0 — marginally stable (rigid body)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The hover equilibrium has integrators for <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x, y, z)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0359em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.044em">z</span><span class="mclose">)</span></span></span></span> — any disturbance causes
drift without active feedback. LQR closes those loops.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mimo-lqr-design">MIMO LQR design<a href="https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr#mimo-lqr-design" class="hash-link" aria-label="Direct link to MIMO LQR design" title="Direct link to MIMO LQR design">​</a></h2>
<p>The MIMO Riccati equation is identical in form to the SISO case — Synapsys handles
the matrix dimensions automatically:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># State cost: position and attitude tight, velocities light</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">q_pos  </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">10.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain">  q_vel </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">q_att  </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">20.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain">  q_rate </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">Q </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">diag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    q_pos</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_pos</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_pos</span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)"># x, y, z</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    q_vel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_vel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_vel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)"># ẋ, ẏ, ż</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    q_att</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_att</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_att</span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token comment" style="color:rgb(106, 153, 85)"># φ, θ, ψ</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    q_rate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_rate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> q_rate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">     </span><span class="token comment" style="color:rgb(106, 153, 85)"># p, q, r</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">R </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">eye</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token plain">             </span><span class="token comment" style="color:rgb(106, 153, 85)"># actuator cost</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">K</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> P </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> lqr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> R</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">         </span><span class="token comment" style="color:rgb(106, 153, 85)"># K: 4×12</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f"K shape: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">K</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation">shape</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># (4, 12)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Verify closed-loop stability:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">A_cl </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> A </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> B @ K</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">eigs </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">linalg</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">eigvals</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A_cl</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f"Stable: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">np</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation builtin" style="color:rgb(86, 156, 214)">all</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation">np</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation">real</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation">eigs</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation operator" style="color:rgb(212, 212, 212)">&lt;</span><span class="token string-interpolation interpolation"> </span><span class="token string-interpolation interpolation number" style="color:rgb(181, 206, 168)">0</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f"Most negative: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">np</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation">real</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation">eigs</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token string-interpolation interpolation builtin" style="color:rgb(86, 156, 214)">min</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token string-interpolation interpolation format-spec">.2f</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="residual-neural-lqr">Residual Neural-LQR<a href="https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr#residual-neural-lqr" class="hash-link" aria-label="Direct link to Residual Neural-LQR" title="Direct link to Residual Neural-LQR">​</a></h2>
<p>The residual architecture augments the LQR baseline with a learned correction:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>u</mi><mo>=</mo><mo>−</mo><mi>K</mi><mi>e</mi><mo>+</mo><munder><munder><mrow><mtext>MLP</mtext><mo stretchy="false">(</mo><mi>e</mi><mo stretchy="false">)</mo></mrow><mo stretchy="true">⏟</mo></munder><mtext>residual</mtext></munder></mrow><annotation encoding="application/x-tex">u = -Ke + \underbrace{\text{MLP}(e)}_{\text{residual}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">u</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em"></span><span class="mord">−</span><span class="mord mathnormal" style="margin-right:0.0715em">K</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:2.3341em;vertical-align:-1.5841em"></span><span class="minner munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.75em"><span style="top:-1.4159em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">residual</span></span></span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="minner munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.75em"><span class="svg-align" style="top:-2.102em"><span class="pstrut" style="height:3em"></span><span class="stretchy" style="height:0.548em;min-width:1.6em"><span class="brace-left" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13
 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688
 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7
-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"></path></svg></span><span class="brace-center" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214
c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14
 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3
 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0
-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"></path></svg></span><span class="brace-right" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3
 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237
-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"></path></svg></span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord text"><span class="mord">MLP</span></span><span class="mopen">(</span><span class="mord mathnormal">e</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.898em"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5841em"><span></span></span></span></span></span></span></span></span></span>
<p>The key property: the MLP output layer is <strong>initialised to zero</strong>. At deployment
the controller is <em>exactly</em> LQR — the residual adds correction only after training.
This guarantees provable stability at initialisation.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> torch</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> torch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">nn </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> nn</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(78, 201, 176)">ResidualMLP</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Module</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">__init__</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> n_states</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> n_inputs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">int</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token builtin" style="color:rgb(86, 156, 214)">super</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">__init__</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">net </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Sequential</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Linear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">n_states</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">64</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Tanh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Linear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">64</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">64</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">       nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Tanh</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">            nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Linear</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">64</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> n_inputs</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">             </span><span class="token comment" style="color:rgb(106, 153, 85)"># output layer</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)"># Zero-initialise output layer → MLP(e) = 0 at start</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros_</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">net</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">weight</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        nn</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">init</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros_</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">net</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">bias</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">forward</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> torch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Tensor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> torch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">Tensor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">net</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">mlp </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ResidualMLP</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">n_states</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> n_inputs</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Control law plugged into ControllerAgent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">neural_lqr_law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">with</span><span class="token plain"> torch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">no_grad</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        e_t </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> torch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">tensor</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dtype</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">torch</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">float32</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">        </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">K @ e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">+</span><span class="token plain"> mlp</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">e_t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">numpy</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The MLP can later be trained via imitation learning (clone optimal trajectories) or
RL (reward = tracking error + effort) without losing the stability guarantee as long
as the residual is bounded.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="closed-loop-simulation-with-synapsys">Closed-loop simulation with Synapsys<a href="https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr#closed-loop-simulation-with-synapsys" class="hash-link" aria-label="Direct link to Closed-loop simulation with Synapsys" title="Direct link to Closed-loop simulation with Synapsys">​</a></h2>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">agents </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SyncMode</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">broker </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> MessageBroker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Topic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> SharedMemoryBackend</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">dt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.02</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># 50 Hz</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant_d </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> c2d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">plant</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">dt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Topics</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">topics </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">Topic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"quad/state"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> shape</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">12</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Topic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"quad/u"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> shape</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">4</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">broker </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> MessageBroker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> t </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> topics</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    broker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">declare_topic</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">broker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">add_backend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SharedMemoryBackend</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"quad_bus"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> topics</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> create</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Initial hover reference</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ref </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1.5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">  </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(220, 220, 170)">law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token operator" style="color:rgb(212, 212, 212)">&gt;</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ndarray</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    e </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ref </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> y</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token keyword" style="color:rgb(86, 156, 214)">return</span><span class="token plain"> neural_lqr_law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">e</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">sync  </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> SyncEngine</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">SyncMode</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">LOCK_STEP</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">dt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant_agent </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> PlantAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"quad"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                         channel_y</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"quad/state"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> channel_u</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"quad/u"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                         broker</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">broker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ctrl_agent  </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ControllerAgent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"ctrl"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> law</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> sync</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                               channel_y</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"quad/state"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> channel_u</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token string" style="color:rgb(206, 145, 120)">"quad/u"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">                               broker</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">broker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant_agent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">False</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">ctrl_agent</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">start</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">blocking</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">broker</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">close</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="results">Results<a href="https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr#results" class="hash-link" aria-label="Direct link to Results" title="Direct link to Results">​</a></h2>
<div align="center"><p><img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/synapsys-lab/synapsys/main/website/static/img/examples/06_quadcopter_telemetry.gif" alt="Quadcopter telemetry" class="img_ev3q"></p></div>
<p>The figure-8 trajectory tracking shows:</p>
<ul>
<li><strong>Position error</strong> &lt; 0.08 m RMS after the first orbit</li>
<li><strong>Euler angles</strong> stay within ±5° during aggressive manoeuvres</li>
<li><strong>Control inputs</strong> are smooth — the actuator cost in <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0077em">R</span></span></span></span> did its job</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="research-extensions">Research extensions<a href="https://synapsys-lab.github.io/synapsys/blog/quadcopter-mimo-neural-lqr#research-extensions" class="hash-link" aria-label="Direct link to Research extensions" title="Direct link to Research extensions">​</a></h2>
<p>This architecture is directly applicable to several open research problems:</p>
<ol>
<li><strong>RL fine-tuning</strong> — use the zero-init MLP as the policy network in a PPO/SAC agent;
the stability guarantee allows safe exploration.</li>
<li><strong>Disturbance rejection</strong> — add a wind gust term to <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal">A</span></span></span></span> and observe how the
LQR baseline handles structured disturbances vs. what the residual learns.</li>
<li><strong>Adaptive <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em"></span><span class="mord mathnormal">Q</span></span></span></span>/<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0077em">R</span></span></span></span></strong> — meta-learn the Riccati weights across a distribution
of payloads using the existing <code>lqr()</code> function as a differentiable layer.</li>
</ol>
<p>The full simulation code is at
<a href="https://github.com/synapsys-lab/synapsys/tree/main/examples/advanced/06_quadcopter_mimo" target="_blank" rel="noopener noreferrer"><code>examples/advanced/06_quadcopter_mimo/</code></a>.</p>]]></content:encoded>
            <category>Artigo</category>
            <category>Research</category>
            <category>MIMO</category>
            <category>LQR</category>
            <category>Neural-LQR</category>
            <category>Simulation</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Stabilising an Inverted Pendulum with LQR]]></title>
            <link>https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr</link>
            <guid>https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr</guid>
            <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A complete walkthrough: derive the linearised state-space model of an inverted pendulum, design an LQR controller, simulate the closed-loop response, and discretise for embedded deployment — all in Python with Synapsys.
]]></description>
            <content:encoded><![CDATA[<p>The inverted pendulum is the canonical benchmark of nonlinear control — unstable,
simple enough to model analytically, yet rich enough to reveal the full LQR design
workflow. This post derives the linearised model from physics and shows how to
stabilise it with Synapsys in a few dozen lines of Python.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="physics-and-linearisation">Physics and linearisation<a href="https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr#physics-and-linearisation" class="hash-link" aria-label="Direct link to Physics and linearisation" title="Direct link to Physics and linearisation">​</a></h2>
<p>A rigid rod of mass <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">m</span></span></span></span> and length <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal">L</span></span></span></span> is hinged at a cart. Let <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi></mrow><annotation encoding="application/x-tex">\theta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em"></span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span></span></span></span> be the angle
from the vertical upright. Linearising around <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\theta = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em"></span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">0</span></span></span></span> gives:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>θ</mi><mo>¨</mo></mover><mo>=</mo><mfrac><mi>g</mi><mi>L</mi></mfrac><mi>θ</mi><mo>−</mo><mfrac><mn>1</mn><mrow><mi>m</mi><msup><mi>L</mi><mn>2</mn></msup></mrow></mfrac><mi>u</mi></mrow><annotation encoding="application/x-tex">\ddot{\theta} = \frac{g}{L}\theta - \frac{1}{mL^2}u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9313em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9313em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord">¨</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.7936em;vertical-align:-0.686em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">L</span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">m</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord mathnormal">u</span></span></span></span></span>
<p>Choosing the state vector <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mo stretchy="false">[</mo><mi>θ</mi><mo separator="true">,</mo><mtext>  </mtext><mover accent="true"><mi>θ</mi><mo>˙</mo></mover><msup><mo stretchy="false">]</mo><mi mathvariant="normal">⊤</mi></msup></mrow><annotation encoding="application/x-tex">x = [\theta,\; \dot{\theta}]^\top</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.1813em;vertical-align:-0.25em"></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9313em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.0278em">θ</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.0556em"><span class="mord">˙</span></span></span></span></span></span></span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">⊤</span></span></span></span></span></span></span></span></span></span></span> and the cart force <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">u</span></span></span></span>:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>x</mi><mo>˙</mo></mover><mo>=</mo><munder><munder><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>g</mi><mi mathvariant="normal">/</mi><mi>L</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mo stretchy="true">⏟</mo></munder><mi>A</mi></munder><mtext> </mtext><mi>x</mi><mo>+</mo><munder><munder><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><mn>1</mn><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><mi>m</mi><msup><mi>L</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mo stretchy="true">⏟</mo></munder><mi>B</mi></munder><mtext> </mtext><mi>u</mi><mo separator="true">,</mo><mspace width="2em"></mspace><mi>y</mi><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">\dot{x} = \underbrace{\begin{bmatrix}0 &amp; 1 \\ g/L &amp; 0\end{bmatrix}}_{A}\, x
         + \underbrace{\begin{bmatrix}0 \\ -1/(mL^2)\end{bmatrix}}_{B}\, u,
\qquad
y = \begin{bmatrix}1 &amp; 0\end{bmatrix} x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6679em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">x</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1111em"><span class="mord">˙</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:3.7264em;vertical-align:-2.2764em"></span><span class="minner munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-1.1736em"><span class="pstrut" style="height:3.45em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span style="top:-3.45em"><span class="pstrut" style="height:3.45em"></span><span class="minner munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span class="svg-align" style="top:-1.852em"><span class="pstrut" style="height:3.45em"></span><span class="stretchy" style="height:0.548em;min-width:1.6em"><span class="brace-left" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13
 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688
 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7
-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"></path></svg></span><span class="brace-center" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214
c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14
 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3
 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0
-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"></path></svg></span><span class="brace-right" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3
 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237
-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"></path></svg></span></span></span><span style="top:-3.45em"><span class="pstrut" style="height:3.45em"></span><span class="mord"><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size3">[</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">g</span><span class="mord">/</span><span class="mord mathnormal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size3">]</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.598em"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.2764em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:3.7264em;vertical-align:-2.2764em"></span><span class="minner munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-1.1736em"><span class="pstrut" style="height:3.45em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em">B</span></span></span></span><span style="top:-3.45em"><span class="pstrut" style="height:3.45em"></span><span class="minner munder"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span class="svg-align" style="top:-1.852em"><span class="pstrut" style="height:3.45em"></span><span class="stretchy" style="height:0.548em;min-width:1.6em"><span class="brace-left" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMinYMin slice"><path d="M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13
 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688
 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7
-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z"></path></svg></span><span class="brace-center" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMidYMin slice"><path d="M199572 214
c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14
 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3
 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0
-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z"></path></svg></span><span class="brace-right" style="height:0.548em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.548em" viewBox="0 0 400000 548" preserveAspectRatio="xMaxYMin slice"><path d="M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3
 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237
-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z"></path></svg></span></span></span><span style="top:-3.45em"><span class="pstrut" style="height:3.45em"></span><span class="mord"><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size3">[</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em"><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">−</span><span class="mord">1/</span><span class="mopen">(</span><span class="mord mathnormal">m</span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-3.063em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size3">]</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.598em"><span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.2764em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:2em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.0359em">y</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size1">[</span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em"><span style="top:-3.01em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em"><span style="top:-3.01em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em"><span></span></span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size1">]</span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">x</span></span></span></span></span>
<p>For <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>=</mo><mn>0.5</mn></mrow><annotation encoding="application/x-tex">m = 0.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">0.5</span></span></span></span> kg, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi><mo>=</mo><mn>0.3</mn></mrow><annotation encoding="application/x-tex">L = 0.3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal">L</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">0.3</span></span></span></span> m, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo>=</mo><mn>9.81</mn></mrow><annotation encoding="application/x-tex">g = 9.81</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em"></span><span class="mord mathnormal" style="margin-right:0.0359em">g</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">9.81</span></span></span></span> m/s²:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> np</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> ss</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">m</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> L</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> g </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.5</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">9.81</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">A </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">      </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token plain">g</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token plain">L</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain">    </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">B </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token operator" style="color:rgb(212, 212, 212)">/</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">m</span><span class="token operator" style="color:rgb(212, 212, 212)">*</span><span class="token plain">L</span><span class="token operator" style="color:rgb(212, 212, 212)">**</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">C </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">D </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> C</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> D</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">plant</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">                  </span><span class="token comment" style="color:rgb(106, 153, 85)"># StateSpace n_states=2 n_inputs=1 n_outputs=1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">plant</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">is_stable</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">      </span><span class="token comment" style="color:rgb(106, 153, 85)"># False — poles at ±√(g/L) = ±5.72 rad/s</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The open-loop poles are <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>±</mo><msqrt><mrow><mi>g</mi><mi mathvariant="normal">/</mi><mi>L</mi></mrow></msqrt><mo>≈</mo><mo>±</mo><mn>5.72</mn></mrow><annotation encoding="application/x-tex">\pm\sqrt{g/L} \approx \pm 5.72</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.24em;vertical-align:-0.305em"></span><span class="mord">±</span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.935em"><span class="svg-align" style="top:-3.2em"><span class="pstrut" style="height:3.2em"></span><span class="mord" style="padding-left:1em"><span class="mord mathnormal" style="margin-right:0.0359em">g</span><span class="mord">/</span><span class="mord mathnormal">L</span></span></span><span style="top:-2.895em"><span class="pstrut" style="height:3.2em"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119
c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120
c340,-704.7,510.7,-1060.3,512,-1067
l0 -0
c4.7,-7.3,11,-11,19,-11
H40000v40H1012.3
s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232
c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1
s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26
c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z
M1001 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.305em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em"></span><span class="mord">±</span><span class="mord">5.72</span></span></span></span> rad/s — one is in the right
half-plane, confirming instability.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="lqr-design">LQR design<a href="https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr#lqr-design" class="hash-link" aria-label="Direct link to LQR design" title="Direct link to LQR design">​</a></h2>
<p>LQR finds the state-feedback gain <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0715em">K</span></span></span></span> that minimises:</p>
<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>J</mi><mo>=</mo><msubsup><mo>∫</mo><mn>0</mn><mi mathvariant="normal">∞</mi></msubsup><mrow><mo fence="true">(</mo><msup><mi>x</mi><mi mathvariant="normal">⊤</mi></msup><mi>Q</mi><mtext> </mtext><mi>x</mi><mo>+</mo><msup><mi>u</mi><mi mathvariant="normal">⊤</mi></msup><mi>R</mi><mtext> </mtext><mi>u</mi><mo fence="true">)</mo></mrow><mi mathvariant="normal">d</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">J = \int_0^\infty \left(x^\top Q\, x + u^\top R\, u\right)\mathrm{d}t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0962em">J</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.3262em;vertical-align:-0.9119em"></span><span class="mop"><span class="mop op-symbol large-op" style="margin-right:0.4445em;position:relative;top:-0.0011em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4143em"><span style="top:-1.7881em;margin-left:-0.4445em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span><span style="top:-3.8129em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">∞</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9119em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size1">(</span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em"><span style="top:-3.113em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">⊤</span></span></span></span></span></span></span></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord"><span class="mord mathnormal">u</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em"><span style="top:-3.113em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">⊤</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0077em">R</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">u</span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size1">)</span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</span></span></span></span></span>
<p>The tuning intuition: <strong>large <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em"></span><span class="mord mathnormal">Q</span></span></span></span> penalises state error</strong> (fast, aggressive), <strong>large <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0077em">R</span></span></span></span>
penalises control effort</strong> (slow, conservative). Here we want tight angle control with
moderate actuation:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> lqr</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">Q </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">diag</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">100.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># penalise angle heavily, velocity lightly</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">R </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0.1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">        </span><span class="token comment" style="color:rgb(106, 153, 85)"># moderate actuator cost</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">K</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> P </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> lqr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> R</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">f"K = </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token string-interpolation interpolation">K</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token string-interpolation string" style="color:rgb(206, 145, 120)">"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">            </span><span class="token comment" style="color:rgb(106, 153, 85)"># K = [[33.2  5.8]]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The closed-loop system matrix <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mrow><mi>c</mi><mi>l</mi></mrow></msub><mo>=</mo><mi>A</mi><mo>−</mo><mi>B</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">A_{cl} = A - BK</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight" style="margin-right:0.0197em">l</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em"></span></span><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathnormal" style="margin-right:0.0502em">B</span><span class="mord mathnormal" style="margin-right:0.0715em">K</span></span></span></span> has eigenvalues that are all in the
left half-plane — the pendulum is now stabilised.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">A_cl </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> A </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> B @ K</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">linalg</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">eigvals</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A_cl</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># e.g. [-4.1+2.3j  -4.1-2.3j]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="simulation">Simulation<a href="https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr#simulation" class="hash-link" aria-label="Direct link to Simulation" title="Direct link to Simulation">​</a></h2>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> matplotlib</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">pyplot </span><span class="token keyword" style="color:rgb(86, 156, 214)">as</span><span class="token plain"> plt</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Build closed-loop state-space</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">cl </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> ss</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">A_cl</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> C</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> D</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Step response — initial condition θ₀ = 0.2 rad (≈ 11°)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">t </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">linspace</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">3</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">600</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">x0 </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">array</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">0.2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">          </span><span class="token comment" style="color:rgb(106, 153, 85)"># [θ, θ_dot]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># simulate() accepts x0 for initial condition</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">u_zero </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token builtin" style="color:rgb(86, 156, 214)">len</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">     </span><span class="token comment" style="color:rgb(106, 153, 85)"># no reference tracking, pure stabilisation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">t_out</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> cl</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">simulate</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u_zero</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> x0</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">x0</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">plot</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">t_out</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">xlabel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Time (s)"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">ylabel</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"θ (rad)"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">title</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token string" style="color:rgb(206, 145, 120)">"Inverted Pendulum — LQR stabilisation from θ₀ = 0.2 rad"</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">grid</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">show</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The angle returns to zero in roughly 1.5 s without overshoot — the <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><mi mathvariant="normal">/</mi><mi>R</mi></mrow><annotation encoding="application/x-tex">Q/R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord mathnormal">Q</span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.0077em">R</span></span></span></span> balance gave
us a well-damped response.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="discretisation-for-embedded-deployment">Discretisation for embedded deployment<a href="https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr#discretisation-for-embedded-deployment" class="hash-link" aria-label="Direct link to Discretisation for embedded deployment" title="Direct link to Discretisation for embedded deployment">​</a></h2>
<p>Real microcontrollers run discrete loops. ZOH discretisation at 100 Hz:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">dt </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">0.01</span><span class="token plain">  </span><span class="token comment" style="color:rgb(106, 153, 85)"># 100 Hz</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">plant_d </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> c2d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">plant</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> dt</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">dt</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">print</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># StateSpace n_states=2  dt=0.01</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># The same K works — LQR was designed in continuous time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># For production, redesign K in discrete time for better performance:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">algorithms </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> lqr</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> c2d</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Discretise A and B for discrete-time LQR (dare)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># plant_d.A, plant_d.B are the ZOH-discretised matrices</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">K_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> _ </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> lqr</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">A</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">B</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> Q</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> R</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The control loop on the microcontroller reduces to:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">x </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">zeros</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> tick </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(86, 156, 214)">range</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">n_steps</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    u </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> </span><span class="token operator" style="color:rgb(212, 212, 212)">-</span><span class="token plain">K_d @ x</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> plant_d</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">evolve</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> u</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="key-takeaways">Key takeaways<a href="https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr#key-takeaways" class="hash-link" aria-label="Direct link to Key takeaways" title="Direct link to Key takeaways">​</a></h2>
<table><thead><tr><th>Step</th><th>Synapsys API</th></tr></thead><tbody><tr><td>Model</td><td><code>ss(A, B, C, D)</code></td></tr><tr><td>Stability check</td><td><code>plant.is_stable()</code>, <code>plant.poles()</code></td></tr><tr><td>LQR design</td><td><code>lqr(A, B, Q, R)</code> → returns <code>(K, P)</code></td></tr><tr><td>Simulation</td><td><code>cl.simulate(t, u, x0=x0)</code></td></tr><tr><td>Discretisation</td><td><code>c2d(plant, dt=0.01)</code></td></tr><tr><td>Embedded loop</td><td><code>plant_d.evolve(x, u)</code></td></tr></tbody></table>
<p>The full notebook is available in <a href="https://github.com/synapsys-lab/synapsys/blob/main/examples/quickstart_en.ipynb" target="_blank" rel="noopener noreferrer"><code>examples/quickstart_en.ipynb</code></a>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="next-in-the-series">Next in the series<a href="https://synapsys-lab.github.io/synapsys/blog/inverted-pendulum-lqr#next-in-the-series" class="hash-link" aria-label="Direct link to Next in the series" title="Direct link to Next in the series">​</a></h2>
<p>The next post covers <strong>MIMO control of a quadrotor</strong> — extending these ideas to a
12-state system with coupled dynamics and a residual Neural-LQR that adds a learned
correction layer on top of the classical solution.</p>]]></content:encoded>
            <category>Artigo</category>
            <category>Tutorial</category>
            <category>LQR</category>
            <category>Control Theory</category>
            <category>Simulation</category>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Welcome to the Synapsys Blog]]></title>
            <link>https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog</link>
            <guid>https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog</guid>
            <pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing the Synapsys Blog — a space for tutorials, research insights, and practical guides for control systems engineers and researchers.
]]></description>
            <content:encoded><![CDATA[<p>Welcome to the <strong>Synapsys Blog</strong> — a space dedicated to practical control systems
engineering, academic research, and real-world applications of the Synapsys library.</p>
<!-- -->
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-youll-find-here">What you'll find here<a href="https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog#what-youll-find-here" class="hash-link" aria-label="Direct link to What you'll find here" title="Direct link to What you'll find here">​</a></h2>
<p>This blog is aimed at <strong>researchers, graduate students, and engineers</strong> who work at the
intersection of classical control theory and modern software. Each post will focus on
a concrete problem and show how to solve it end-to-end using Synapsys.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="series-planned">Series planned<a href="https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog#series-planned" class="hash-link" aria-label="Direct link to Series planned" title="Direct link to Series planned">​</a></h3>
<table><thead><tr><th>Series</th><th>What it covers</th></tr></thead><tbody><tr><td><strong>Control Theory in Practice</strong></td><td>Modelling, analysis and design from first principles</td></tr><tr><td><strong>From Simulation to Hardware</strong></td><td>MIL → SIL → HIL step by step</td></tr><tr><td><strong>AI-Augmented Control</strong></td><td>Neural-LQR, RL policies and PyTorch integration</td></tr><tr><td><strong>Research Snippets</strong></td><td>Short posts connecting library features to published papers</td></tr><tr><td><strong>Release Notes</strong></td><td>What's new in each version with worked examples</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="quick-taste-step-response-in-5-lines">Quick taste: step response in 5 lines<a href="https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog#quick-taste-step-response-in-5-lines" class="hash-link" aria-label="Direct link to Quick taste: step response in 5 lines" title="Direct link to Quick taste: step response in 5 lines">​</a></h2>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token keyword" style="color:rgb(86, 156, 214)">from</span><span class="token plain"> synapsys</span><span class="token punctuation" style="color:rgb(212, 212, 212)">.</span><span class="token plain">api </span><span class="token keyword" style="color:rgb(86, 156, 214)">import</span><span class="token plain"> tf</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> feedback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> step</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">G </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> tf</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">[</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">2</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">]</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">   </span><span class="token comment" style="color:rgb(106, 153, 85)"># G(s) = 1 / (s² + 2s + 1)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">T </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> feedback</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">G</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">           </span><span class="token comment" style="color:rgb(106, 153, 85)"># unity negative feedback</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">t</span><span class="token punctuation" style="color:rgb(212, 212, 212)">,</span><span class="token plain"> y </span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain"> step</span><span class="token punctuation" style="color:rgb(212, 212, 212)">(</span><span class="token plain">T</span><span class="token punctuation" style="color:rgb(212, 212, 212)">)</span><span class="token plain">            </span><span class="token comment" style="color:rgb(106, 153, 85)"># simulate step response</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The closed-loop DC gain converges to <strong>1.0</strong>, and the natural frequency <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ω</mi><mi>n</mi></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\omega_n = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em">ω</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">1</span></span></span></span> rad/s
with <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ζ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\zeta = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal" style="margin-right:0.0738em">ζ</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6444em"></span><span class="mord">1</span></span></span></span> (critically damped) — as expected from the denominator.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Install</div><div class="admonitionContent_BuS1"><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token plain">pip </span><span class="token function" style="color:rgb(220, 220, 170)">install</span><span class="token plain"> synapsys   </span><span class="token comment" style="color:rgb(106, 153, 85)"># or: uv add synapsys</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-synapsys">Why Synapsys?<a href="https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog#why-synapsys" class="hash-link" aria-label="Direct link to Why Synapsys?" title="Direct link to Why Synapsys?">​</a></h2>
<p>Most Python control libraries focus on analysis. Synapsys adds a <strong>simulation and
deployment layer</strong> on top: agents that run in real time, a transport-agnostic
communication bus, and a hardware abstraction that makes MIL/SIL/HIL a configuration
change rather than a rewrite.</p>
<p>It was built alongside graduate research in multi-agent control systems and is
designed to be readable, testable, and academically citable.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="stay-connected">Stay connected<a href="https://synapsys-lab.github.io/synapsys/blog/welcome-to-synapsys-blog#stay-connected" class="hash-link" aria-label="Direct link to Stay connected" title="Direct link to Stay connected">​</a></h2>
<ul>
<li>Watch the repo on <a href="https://github.com/synapsys-lab/synapsys" target="_blank" rel="noopener noreferrer">GitHub</a> for new releases</li>
<li>Open an <a href="https://github.com/synapsys-lab/synapsys/issues" target="_blank" rel="noopener noreferrer">issue</a> if you have a topic you'd like covered</li>
</ul>
<p>The first technical post — <strong>Stabilising an Inverted Pendulum with LQR</strong> — is coming up next.</p>]]></content:encoded>
            <category>Post</category>
            <category>Release</category>
            <category>Python</category>
            <category>Control Theory</category>
        </item>
    </channel>
</rss>