<?xml version="1.0" encoding="UTF-8"?>
<!--
 * Scilab ( https://www.scilab.org/ ) - This file is part of Scilab
 * Copyright (C) 2008 - INRIA
 * ...
 * Copyright (C) 2012 - 2016 - Scilab Enterprises
 *
 * This file is hereby licensed under the terms of the GNU GPL v2.0,
 * pursuant to article 5.3.4 of the CeCILL v.2.1.
 * This file was originally licensed under the terms of the CeCILL v2.1,
 * and continues to be available under such terms.
 * For more information, see the COPYING file which you should have received
 * along with this program.
 *
 -->
<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml"
          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
          xmlns:scilab="http://www.scilab.org" xml:id="odedc" xml:lang="pt">
    <refnamediv>
        <refname>odedc</refname>
        <refpurpose>solucionador de EDOs contínuas/discretas</refpurpose>
    </refnamediv>
    <refsynopsisdiv>
        <title>Seqüência de Chamamento</title>
        <synopsis>yt = odedc(y0, nd, stdel, t0, t, f)</synopsis>
    </refsynopsisdiv>
    <refsection role="parameters">
        <title>Parâmetros</title>
        <variablelist>
            <varlistentry>
                <term>y0</term>
                <listitem>
                    <para>vetor coluna de reais (condições iniciais),
                        <literal>y0=[y0c;y0d]</literal> onde <literal>y0d</literal> tem
                        <literal>nd</literal> componentes.
                    </para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>nd</term>
                <listitem>
                    <para>
                        inteiro, dimensão de <literal>y0d</literal>
                    </para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>stdel</term>
                <listitem>
                    <para>
                        vetor de reais com uma ou duas entradas, <literal>stdel=[h,delta]</literal>
                        (com <literal>delta=0</literal> como valor padrão).
                    </para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>t0</term>
                <listitem>
                    <para>escalar real (tempo inicial).</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>t</term>
                <listitem>
                    <para>
                        vetor (linha de reais), instantes onde <literal>yt</literal> é
                        calculado .
                    </para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>f</term>
                <listitem>
                    <para>função externa i.e. função, string ou lista com seqüência de
                        chamamento: <literal>yp=f(t,yc,yd,flag)</literal>.
                    </para>
                </listitem>
            </varlistentry>
        </variablelist>
    </refsection>
    <refsection role="description">
        <title>Descrição</title>
        <para>
            <literal>y = odedc([y0c;y0d], nd, [h,delta], t0, t, f)</literal> computa a
            solução de um sistema misto contínuo/discreto. O estado de sistema
            discreto <literal>yd<subscript>k</subscript></literal> é embutido em uma função de tempo
            seccional constante <literal>yd(t)</literal> como segue:
            <literal>yd(t) = yd<subscript>k</subscript></literal> para <literal>t</literal> em
            <literal>[t<subscript>k</subscript> = h*(delta+k) , t<subscript>k+1</subscript> = h*(delta+k+1) )</literal>.
        </para>
        <para>As equações simuladas são agora
            para t em [ t<subscript>k</subscript> , t<subscript>k+1</subscript> ):
        </para>
        <screen>
dyc/dt = f(t, yc(t), yd(t), 0)
yc(t0) = y0c
</screen>
        <para>
            e nos instantes <literal>td<subscript>k</subscript></literal> a variável discreta
            <literal>yd</literal> é atualizada por
        </para>
        <para>
            <literal>yd(t<subscript>k+</subscript>)
            = f(yc(t<subscript>k-</subscript>), yd(t<subscript>k-</subscript>), 1)</literal>.
        </para>
        <para>
            Note que, utilizando a definição de <literal>yd(t)</literal>, a última equação fornece
        </para>
        <para>
            <literal>yd<subscript>k</subscript>
            = f(t<subscript>k</subscript>, yc(t<subscript>k-</subscript>), yd(t<subscript>k-1</subscript>), 1)
            </literal>
        </para>
        <para>
            (<literal>yc</literal> é de tempo contínuo :
            <literal>yc(t<subscript>k-</subscript>) = yc(t<subscript>k</subscript>)</literal>).
        </para>
        <para>
            Os parâmetros de chamada de <literal>f</literal> são fixados:
            <literal>ycd = f(t,yc,yd,flag)</literal>; esta função deve retornar a
            derivada do vetor <literal>yc</literal> se <literal>flag=0</literal> ou a
            atualização de <literal>yd</literal> se <literal>flag=1</literal>.
        </para>
        <para>
            <literal>ycd = dot(yc)</literal> deve ser um vetor de mesma dimensão
            que <literal>yc</literal> se <literal>flag=0</literal> e
            <literal>ycd = update(yd)</literal> deve ser um vetor com a mesma dimensão
            que <literal>yd</literal> se <literal>flag=1</literal>.
        </para>
        <para>
            <literal>t</literal> é um vetor de constantes onde a solução
            <literal>y</literal> é computada.
        </para>
        <para>
            <literal>y</literal> é o vetor
            <literal>y = [y(t(1)), y(t(2)),...]</literal>.
        </para>
        <para>
            Esta função pode ser chamada
            com os mesmo parâmetro opcionais da função <literal>ode</literal> (desde
            que <literal>nd</literal> e <literal>stdel</literal> sejam dados na
            seqüência de chamamento como segundo e terceiro parâmetros). Em
            particular, flags de integração e tolerâncias podem ser ajustadas.
            Parâmetros opcionais podem ser ajustados pela função
            <literal>odeoptions</literal>.
        </para>
        <para>Rotinas externas podem ser ligadas dinamicamente (ver
            <link linkend="link">link</link>).
        </para>
    </refsection>
    <refsection role="examples">
        <title>Exemplos</title>
        <programlisting role="example"><![CDATA[
//sistema linear com entrada alternante
deff('xdu = phis(t,x,u,flag)','if flag==0 then xdu = A*x + B*u; else xdu = 1-u; end');
x0 = [1;1]; A = [-1,2;-2,-1]; B = [1;2]; u = 0; nu = 1; stdel = [1,0]; u0 = 0; t = 0:0.05:10;
xu = odedc([x0;u0],nu,stdel,0,t,phis);x=xu(1:2,:);u=xu(3,:);
nx = 2;
plot2d(t, x', [1:nx],'161')
plot2d2('onn',t',u',[nx+1:nx+nu],'000');

//função externa FORTRAN (ver fydot2.f):
norm(xu-odedc([x0;u0],nu,stdel,0,t,'phis'),1)

//feedback (resposta) amostrado
//
//        |     xcdot=fc(t,xc,u)
//  (sistema)   |
//        |     y=hc(t,xc)
//
//
//        |     xd+=fd(xd,y)
//  (feedback) |
//        |     u=hd(t,xd)
//
deff('xcd=f(t,xc,xd,iflag)',...
  ['if iflag==0 then '
   '  xcd=fc(t,xc,e(t)-hd(t,xd));'
   'else '
   '  xcd=fd(xd,hc(t,xc));'
   'end']);
A = [-10,2,3;4,-10,6;7,8,-10];
B = [1;1;1];C=[1,1,1];
Ad = [1/2,1;0,1/20];
Bd = [1;1];Cd=[1,1];
deff('st = e(t)','st = sin(3*t)')
deff('xdot=fc(t,x,u)', 'xdot=A*x+B*u')
deff('y = hc(t,x)','y = C*x')
deff('xp = fd(x,y)','xp = Ad*x + Bd*y')
deff('u = hd(t,x)','u = Cd*x')
h = 0.1; t0 = 0; t = 0:0.1:2;
x0c = [0;0;0]; x0d = [0;0]; nd = 2;
xcd = odedc([x0c;x0d],nd,h,t0,t,f);
norm(xcd-odedc([x0c;x0d],nd,h,t0,t,'fcd1')) // cálculo rápido (ver fydot2.f)
plot2d([t',t',t'],xcd(1:3,:)');
scf(2);
plot2d2("gnn",[t',t'],xcd(4:5,:)');
scf(0);
     ]]></programlisting>
    </refsection>
    <refsection role="see also">
        <title>Ver Também</title>
        <simplelist type="inline">
            <member>
                <link linkend="ode">ode</link>
            </member>
            <member>
                <link linkend="link">link</link>
            </member>
            <member>
                <link linkend="odeoptions">odeoptions</link>
            </member>
            <member>
                <link linkend="csim">csim</link>
            </member>
            <member>
                <link linkend="external">external</link>
            </member>
        </simplelist>
    </refsection>
</refentry>
