Damped response: Difference between revisions

From ASCEND
Jump to navigation Jump to search
Restored page from Google Cache, uploaded by John Pye
 
No edit summary
Line 1: Line 1:
<div class="pageexperimental">''This page documents an '''experimental''' feature. You can help out by '''testing it''' and <span class="plainlinks">[http://ascendwiki.cheme.cmu.edu/index.php?title=Damped_response&action=edit recording]</span> your experiences.''</div>
{{experimental}}


In classical control theory, a second-order system has a transfer function like
In classical control theory, a second-order system has a transfer function like

Revision as of 00:35, 30 July 2010

This page documents an experimental feature. Please tell us if you experience any problems.

In classical control theory, a second-order system has a transfer function like

<math> G(s) = \frac{Y(s)}{X(s)} = \frac{A}{s^2+2s+2} </math>

We can model a system like this fairly easily with ASCEND. First we need to reduce the model to first order differential equations:

s2Y + 2s'Y + 2Y = A'X

Now, let s'Y = Z so that we have a pair of equations

<math> \begin{matrix} sZ + 2Z +2Y = AX \\ sY = Z \end{matrix} </math>

Taking the inverse Laplace transform and rearranging,

<math> \begin{matrix} \dot{z} &=& Ax-2z -2y \\ \dot{y} &=& z \end{matrix} </math>

This can be coded into ASCEND in the usual syntax (see below).

Here is the output from the above system, with A = 2, x(t) = 1, plotted using OpenOffice. Different values of the coefficients in the <math>\dot{z}</math> equation give different levels of damping, resonant frequency, etc.

<img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" />

This plot shows that the above transfer function has roots at <math> -1 \pm j </math> as expected:

}

Here is the model that was used to produce these solutions:

REQUIRE &quot;ivpsystem.a4l&quot;;

 REQUIRE &quot;atoms.a4l&quot;;
 IMPORT &quot;johnpye/extpy/extpy&quot;;

 IMPORT &quot;johnpye/roots&quot;;

 (*
    'Test problem'
    We create a set of models with artificially-selected roots

    and then check that the roots plot is as expected.
 *)
 MODEL simpleroots;

    range IS_A set OF integer_constant;

    range :== [7..8];
    x[range], dx_dt[range] IS_A solver_var;

    (* roots at -1 +/i j *)
    dx_dt[7] = 2.0 * 1.0 - 2.0 * x[7] - 2.0 * x[8];

    dx_dt[8] = x[7];

    t IS_A time;

 METHODS
    METHOD values;
        x[7]&nbsp;:= 0;

        x[8]&nbsp;:= 0;
    END values;

    METHOD ode_init;
        FOR i IN [range] DO

            x[i].ode_type := 1;
            dx_dt[i].ode_type := 2;

            x[i].ode_id := i;
            dx_dt[i].ode_id := i;

            x[i].obs_id := i;
        END FOR;

        t.ode_type := -1;
        t := 0 {s};

    END ode_init;

    METHOD on_load;
        RUN default_self;

        RUN reset; RUN values;
        RUN ode_init;

        RUN roots;
    END on_load;

    METHOD roots;

        EXTERNAL roots(SELF);
    END roots;
 END simpleroots;

See also IDA