RiccatiSolve[{a,b},{q,r}]
連続代数リッカティ(Riccati)方程式
の安定化解である行列
を与える.
RiccatiSolve[{a,b},{q,r,p}]
方程式
を解く.
RiccatiSolve
RiccatiSolve[{a,b},{q,r}]
連続代数リッカティ(Riccati)方程式
の安定化解である行列
を与える.
RiccatiSolve[{a,b},{q,r,p}]
方程式
を解く.
詳細とオプション
の「
」は共役転置を示す.
が安定化可能で
が検出可能,
で
のとき,方程式
には一意的で対称な半正定値解
がある.これにより,行列
の固有値はすべて負で解は安定化される.
が可制御で
が可観測のとき,解は正定値である.- RiccatiSolveはMethodオプションをサポートする.以下は,その可能な設定値である.
-
Automatic 自動的に決定されたメソッド "Eigensystem" 固有値分解に基づく "GeneralizedEigensystem" 一般化された固有値分解に基づく "GeneralizedSchur" 一般化されたSchur分解に基づく "InverseFree" "GeneralizedSchur"の変化形 "MatrixSign" 行列符号関数を使った反復法 "Newton" 反復ニュートン法 "Schur" Schur分解に基づく - メソッドはどれも近似数値行列に適用される."Eigensystem"は厳密行列にも適用される.
例題
すべて開く すべて閉じる例 (1)
{a, b, q, r} = {(| | |
| -- | - |
| -3 | 2 |
| 1 | 1 |), (| |
| - |
| 0 |
| 1 |), (| | |
| --- | --- |
| 1. | -1. |
| -1. | 1. |), (3)};x = RiccatiSolve[{a, b}, {q, r}]Transpose[a].x + x.a - x.b.Inverse[r].Transpose[b].x + q//Chopスコープ (3)
RiccatiSolve[{(| | | |
| -- | -- | -- |
| -1 | 0 | 0 |
| 0 | -4 | 0 |
| 0 | 0 | -6 |), (| |
| -- |
| 3 |
| 1 |
| -1 |)}, {(| | | |
| - | - | - |
| 4 | 2 | 0 |
| 2 | 4 | 0 |
| 0 | 0 | 1 |), {{1.}}}]//MatrixFormRiccatiSolve[{(| | | |
| - | ------ | --- |
| 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 |)}]状態空間モデルオブジェクトから適切な行列を抽出することでリッカティ方程式を解く:
ssm = StateSpaceModel[{{{0.4245, 0.1137}, {-0.4145, -0.0987}}, {{9.764, 0}, {-6.32, -3.455}}},
SamplingPeriod -> None, SystemsModelLabels -> None];{q, r} = {(| | |
| ---- | ---- |
| 84.4 | 0 |
| 0 | 6.16 |), (| | |
| ----- | ----- |
| 10^-3 | 0 |
| 0 | 10^-3 |)};RiccatiSolve[Normal[ssm][[1 ;; 2]], {q, r}]オプション (7)
Method (7)
Automaticおよび"Eigensystem"メソッドは,厳密な系に使うことができる:
x1 = RiccatiSolve[{(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, {(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, Method -> Automatic]x2 = RiccatiSolve[{(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, {(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, Method -> "Eigensystem"]x1 == x2x1 = RiccatiSolve[N@{(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, {(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, Method -> Automatic]x2 = RiccatiSolve[N@{(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, {(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, Method -> "Eigensystem"]x1 == x2RiccatiSolve[{N@(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, {(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)}, Method -> "Schur"]"Newtonは厳密ではない系に適用され,Automaticよりも正確であることがある:
a = SparseArray[{{1, 1} -> 0.8, {1, 5} -> -0.8, {2, 1} -> 0.8, {2, 2} -> 1, {3, 3} -> -0.1, {2, 5} -> -0.5, {5, 1} -> 0.25}];
b = Transpose[{{1, 0, 0, 1, 0}}];
r = {{1}};
q = IdentityMatrix[5];x1 = RiccatiSolve[{a, b}, {q, r}, Method -> "Newton"];Norm[a^.x1 + x1.a - x1.b.Inverse[r].b^.x1 + q]x2 = RiccatiSolve[{a, b}, {q, r}];Norm[a^.x2 + x2.a - x2.b.Inverse[r].b^.x2 + q]"Newton"は,"StartingMatrix","MaxIterations","Tolerance"のサブオプションを取る:
x3 = RiccatiSolve[{a, b}, {q, r}, Method -> {"Newton", "StartingMatrix" -> x2, "Tolerance" -> 10^-13, "MaxIterations" -> 20}];Norm[a^.x3 + x3.a - x3.b.Inverse[r].b^.x3 + q]"Newton"法は,安定化解が存在するときでも収束しないことがある:
a = ConstantArray[0., {5, 5}];
r = b = q = IdentityMatrix[5];
RiccatiSolve[{a, b}, {q, r}, Method -> "Newton"];Automaticメソッドと比較する:
x = RiccatiSolve[{a, b}, {q, r}]"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 = RiccatiSolve[{a, b}, {q, r}, Method -> "MatrixSign"];x = RiccatiSolve[{a, b}, {q, r}, Method -> {"Newton", "StartingMatrix" -> xinit, "Tolerance" -> 10^-10, "MaxIterations" -> 10}];Map[Norm[a^.# + #.a - #.b.Inverse[r].b^.# + q]&, {xinit, x}]"MatrixSign"は,"MaxIterations"および"Tolerance"のサブオプションを取る:
x3 = RiccatiSolve[{a, b}, {q, r}, Method -> {"MatrixSign", "Tolerance" -> 10^-10, "MaxIterations" -> 10}];Norm[a^.x3 + x3.a - x3.b.Inverse[r].b^.x3 + q]"GeneralizedSchur"および"GeneralizedEigensystem"は,a が特異値の場合に適用される:
a = SparseArray[{{1, 1} -> 0.8, {1, 5} -> -0.8, {2, 1} -> 0.8, {2, 5} -> -0.5, {2, 2} -> 1, {3, 3} -> -0.1, {5, 1} -> 0.25}];
b = Transpose[{{1, 0, 0, 1, 0}}];
r = {{1}};
q = IdentityMatrix[5];Det[a]x1 = RiccatiSolve[{a, b}, {q, r}, Method -> "GeneralizedSchur"];
x2 = RiccatiSolve[{a, b}, {q, r}, Method -> "GeneralizedEigensystem"];Map[Norm[a^.# + #.a - #.b.Inverse[r].b^.# + q]&, {x1, x2}]"InverseFree"は r の条件がよくない場合に使うことができる:
{a, b} = {{{-0.1, 0}, {0, -0.02}}, {{0.1, 0}, {0.001, 0.01}}};
{q, r} = {{{10, 10}, {10, 1000}}, {{1 + 10^-9, 1 - 10^-10}, {1, 1.}}};Norm[r] Norm[Inverse[r]]x1 = RiccatiSolve[{a, b}, {q, r}, Method -> "InverseFree"]x2 = RiccatiSolve[{a, b}, {q, r}]{Norm[a^.x1 + x1.a - x1.b.Inverse[r].b^.x1 + q], Norm[a^.x2 + x2.a - x2.b.Inverse[r].b^.x2 + q]}アプリケーション (3)
pendssm = StateSpaceModel[{{{0, 1, 0, 0}, {(g*(m + M))/
(l*M), 0, 0, 0}, {0, 0, 0, 1},
{(-g)*(m/M), 0, 0, 0}},
{{0}, {-l^(-1)/M}, {0}, {M^(-1)}},
{{1, 0, 0, 0}, {0, 0, 1, 0}}, {{0}, {0}}}, SamplingPeriod -> None, SystemsModelLabels -> None] /. {M -> 5.6, m -> 0.53, l -> 0.85, g -> 9.8};{q, r} = {(| | | | |
| -- | - | -- | - |
| 10 | 0 | 0 | 0 |
| 0 | 1 | 0 | 0 |
| 0 | 0 | 10 | 0 |
| 0 | 0 | 0 | 1 |), (1000)};Subscript[s, init] = (| |
| --- |
| 0 |
| 0 |
| 0.1 |
| 0 |);x = RiccatiSolve[Normal[pendssm][[1 ;; 2]], {q, r}];Subscript[J, opt] = (Transpose[Subscript[s, init]].x.Subscript[s, init])[[1, 1]]k = LQRegulatorGains[pendssm, {q, r}];Subscript[ss, CL] = SystemsModelStateFeedbackConnect[pendssm, k];Subscript[x, t] = StateResponse[{Subscript[ss, CL], Flatten[Subscript[s, init]]}, {0}, {t, 10^5}];Subscript[J, opt] = NIntegrate[Subscript[x, t].(q + Transpose[k].r.k).Subscript[x, t], {t, 0, 10^5}]最適軌道に沿って各値についての「cost-to-go(かかる費用)」を追跡する:
Plot[Evaluate[Subscript[x, t].x.Subscript[x, t]], {t, 0, 50}, PlotRange -> All]すべての閉ループ極を
の左側に置く最適化状態フィードバックゲインを計算する:
{a, b, q, r} = {(| | | | | |
| ---- | ---- | ----- | ----- | --- |
| -0.2 | 0.5 | 0 | 0 | 0 |
| 0 | -0.5 | 1.6 | 0 | 0 |
| 0 | 0 | -14.3 | 85.8 | 0 |
| 0 | 0 | 0 | -33.3 | 100 |
| 0 | 0 | 0 | 0 | -10 |), (| |
| -- |
| 0 |
| 0 |
| 0 |
| 0 |
| 30 |), (| | | | | |
| -- | -- | - | - | - |
| 10 | 0 | 0 | 0 | 0 |
| 0 | 20 | 0 | 0 | 0 |
| 0 | 0 | 6 | 0 | 0 |
| 0 | 0 | 0 | 2 | 0 |
| 0 | 0 | 0 | 0 | 5 |), (1)};Subscript[a, 1] = a + α IdentityMatrix[Length[a]] /. α -> 2;k = Inverse[r].Transpose[b].RiccatiSolve[{Subscript[a, 1], b}, {q, r}];Eigenvalues[a - b.k]Eigenvalues[a - b.(Inverse[r].Transpose[b].RiccatiSolve[{a, b}, {q, r}])]{a, b, c, w, v} = {(| | | |
| ---- | ---- | --- |
| -1.7 | 50 | 260 |
| 0.22 | -1.4 | -32 |
| 0 | 0 | -12 |), (| | | |
| ---- | ------- | ----- |
| -272 | 0.02 | 0.1 |
| 0 | -0.0035 | 0.004 |
| 14 | 0 | 0 |), (| | | |
| - | - | - |
| 1 | 0 | 0 |
| 0 | 1 | 0 |), (| | |
| -- | -- |
| 10 | 0 |
| 0 | 10 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)};g = b[[All, {2, 3}]];q = g.v.Transpose[g];Tr[RiccatiSolve[{Transpose[a], Transpose[c]}, {q, v}]]特性と関係 (8)
{a, b} = {(| | |
| ------------------ | ------------------ |
| 2.5731 + 0.3269 I | 0.725 - 0.3024 I |
| -0.9543 - 2.7184 I | -2.5731 - 0.3268 I |), (| | |
| ----------------- | ----------------- |
| -0.1076 - 0.2184I | -0.835 - 0.0684 I |
| -0.6379 + 1.198I | 0.08 + 0.6334I |)};{q, r, p} = {(| | |
| - | - |
| 2 | 0 |
| 0 | 4 |), (| | |
| ----- | ----- |
| 1 | 1 - I |
| 1 + I | 1 |), (| | |
| - | - |
| 4 | 1 |
| 3 | 2 |)};x = RiccatiSolve[{a, b}, {q, r, p}];p を行列 a および q に組み込むことによっても同様の結果が求まる:
xp = RiccatiSolve[{a - b.Inverse[r].ConjugateTranspose[p], b}, {q - p.Inverse[r].ConjugateTranspose[p], r}];xp - x//Chop{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[RiccatiSolve[{a, b}, {Transpose[g].g, r}]]ハミルトン行列
の固有値は{λ,-λ}の形式のペアである:
With[{a = (| | |
| -------------------- | ------------------- |
| -16.826 - 18.09129 I | 6.1228 - 28.4026 I |
| 19.2776 - 1.14335 I | 13.826 + 18.0913 I |), b = (| |
| ------------------ |
| -0.8019 - 0.0491 I |
| 0.4257 - 0.4331 I |), q = (| | |
| -- | - |
| 10 | 0 |
| 0 | 1 |), r = (1)}, H = ArrayFlatten[(| | |
| -- | ----------------------------------- |
| a | -b.Inverse[r].ConjugateTranspose[b] |
| -q | -ConjugateTranspose[a] |)]];ListPlot[Eigenvalues[H] /. Complex[x_, y_] :> {x, y}, PlotStyle -> PointSize[Medium]]Complement[Eigenvalues[H], Eigenvalues[-H], SameTest -> (Chop[#1 - #2] == 0&)]{a, b, q, r} = {(| | |
| - | - |
| 3 | 0 |
| 0 | 3 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)};{vals, vecs} = Eigensystem[ArrayFlatten[(| | |
| -- | -------------------------- |
| a | -b.Inverse[r].Transpose[b] |
| -q | -Transpose[a] |)]]Cases[vals, Complex[0, _]]stableBasis = Extract[vecs, Position[vals, _ ? (# < 0&), {1}]];{{Subscript[x, 1], Subscript[x, 2]}} = Partition[stableBasis, {2, 2}]MatrixRank[Subscript[x, 1]] == 2Subscript[x, 2].Inverse[Subscript[x, 1]]//SimplifyRiccatiSolve[{a, b}, {q, r}] == %{a, b, q, r} = {(| | |
| -- | -- |
| 7 | 10 |
| -5 | -8 |), (| |
| ------ |
| (5/3) |
| -(4/3) |), (| | |
| --- | --- |
| 0.3 | 0 |
| 0 | 0.9 |), (0.5)};Eigenvalues[a - b.Inverse[r].Transpose[b].RiccatiSolve[{a, b}, {q, r}]]λ = Eigenvalues[ArrayFlatten[(| | |
| -- | -------------------------- |
| a | -b.Inverse[r].Transpose[b] |
| -q | -Transpose[a] |)]];Select[λ, # < 0&]RiccatiSolveを使って最適化状態フィードバックゲインを計算する:
{a, b, q, r} = {(| | |
| - | - |
| 0 | 1 |
| 0 | 0 |), (| |
| - |
| 0 |
| 1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |), (1)};Inverse[r].Transpose[b].RiccatiSolve[{a, b}, {q, r}]//N//ChopLQRegulatorGainsを使って同じ結果を直接計算する:
LQRegulatorGains[StateSpaceModel[{a, b}], {q, r}]//N//ChopRiccatiSolveを使って最適化出力フィードバックゲインを計算する:
{a, b, c, q, r} = {(| | | |
| -- | -- | -- |
| -2 | 0 | 1 |
| 0 | -1 | 0 |
| -3 | -4 | -2 |), (| | |
| - | - |
| 0 | 1 |
| 0 | 0 |
| 1 | 0 |), (| | | |
| - | - | - |
| 1 | 0 | 0 |
| 0 | 1 | 0 |), (| | |
| --- | --- |
| 100 | 0 |
| 0 | 0.1 |), (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |)};Inverse[r].Transpose[b].RiccatiSolve[{a, b}, {Transpose[c].q.c, r}]//MatrixFormLQOutputRegulatorGainsも同じ結果を与える:
LQOutputRegulatorGains[StateSpaceModel[{a, b, c}], {q, r}]//MatrixFormRiccatiSolveを使って最適化推定器ゲインを計算する:
{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 = 10^-2(| | |
| - | - |
| 1 | 0 |
| 0 | 1 |);v = ((1/10000));RiccatiSolve[{Transpose[a], Transpose[c]}, {b.w.Transpose[b], v}].Transpose[c].Inverse[v]LQEstimatorGainsを使ってこの結果を直接計算する:
LQEstimatorGains[StateSpaceModel[{a, b, c}], {w, v}]考えられる問題 (1)
が安定化不可能であるか,
が検出不可能な場合,
のリッカティ方程式には安定化解がない:
{a, b, g, r} = {(| | | |
| - | -- | - |
| 1 | 0 | 0 |
| 1 | -1 | 1 |
| 0 | 0 | 2 |), (| |
| - |
| 1 |
| 1 |
| 0 |), (1 0 0), (1)};{ControllableModelQ[StateSpaceModel[{a, b}]], ControllableModelQ[StateSpaceModel[{Transpose[a], Transpose[g]}]]}RiccatiSolve[{a, b}, {Transpose[g].g, r}]テキスト
Wolfram Research (2010), RiccatiSolve, Wolfram言語関数, https://reference.wolfram.com/language/ref/RiccatiSolve.html (2014年に更新).
CMS
Wolfram Language. 2010. "RiccatiSolve." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2014. https://reference.wolfram.com/language/ref/RiccatiSolve.html.
APA
Wolfram Language. (2010). RiccatiSolve. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/RiccatiSolve.html
BibTeX
@misc{reference.wolfram_2026_riccatisolve, author="Wolfram Research", title="{RiccatiSolve}", year="2014", howpublished="\url{https://reference.wolfram.com/language/ref/RiccatiSolve.html}", note=[Accessed: 17-June-2026]}
BibLaTeX
@online{reference.wolfram_2026_riccatisolve, organization={Wolfram Research}, title={RiccatiSolve}, year={2014}, url={https://reference.wolfram.com/language/ref/RiccatiSolve.html}, note=[Accessed: 17-June-2026]}