DiscreteRiccatiSolve[{a,b},{q,r}]
離散代数リッカチ(Riccati)方程式
の安定化解である行列
を与える.
DiscreteRiccatiSolve[{a,b},{q,r,p}]
を解く.
DiscreteRiccatiSolve
DiscreteRiccatiSolve[{a,b},{q,r}]
離散代数リッカチ(Riccati)方程式
の安定化解である行列
を与える.
DiscreteRiccatiSolve[{a,b},{q,r,p}]
を解く.
詳細とオプション
における「
」は共役転置を表す.
が安定可能,
が検出可能で,
かつ
のときのみ,方程式
には一意的で対称な半正定値解がある.したがって,行列
の固有値はすべて単位円内にあり解は安定している.
が可制御で
が可観測であれば解は正定値である.- DiscreteRiccatiSolveはMethodオプションをサポートする.次は,指定可能な設定値である.
-
Automatic 自動的に決定されたメソッド "Eigensystem" 固有値分解に基づく "GeneralizedEigensystem" 一般化された固有値分解に基づく "GeneralizedSchur" 一般化されたシューア(Schur)分解に基づく "InverseFree" "GeneralizedSchur"の変化形 "MatrixSign" 行列符号関数を使った反復法 "Newton" 反復ニュートン(Newton)法 "Schur" シューア分解に基づく - どのメソッドも,近似数値行列に適用される."Eigensystem"は厳密行列に適用される.
例題
すべて開く すべて閉じる例 (1)
{a, b, q, r} = {(| | | |
| - | -- | - |
| 1 | -1 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 1 | 0 |
| 0 | 1 |), (| | | |
| -- | - | --- |
| 10 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0.1 |), (| | |
| -- | --- |
| 10 | 0 |
| 0 | 0.1 |)};(x = DiscreteRiccatiSolve[{a, b}, {q, r}])//MatrixFormTranspose[a].x.a - x - Transpose[a].x.b.Inverse[r + Transpose[b].x.b].Transpose[b].x.a + q//Chopスコープ (3)
DiscreteRiccatiSolve[{(| | |
| ---- | --- |
| -1 | 0.5 |
| -0.5 | -2 |), (| |
| --- |
| 1 |
| 0.5 |)}, {(| | |
| - | - |
| 1 | 0 |
| 0 | 2 |), {{1}}}]//MatrixFormDiscreteRiccatiSolve[{(| | | |
| - | ------ | --- |
| 0 | 1 | 0 |
| 0 | -0.01 | 0.3 |
| 0 | -0.003 | -10 |), (| | |
| --- | -- |
| 0 | 0 |
| 0 | -1 |
| 0.1 | 0 |)}, {(| | | |
| - | - | - |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| ---- | --- |
| 0.1 | 0 |
| -0.2 | 0 |
| 0.15 | 0.2 |)}]//MatrixFormtfm = TransferFunctionModel[{{{1}}, (-1 + z)*(-0.605 + z)}, z,
SamplingPeriod -> 0.1];DiscreteRiccatiSolve[Normal[StateSpaceModel[tfm]][[1 ;; 2]], {(| | |
| -- | --- |
| 10 | 0 |
| 0 | 0.1 |), (1)}]オプション (7)
Method (7)
厳密な系には,Automaticおよび"Eigensystem"メソッドが使われる:
x1 = DiscreteRiccatiSolve[{(| | |
| - | - |
| 0 | 2 |
| 1 | 0 |), (| |
| - |
| 0 |
| 1 |)}, {(| | |
| - | ----- |
| 1 | 0 |
| 0 | (4/9) |), (1)}, Method -> Automatic]x2 = DiscreteRiccatiSolve[{(| | |
| - | - |
| 0 | 2 |
| 1 | 0 |), (| |
| - |
| 0 |
| 1 |)}, {(| | |
| - | ----- |
| 1 | 0 |
| 0 | (4/9) |), (1)}, Method -> "Eigensystem"]x1 == x2x1 = DiscreteRiccatiSolve[N@{(| | |
| - | - |
| 0 | 2 |
| 1 | 0 |), (| |
| - |
| 0 |
| 1 |)}, {(| | |
| - | ----- |
| 1 | 0 |
| 0 | (4/9) |), (1)}, Method -> Automatic]//Chopx2 = DiscreteRiccatiSolve[N@{(| | |
| - | - |
| 0 | 2 |
| 1 | 0 |), (| |
| - |
| 0 |
| 1 |)}, {(| | |
| - | ----- |
| 1 | 0 |
| 0 | (4/9) |), (1)}, Method -> "Eigensystem"]//Chopx1 == x2厳密ではない系には"Schur"メソッドを使うことができる:
DiscreteRiccatiSolve[{(| | |
| - | - |
| 0 | 2 |
| 1 | 1 |), (| |
| - |
| 0 |
| 1 |)}, {(| | |
| ---- | ---- |
| 2.25 | -1.5 |
| -1.5 | 1 |), (2)}, Method -> "Schur"]"Newton"は非厳密系に適用され,Automaticよりも正確な場合がある:
a = SparseArray[{{1, 1} -> 0.8, {1, 5} -> -0.8, {2, 1} -> 0.8, {2, 5} -> -0.5, {5, 1} -> 0.25}];
b = Transpose[{{1, 0, 0, 1, 0}}];
r = {{1}};
q = IdentityMatrix[5];x1 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "Newton"];Norm[a^.x1.a - x1 - a^.x1.b.Inverse[r + b^.x1.b].b^.x1.a + q]x2 = DiscreteRiccatiSolve[{a, b}, {q, r}];Norm[a^.x2.a - x2 - a^.x2.b.Inverse[r + b^.x2.b].b^.x2.a + q]"Newton"は,サブオプションとして,"StartingMatrix","MaxIterations","Tolerance"を取る:
x3 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> {"Newton", "StartingMatrix" -> x2, "Tolerance" -> 10^-15, "MaxIterations" -> 10}];Norm[a^.x3.a - x3 - a^.x3.b.Inverse[r + b^.x3.b].b^.x3.a + q]"Newton"法は,たとえそれが存在する場合でも,安定化解を計算しないことがある:
a = {{0., -1.}, {0., 2.}};
b = {{1, 0}, {1, 1}};
q = {{1, 0}, {0, 0}};
r = {{4, 2}, {2, 1}};
x1 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "Newton"];Automaticメソッドと比較する:
x2 = DiscreteRiccatiSolve[{a, b}, {q, r}];
Norm[a^.x2.a - x2 - a^.x2.b.Inverse[r + b^.x2.b].b^.x2.a + q]"MatrixSign"は,一般に,"Newton"法の初期近似として使われる:
{a, b} = {{{-0.1, 0}, {0, -0.02}}, {{0.1, 0}, {0.001, 0.01}}};
{q, r} = {{{100, 1000}, {1000, 10^4}}, {{1. + 10^-6, 1.}, {1., 1.}}};
xinit = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "MatrixSign"];x = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> {"Newton", "StartingMatrix" -> xinit, "Tolerance" -> 10^-12}];Map[Norm[a^.#.a - # - a^.#.b.Inverse[r + b^.#.b].b^.#.a + q]&, {xinit, x}]"MatrixSign"は,サブオプションとして,"MaxIterations"および"Tolerance"を取る:
x3 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> {"MatrixSign", "Tolerance" -> 10^-12, "MaxIterations" -> 10}];Norm[a^.x3.a - x3 - a^.x3.b.Inverse[r + b^.x3.b].b^.x3.a + q]a が特異値の場合は,"GeneralizedSchur"あるいは"GeneralizedEigensystem"が適用される:
a = SparseArray[{{1, 1} -> 0.8, {1, 5} -> -0.8, {2, 1} -> 0.8, {2, 5} -> -0.5, {5, 1} -> 0.25}];
b = Transpose[{{1, 0, 0, 1, 0}}];
r = {{1}};
q = IdentityMatrix[5];Det[a]x1 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "GeneralizedSchur"];x2 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "GeneralizedEigensystem"];Map[Norm[a^.#.a - # - a^.#.b.Inverse[r + b^.#.b].b^.#.a + q]&, {x1, x2}]"Eigensystem"は,a が特異行列のときは使うことができない:
x3 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "Eigensystem"];"InverseFree"は,r の条件がよくない場合に使うことができる:
{a, b} = {{{-0.1, 0}, {0, -0.02}}, {{0.1, 0}, {0.001, 0.01}}};
{q, r} = {{{100, 1000}, {1000, 10^4}}, {{1. + 10^-6, 1.}, {1., 1.}}};Norm[r] Norm[Inverse[r]]x1 = DiscreteRiccatiSolve[{a, b}, {q, r}, Method -> "InverseFree"]x2 = DiscreteRiccatiSolve[{a, b}, {q, r}]{Norm[a^.x1.a - x1 - a^.x1.b.Inverse[r + b^.x1.b].b^.x1.a + q],
Norm[a^.x2.a - x2 - a^.x2.b.Inverse[r + b^.x2.b].b^.x2.a + q]}アプリケーション (2)
{a, b} = {(| | | | | | |
| ------- | ------- | ------- | ------- | ------- | ------- |
| 0.1346 | 0.1236 | -0.0361 | 0.0037 | 0.0004 | -0.0003 |
| -0.1091 | 0.5412 | 0.3851 | -0.0631 | -0.052 | 0.0152 |
| 0.0426 | 0.1052 | 0.7915 | 0.07 | 0.0504 | -0.0172 |
| -0.0045 | 0.0205 | -0.0542 | 0.7932 | -0.5678 | 0.0025 |
| 0.0022 | -0.015 | 0.0384 | 0.5681 | 0.7526 | 0.0357 |
| 0.0002 | -0.0162 | 0.0142 | 0.0004 | -0.0299 | 0.9784 |), (| | |
| ------- | ------- |
| -0.0121 | 0.0117 |
| -0.0046 | -0.496 |
| -0.015 | 0.5517 |
| 0.0095 | -0.1763 |
| -0.0055 | -1.0216 |
| 0.0025 | 1.3944 |)};指定された重み行列{q,r}および初期状態 s0についての離散線形二次調整器費用 Jopt:
{q, r} = {(| | | | | | |
| - | - | - | - | - | - |
| 1 | 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 | 0 | 0 |
| 0 | 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)};Subscript[s, 0] = {{0.1, 0, 0, 0, 0, 0}};x = DiscreteRiccatiSolve[{a, b}, {q, r}];Subscript[J, opt] = ( Subscript[s, 0].x.Transpose[Subscript[s, 0]])[[1, 1]]すべての閉ループ極が半径
の円内にあることを保証する最適状態フィードバックゲインを計算する:
{a, b, q, r} = {(| | | |
| - | -------- | ---------- |
| 1 | 0.095162 | 0.00555872 |
| 0 | 0.904837 | 0.117397 |
| 0 | 0 | 1.49182 |), (| |
| ----------- |
| 0.000180325 |
| 0.00555872 |
| 0.122956 |), (| | | |
| -- | - | - |
| 10 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |), (1)};{Subscript[a, 1], Subscript[b, 1]} = ({a, b}/α) /. α -> 0.7;x = DiscreteRiccatiSolve[{Subscript[a, 1], Subscript[b, 1]}, {q, r}];Eigenvalues[a - b.Inverse[Transpose[Subscript[b, 1]].x.Subscript[b, 1] + r].Transpose[Subscript[b, 1]].x.Subscript[a, 1]]x = DiscreteRiccatiSolve[{a, b}, {q, r}];Eigenvalues[a - b.Inverse[Transpose[b].x.b + r].Transpose[b].x.a]特性と関係 (11)
DiscreteRiccatiSolve[{a,b},{q,r,p}]はDiscreteRiccatiSolve[{a-b.
.p,b},{q-p.r -1.p,r}]に等しい:
{a, b, q, r, p} = {(| | | |
| --------------- | ----------------- | -------------- |
| -0.25 - 0.011 I | 0.0947 + 0.089 I | 0.35 + 0.16 I |
| 0.35 + 0.22 I | -0.08 - 0.22 I | -0.4 - 0.53 I |
| -0.16 - 0.07 I | 0.05 + 0.1 I | 0.22 + 0.05 I |), (| | |
| --------- | ----------- |
| 1 + 0.5 I | -1 - 0.5 I |
| -0.5 - 1I | -0.5 + 1.5I |
| 0.1 I | -0.5I |), (| | | |
| - | - | - |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |), (| | |
| - | -- |
| 3 | -I |
| I | -3 |), (| | |
| ---- | --- |
| 0.1 | 0 |
| -0.2 | 0 |
| 0.15 | 0.2 |)};x = DiscreteRiccatiSolve[{a, b}, {q, r, p}];p を行列 a および q に組み込んでも同じ結果を得ることができる:
xp = DiscreteRiccatiSolve[{a - b .Inverse[r].ConjugateTranspose[p], b}, {q - p.Inverse[r].ConjugateTranspose[p],
r}];Chop[x - xp]{a,b}が安定化可能,{a,g}が検出可能で q=Transpose[g].g であれば,離散リッカチ方程式の解は半正定値である:
{a, b, g, r} = {(| | | |
| ---- | ---- | --- |
| 0.45 | 0 | 0 |
| 1 | -0.9 | 1 |
| 0 | 0 | 0.7 |), (| |
| - |
| 1 |
| 1 |
| 0 |), (1 0 0), (1)};JordanModelDecomposition[StateSpaceModel[{a, b, g}]]//LastPositiveSemidefiniteMatrixQ@DiscreteRiccatiSolve[{a, b}, {Transpose[g].g, r}]{a,b}が可制御で{a,g}が可観測であり q=Transpose[g].g であれば,離散リッカチ方程式の解は正定値である:
{a, b, g, r} = {(| | | | | |
| ---- | ----- | ------ | ------ | ----- |
| 0.98 | 0.048 | 0.0025 | 0.0046 | 0.008 |
| 0 | 0.95 | 0.08 | 0.2 | 0.533 |
| 0 | 0 | 0.23 | 1.26 | 6.52 |
| 0 | 0 | 0 | 0.082 | 1.428 |
| 0 | 0 | 0 | 0 | 0.367 |), (| |
| ------ |
| 0.0059 |
| 0.509 |
| 10.15 |
| 3.97 |
| 1.89 |), (1 0 0 0 0), (1)};ControllableModelQ[StateSpaceModel[{a, b}]]ControllableModelQ[StateSpaceModel[{Transpose[a], Transpose[g]}]]PositiveDefiniteMatrixQ[DiscreteRiccatiSolve[{a, b}, {Transpose[g].g, r}]]離散代数リッカチ方程式に関連する行列はシンプレクティックである:
With[{a = (| | | |
| - | --- | ------- |
| 1 | 0.5 | 0.4 |
| 0 | 1 | 0.09932 |
| 0 | 0 | 0.6738 |),
b = (| |
| ------- |
| 0.0085 |
| 0.04 |
| 0.09932 |),
q = (| | | |
| - | - | - |
| 5 | 0 | 0 |
| 0 | 3 | 0 |
| 0 | 0 | 1 |), r = (1)},
M = (| | |
| ---------------------------------- | ----------------------------- |
| a + b.Inverse[r].b.Inverse[a^].q | -b.Inverse[r].b.Inverse[a^] |
| -Inverse[a^].q | Inverse[a^] |)//ArrayFlatten];Ω = ArrayFlatten[(| | |
| ------------------------ | ------------------------ |
| ConstantArray[0, {3, 3}] | IdentityMatrix[3] |
| -IdentityMatrix[3] | ConstantArray[0, {3, 3}] |)];Chop[ConjugateTranspose[M].Ω.M] == ΩWith[{a = (| | | |
| ------------------ | ------------------ | ------------------ |
| 0.0661 - 0.2022 I | -0.8839 - 0.4677 I | -0.9869 - 0.2443 I |
| -0.7635 - 1.0728 I | 0.312 - 1.66 I | -0.8182 - 1.546 I |
| 1.311 + 1.3799 I | 1.0445 + 2.1423 I | 2.2958 + 1.8621 I |),
b = (| |
| ------------------ |
| 0.0015 + 0.0062 I |
| 0.0098 + 0.01223I |
| -0.004 - 0.01371I |),
q = (| | | |
| - | - | - |
| 5 | 0 | 0 |
| 0 | 3 | 0 |
| 0 | 0 | 1 |), r = (1)},
M = (| | |
| --------------------------------- | ---------------------------- |
| a + b.Inverse[r].b.Inverse[a].q | -b.Inverse[r].b.Inverse[a] |
| -Inverse[a].q | Inverse[a] |)//ArrayFlatten];ListPlot[Eigenvalues[M] /. Complex[x_, y_] :> {x, y}, PlotStyle -> PointSize[Medium], Epilog -> {Red, Circle[{0, 0}]}, AxesOrigin -> {0, 0}]Complement[Eigenvalues[M], Eigenvalues[Inverse[M]], SameTest -> (Chop[#1 - #2] == 0&)]リッカチ方程式の安定化解を得るためには,シンプレクティック行列は安定性および相補性の特性を満足しなければならない:
a = b = q = r = (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |);{vals, vecs} = Eigensystem[(| | |
| --------------------------------- | ----------------------------- |
| a + b.Inverse[r].b.Inverse[a].q | -b.Inverse[ r].b.Inverse[a] |
| -Inverse[a].q | Inverse[a] |)//ArrayFlatten]Cases[vals, _ ? (Abs[#] == 1&)]stableBasis = Extract[vecs, Position[vals, _ ? (Abs[#] < 1&), {1}]];{{Subscript[x, 1], Subscript[x, 2]}} = Partition[stableBasis, {2, 2}]MatrixRank[Subscript[x, 1]] == 2Subscript[x, 2].Inverse[Subscript[x, 1]]//SimplifyDiscreteRiccatiSolve[{a, b}, {q, r}] == %
のあるフィードバック系の固有値はシンプレクティック行列の安定固有値である:
{a, b, q, r} = {(| | |
| - | - |
| 1 | 3 |
| 1 | 2 |), (| |
| -- |
| 1 |
| -2 |), (| | |
| --- | - |
| 0.2 | 0 |
| 0 | 1 |), (0.5)};With[{x = DiscreteRiccatiSolve[{a, b}, {q, r}]}, Eigenvalues[a - b.Inverse[Transpose[b].x.b + r].Transpose[b].x.a]]Eigenvalues[ArrayFlatten[(| | |
| --------------------------------- | ----------------------------- |
| a + b.Inverse[r].b.Inverse[a].q | -b.Inverse[ r].b.Inverse[a] |
| -Inverse[a].q | Inverse[a] |)]];
Select[%, Abs[#] < 1&]DiscreteRiccatiSolveを使って最適状態フィードバックゲインを計算する:
{a, b, q, r} = {(| | |
| --- | --- |
| 0.2 | 1 |
| -1 | 0.5 |), (| |
| - |
| 1 |
| 0 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (1)};With[{x = DiscreteRiccatiSolve[{a, b}, {q, r}]}, Inverse[Transpose[b].x.b + r].Transpose[b].x.a]//NLQRegulatorGainsを使って同じ結果を直接得る:
LQRegulatorGains[StateSpaceModel[{a, b}, SamplingPeriod -> T], {q, r}]//NDiscreteRiccatiSolveを使って最適出力フィードバックゲインを計算する:
{a, b, c, q, r} = {(| | |
| -- | -- |
| -1 | 1 |
| 0 | -1 |), (| | |
| - | - |
| 0 | 1 |
| 1 | 0 |), (1 0), (10), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)};With[{x = DiscreteRiccatiSolve[{a, b}, {Transpose[c].q.c, r}]}, Inverse[Transpose[b].x.b + r].Transpose[b].x.a]//N//MatrixFormLQOutputRegulatorGainsは同じ結果を与える:
LQOutputRegulatorGains[StateSpaceModel[{a, b, c}, SamplingPeriod -> T], {q, r}]//N//MatrixFormDiscreteRiccatiSolveを使って最適推定器ゲインを計算する:
{a, b, c} = {(| | | | |
| ----- | ----- | ---- | --- |
| -0.02 | 0.005 | 2.4 | -32 |
| -0.14 | 0.44 | -1.3 | 30 |
| 0 | 0.018 | -1.6 | 1.2 |
| 0 | 0 | 1 | 0 |), (| | |
| ---- | ----- |
| 0.14 | -0.12 |
| 0.36 | -0.86 |
| 0.35 | 0.009 |
| 0 | 0 |), (0 1 0 0)};{w, v} = {(| | |
| ----- | ----- |
| 10^-2 | 0 |
| 0 | 10^-2 |), (10^-4)};With[{x = DiscreteRiccatiSolve[{Transpose[a], Transpose[c]}, {b.w.Transpose[b], v}]}, x.Transpose[c].Inverse[c.x.Transpose[c] + v]]LQEstimatorGainsを使う:
LQEstimatorGains[StateSpaceModel[{a, b, c}, SamplingPeriod -> τ], {w, v}]ssm = StateSpaceModel[{{{0, 0, 1, 0}, {0, 0, 0, 1}, {10.7275, 0, 0, 0}, {-0.9275, 0, 0, 0}},
{{0}, {0}, {-0.178571}, {0.178571}}, {{1, 0, 0, 0}, {0, 1, 0, 0}}, {{0}, {0}}},
SamplingPeriod -> None, SystemsModelLabels -> None];ssmd = ToDiscreteTimeModel[ssm, 0.1];{q, r} = {(| | | | |
| -- | - | -- | - |
| 10 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 0 | 10 | 0 |
| 0 | 0 | 0 | 1 |), (1000)};Subscript[s, 0] = {{0}, {0.1}, {0}, {0}};J = (Transpose[Subscript[s, 0]].RiccatiSolve[Normal[ssm][[1 ;; 2]], {q, r}].Subscript[s, 0])[[1, 1]];Subscript[J, d] = (Transpose[Subscript[s, 0]].DiscreteRiccatiSolve[Normal[ssmd][[1 ;; 2]], {q, r}].Subscript[s, 0])[[1, 1]];Greater[Subscript[J, d], J]考えられる問題 (1)
{a,b}が安定化不可能で{a,g}が検出不可能であれば,q=g.g のリッカチ方程式には安定化解がない:
{a, b, q, g, r} = {(| | | |
| --- | --- | ---- |
| 0.3 | 0 | 0 |
| 0.3 | 0.4 | 0.06 |
| 0 | 0 | 1.2 |), (| |
| ----- |
| 0.006 |
| 0.04 |
| 0 |), (| | | |
| - | - | - |
| 1 | 0 | 0 |
| 0 | 0 | 0 |
| 0 | 0 | 0 |), (1 0 0), (1)};{ControllableModelQ[StateSpaceModel[{a, b}]], ControllableModelQ[StateSpaceModel[{Transpose[a], Transpose[g]}]]}DiscreteRiccatiSolve[{a, b}, {q, r}]テキスト
Wolfram Research (2010), DiscreteRiccatiSolve, Wolfram言語関数, https://reference.wolfram.com/language/ref/DiscreteRiccatiSolve.html (2014年に更新).
CMS
Wolfram Language. 2010. "DiscreteRiccatiSolve." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2014. https://reference.wolfram.com/language/ref/DiscreteRiccatiSolve.html.
APA
Wolfram Language. (2010). DiscreteRiccatiSolve. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/DiscreteRiccatiSolve.html
BibTeX
@misc{reference.wolfram_2026_discretericcatisolve, author="Wolfram Research", title="{DiscreteRiccatiSolve}", year="2014", howpublished="\url{https://reference.wolfram.com/language/ref/DiscreteRiccatiSolve.html}", note=[Accessed: 11-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_discretericcatisolve, organization={Wolfram Research}, title={DiscreteRiccatiSolve}, year={2014}, url={https://reference.wolfram.com/language/ref/DiscreteRiccatiSolve.html}, note=[Accessed: 11-September-2026]}