<?xml version="1.0" encoding="UTF-8"?>
<!--
 * Scilab ( https://www.scilab.org/ ) - This file is part of Scilab
 * Copyright (C) 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:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="ja" xml:id="ricc">
    <refnamediv>
        <refname>ricc</refname>
        <refpurpose>リカッチ方程式</refpurpose>
    </refnamediv>
    <refsynopsisdiv>
        <title>呼び出し手順</title>
        <synopsis>[X,RCOND,FERR]=ricc(A,B,C,"cont""method")
            [X,RCOND,FERR]=ricc(F,G,H,"disc","method")
        </synopsis>
    </refsynopsisdiv>
    <refsection>
        <title>パラメータ</title>
        <variablelist>
            <varlistentry>
                <term>A,B,C</term>
                <listitem>
                    <para>適当な次元の実数行列</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>F,G,H</term>
                <listitem>
                    <para>適当な次元の実数行列</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>X</term>
                <listitem>
                    <para>実数行列</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>"cont","disc"'  </term>
                <listitem>
                    <para>規定の文字列 (連続または離散を表すフラグ)</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>method</term>
                <listitem>
                    <para>連続時間システムの場合は'schr' または 'sign',
                        離散時間システムの場合は'schr' または'invf'
                    </para>
                </listitem>
            </varlistentry>
        </variablelist>
    </refsection>
    <refsection>
        <title>説明</title>
        <para>
            リカッチソルバ.
        </para>
        <para>
            連続時間:
        </para>
        <programlisting role=""><![CDATA[
X=ricc(A,B,C,'cont')
 ]]></programlisting>
        <para>
            により連続時間 ARE の解が得られる
        </para>
        <programlisting role=""><![CDATA[
A'*X+X*A-X*B*X+C=0 .
 ]]></programlisting>
        <para>
            <literal>B</literal> および<literal>C</literal> は
            非負定とする.
            <literal>(A,G)</literal> は
            <literal>B</literal>のフルランク分解<literal>G*G'</literal>により
            可安定とする.
        </para>
        <para>
            <literal>(A,H)</literal> は<literal>C</literal>の
            フルランク分解<literal>H*H'</literal>により可検出とする.
        </para>
        <para>
            離散時間:
        </para>
        <programlisting role=""><![CDATA[
X=ricc(F,G,H,'disc')
 ]]></programlisting>
        <para>
            により離散時間AREの解が得られる
        </para>
        <programlisting role=""><![CDATA[
X=F'*X*F-F'*X*G1*((G2+G1'*X*G1)^-1)*G1'*X*F+H
 ]]></programlisting>
        <para>
            <literal>F</literal> は可逆であり、
            <literal>G = G1*inv(G2)*G1'</literal>とする.
        </para>
        <para>
            <literal>(F,G1)</literal>は可安定, <literal>(C,F)</literal> は
            <literal>H</literal>のフルランク分解 <literal>C'*C</literal>を
            用いて可検出であることとする.
            より適する場合, <literal>riccati()</literal> を使用すること.
        </para>
        <para>
            C, D は対象行列である.
            行列 A, C および Dに対応する行列ペンシルが,絶対値が 1より小さい
            N個の固有値を有するものとする.
        </para>
        <para>
            解のエラー境界と推定条件も出力される.
            行列 A, C および D において,
            対応するハミルトン行列が 実部が負となるN個の固有値を有するものとする.
        </para>
    </refsection>
    <refsection>
        <title>例</title>
        <programlisting role="example"><![CDATA[
//Standard formulas to compute Riccati solutions
A=rand(3,3);B=rand(3,2);C=rand(3,3);C=C*C';R=rand(2,2);R=R*R'+eye();
B=B*inv(R)*B';
X=ricc(A,B,C,'cont');
norm(A'*X+X*A-X*B*X+C,1)
H=[A -B;-C -A'];
[T,d]=schur(eye(H),H,'cont');T=T(:,1:d);
X1=T(4:6,:)/T(1:3,:);
norm(X1-X,1)
[T,d]=schur(H,'cont');T=T(:,1:d);
X2=T(4:6,:)/T(1:3,:);
norm(X2-X,1)
//       Discrete time case
F=A;B=rand(3,2);G1=B;G2=R;G=G1/G2*G1';H=C;
X=ricc(F,G,H,'disc');
norm(F'*X*F-(F'*X*G1/(G2+G1'*X*G1))*(G1'*X*F)+H-X)
H1=[eye(3,3) G;zeros(3,3) F'];
H2=[F zeros(3,3);-H eye(3,3)];
[T,d]=schur(H2,H1,'disc');T=T(:,1:d);X1=T(4:6,:)/T(1:3,:);
norm(X1-X,1)
Fi=inv(F);
Hami=[Fi Fi*G;H*Fi F'+H*Fi*G];
[T,d]=schur(Hami,'d');T=T(:,1:d);
Fit=inv(F');
Ham=[F+G*Fit*H -G*Fit;-Fit*H Fit];
[T,d]=schur(Ham,'d');T=T(:,1:d);X2=T(4:6,:)/T(1:3,:);
norm(X2-X,1)
 ]]></programlisting>
    </refsection>
    <refsection role="see also">
        <title>参照</title>
        <simplelist type="inline">
            <member>
                <link linkend="riccati">riccati</link>
            </member>
            <member>
                <link linkend="schur">schur</link>
            </member>
        </simplelist>
    </refsection>
    <refsection>
        <title>使用する関数</title>
        <para>参照: SCI/modules/cacsd/src/slicot/riccpack.f</para>
    </refsection>
</refentry>
