SystemModelLinearize[model]
平衡点における model についての線形化された状態空間モデルStateSpaceModelを与える.
SystemModelLinearize[model,op]
操作点 op で線形化する.
SystemModelLinearize
SystemModelLinearize[model]
平衡点における model についての線形化された状態空間モデルStateSpaceModelを与える.
SystemModelLinearize[model,op]
操作点 op で線形化する.
詳細とオプション
- SystemModelLinearizeは,操作点近くにおける model の線形近似を与える.
- 線形モデルは,制御設計,最適化,周波数解析等でよく使われる.
- 方程式
と出力方程式
を持つ系は,f(0,x0,u0)0を満足する操作点
および
で線形化される. - 返される線形状態空間モデルStateSpaceModelは,状態
,入力
,出力
を持つ.状態方程式は
で出力方程式は
である.行列は,
,
,
,
,
(すべてがt
,
,
で評価される)で与えられる. - SystemModelLinearize[model]はSystemModelLinearize[model,"EquilibriumValues"]に等しい.
- op の指定には,操作点として次の値が使われる.
-
"InitialValues" model からの初期値 "EquilibriumValues" FindSystemModelEquilibrium[model] sim または {sim,"StopTime"} SystemModelSimulationData sim からの最終値 {sim,"StartTime"} sim の初期値 {sim,time} time における sim からの値 {{{x1,x10},…},{{u1,u10},…}} 状態値 xi0と入力値 ui0 - シミュレーション sim はSystemModelSimulate[model,All,…]を使って得ることができる.
- SystemModelLinearizeは,微分代数方程式系を記号的に線形化する.あるいは,微分代数方程式を常微分方程式系に簡約し,結果の常微分方程式系を数値的に線形化する.
- 次は,使用可能なオプションである.
-
Method Automatic 線形化アルゴリズムのメソッド ProgressReporting $ProgressReporting 進捗状況の表示を制御する - オプションMethodには次の可能な設定がある.
-
"NumericDerivative" 常微分方程式に簡約してから数値的に線形化する "SymbolicDerivative" 微分代数方程式系を記号的に線形化する - Method{"SymbolicDerivative","ReduceIndex"False}は指数削減をオフにする.
例題
すべて開く すべて閉じる例 (3)
SystemModelLinearize[[image]]指定された状態と入力条件を使って,混合タンクモデルを平衡点の周りで線形化する:
SystemModelLinearize[[image], {{{"H", 0.75}}, {{"u1", 5.23}}}]製品に含まれているintroductory hierarchicalの例の1つを線形化する:
model = Last@SystemModelExamples["Models", "IntroductoryExamples.Hierarchical.*"]SystemModelLinearize[model]スコープ (19)
モデルタイプ (5)
SystemModelLinearize[[image]]SystemModelLinearize[[image]]SystemModelLinearize[[image]]SystemModelLinearize[\!\(\*GraphicsBox[«8»]\)]SystemModelLinearize[\!\(\*GraphicsBox[«8»]\), Method -> {"SymbolicDerivative", "SymbolicParameters" -> {"R1", "R2", "L"}}]限定的なケース (3)
線形化の値 (5)
SystemModelLinearize[[image], "EquilibriumValues"]SystemModelLinearize[[image], "InitialValues"]SystemModelLinearize[[image], {{{"H1", 2.03}, {"T1", 318.15}, {"T2", 318.15}}, {{"u1", 5}, {"u2", 5}}}, "EquilibriumValues"]SystemModelLinearize[[image], {{{"H1", 5}, {"T1", 318.15}, {"T2", 318.15}}, {}}, "EquilibriumValues"]指定された部分的な状態と入力の周りで,残りの値には初期値を使って線形化する:
SystemModelLinearize[[image], {{{"H1", 3.03}, {"T1", 318.15}, {"T2", 318.15}}, {{"u1", 5}, {"u2", 5}}}, "InitialValues"]操作点 (6)
SystemModelLinearize[[image], "EquilibriumValues"]SystemModelLinearize[[image], "InitialValues"]与えられた状態と入力の制約の下で,平衡点の周りで線形化する:
SystemModelLinearize[[image], {{{"H1", 2.03}, {"T1", 318.15}, {"T2", 318.15}}, {{"u1", 5}, {"u2", 5}}}, "EquilibriumValues"]sim = SystemModelSimulate[[image], All, {0, 0}]SystemModelLinearize[[image], {sim, "StartTime"}]sim = SystemModelSimulate[[image], All]SystemModelLinearize[[image], {sim, "StopTime"}]シミュレーションの実行から定常状態までの最終の値の周りで線形化する:
sim = SystemModelSimulate[[image], All, Method -> {"StopAtSteadyState" -> True}]SystemModelLinearize[[image], {sim, "StopTime"}]一般化と拡張 (1)
結果のStateSpaceModelのラベルを隠す:
SystemModelLinearize[[image], SystemsModelLabels -> None]オプション (5)
Method (4)
"SymbolicDerivative"メソッドは,シミュレーションからの完全に指定された操作点を使う:
sim = SystemModelSimulate[[image], All, {0, 0}]SystemModelLinearize[[image], sim, Method -> "SymbolicDerivative"]"NumericDerivative"メソッドは,状態と入力の値で指定された操作点を使う:
SystemModelLinearize[[image], {{{"capacitor.v", 0.}, {"inductor.i", 0.}}, {{"v", 0.}}}, Method -> "NumericDerivative"]記号的に線形化することで,いくつかのパラメータを記号のままにしておける:
SystemModelLinearize[[image], Method -> {"SymbolicDerivative", "SymbolicParameters" -> {"R", "L", "C"}}]"ReduceIndex"を使って記号的に線形化する際に指標削減をオフにする:
sim = SystemModelSimulate[[image], All, {0, 0}];指標削減をオフにすると記述子のStateSpaceModelになる:
SystemModelLinearize[[image], sim, Method -> {"SymbolicDerivative", "ReduceIndex" -> False}]ProgressReporting (1)
ProgressReportingで進捗状況の報告を制御する:
SystemModelLinearize[[image], ProgressReporting -> False]アプリケーション (10)
線形化された系を解析する (5)
あるモデルとその線形化されたものからの平衡点における応答を比較する:
model = [image];{Subscript[x, 0], Subscript[u, 0], Subscript[y, 0]} = FindSystemModelEquilibrium[model];ss = SystemModelLinearize[model, "EquilibriumValues"];{linY1, linY2} = OutputResponse[ss, {UnitStep[t], UnitStep[t]}, {t, 0, 300}];nonLin = SystemModelSimulate[model, {0, 300}, <|"InitialValues" -> Rule@@@Subscript[x, 0], "Inputs" -> {"u1" -> Function[t, Subscript[u, 0][[1, 2]] + UnitStep[t]], "u2" -> Function[t, Subscript[u, 0][[2, 2]] + UnitStep[t]]}|>];Show[SystemModelPlot[nonLin, {"y1"}], Plot[Tooltip[Subscript[y, 0][[1, 2]] + linY1, "linear y1"], {t, 0, 300}]]ss = SystemModelLinearize[[image], "InitialValues"]{a, b, c, d} = Normal[ss];Re@Eigenvalues[a]Plot[Evaluate[OutputResponse[ss, UnitStep[t], {t, 1}]], {t, 0, 1}]tf = TransferFunctionModel@SystemModelLinearize[[image]];TransferFunctionPoles[tf]model = \!\(\*GraphicsBox[«8»]\);ss = SystemModelLinearize[model];BodePlot[ss, {0.5, 3}, PlotLayout -> "Magnitude"]Fourierをシミュレーションデータに使って結果を検証する:
nonLin = SystemModelSimulate[model, {0, 200}, <|"Inputs" -> {"u" -> Function[t, UnitStep[t] - UnitStep[t - 2]]}|>];odata = Abs@Fourier@Table[nonLin[{"inertia3.w"}, t][[1]], {t, 0, 200, 0.25}];
idata = Abs@Fourier@Table[UnitStep[t] - UnitStep[t - 2], {t, 0, 200, 0.25}];ListLogLinearPlot[odata[[1 ;; 200]] / idata[[1 ;; 200]], Joined -> True, DataRange -> {0, 2Pi}, PlotRange -> {{0.5, 3}, {0, 50}}]{a, b, c, d} = Normal[ss];Im[Eigenvalues[a]]model = [image];model2 = SystemModel[model, {"t" -> 0}];rlc = SystemModelLinearize[model2]model3 = SystemModel[model2, {"t" -> 1}];rl = SystemModelLinearize[model3]線形化された系の制御設計 (5)
tf = TransferFunctionModel@SystemModelLinearize[[image]];pidTf = TransferFunctionModel[kp (1 + 1 / (τi ) + τd ), ];cltf = SystemsModelFeedbackConnect[SystemsModelSeriesConnect[pidTf, tf]];Manipulate[
Plot[OutputResponse[cltf /. {kp -> gain, τi -> iTime, τd -> dTime}, UnitStep[t], {t, 20}]//Evaluate, {t, 0, 20}, PlotStyle -> Thick, GridLines -> Automatic, Frame -> True, PlotRange -> {0, 1.2}],
{{gain, 1, "SubscriptBox[k, p]"}, 0.01, 10}, {{dTime, 0.01, "SubscriptBox[τ, d]"}, 0.01, 10}, {{iTime, 1.9, "SubscriptBox[τ, i]"}, 0.01, 10}, SaveDefinitions -> True]DCモーターのためのleadベースの制御を,モーターの線形化に基づいて設計する:
tf = TransferFunctionModel@SystemModelLinearize[[image]];piLeadTf = TransferFunctionModel[kp (1 + 1 / τi (τd + 1) / (α τd + 1)), ];optf = SystemsModelSeriesConnect[piLeadTf, tf];Manipulate[BodePlot[newOptf = optf /. {kp -> Kp, τi -> Τi, τd -> Τd, α -> Α}, StabilityMargins -> True, PlotLayout -> "List"],
{{Kp, 4.5, "SubscriptBox[k, p]"}, 0.01, 10}, {{Τi, 2, "τi"}, 0.01, 10}, {{Τd, 0.01, "τd"}, 0.01, 10}, {{Α, 0.07, "α"}, 0.01, 0.9}, SaveDefinitions -> True]選択されたパラメータを使い,PI-lead制御でループを閉じる:
cltf = SystemsModelFeedbackConnect[SystemsModelSeriesConnect[newOptf, tf]];Plot[OutputResponse[cltf, UnitStep[t], {t, 20}]//Evaluate, {t, 0, 20}, PlotStyle -> Thick, GridLines -> Automatic, Frame -> True, PlotRange -> All]ss = SystemModelLinearize[[image]];k = StateFeedbackGains[ss, {-0.251, -0.222, -0.222}]clss = SystemsModelStateFeedbackConnect[ss, k];Plot[OutputResponse[clss, {UnitStep[t], UnitStep[t]}, {t, 100}]//Evaluate, {t, 0, 100}, PlotRange -> All]ss = SystemModelLinearize[[image]];{q1, q2} = {DiagonalMatrix[{1, 6 10^-4, 6 10^-4}], DiagonalMatrix[{0.0002, 0.0002}]};k = LQRegulatorGains[ss, {q1, q2}]clss = SystemsModelStateFeedbackConnect[ss, k];Plot[OutputResponse[clss, {UnitStep[t], UnitStep[t]}, {t, 100}]//Evaluate, {t, 0, 100}, PlotRange -> All]model = [image];ss = SystemModelLinearize[model];l = EstimatorGains[ss, {-0.6020, -0.5856, -0.5697}]{a, b, c, d} = Normal[ss];ssobsv = StateSpaceModel[{a - l.c, ArrayFlatten[{{b - l.d, l}}], IdentityMatrix[3]}];sresp = StateResponse[ss, {UnitStep[t], UnitStep[t]}, {t, 200}];y = OutputResponse[ss, {UnitStep[t], UnitStep[t]}, {t, 200}];oresp = OutputResponse[ssobsv, {UnitStep[t], UnitStep[t], y[[1]], y[[2]]}, {t, 200}];states = model["StateVariables"];Table[Plot[{sresp[[i]], oresp[[i]]}, {t, 0, 200}, PlotLabel -> states[[i]]], {i, 3}]特性と関係 (8)
SystemModelからのプロパティを使って初期値の周りで線形化する:
model = [image];ival = model["GroupedInitialValues"]SystemModelLinearize[model, ival, "InitialValues"] == SystemModelLinearize[model, "InitialValues"]FindSystemModelEquilibriumを使って平衡点の周りで線形化する:
model = [image];eqval = FindSystemModelEquilibrium[model];SystemModelLinearize[model, eqval] == SystemModelLinearize[model, "EquilibriumValues"]model = [image];{Subscript[x, 0], Subscript[u, 0], Subscript[y, 0]} = FindSystemModelEquilibrium[model, {"H" == 0.85, "Tu" == 38, "Tx" == 38}]ss = SystemModelLinearize[model, {{{"H", 0.85}, {"Tu", 38}, {"Tx", 38}}, {}}, "EquilibriumValues"]{linY1, linY2} = OutputResponse[ss, {UnitStep[t], UnitStep[t]}, {t, 0, 300}];nonLin = SystemModelSimulate[model, {0, 300}, <|"InitialValues" -> Rule@@@Subscript[x, 0], "Inputs" -> {"u1" -> Function[t, Subscript[u, 0][[1, 2]] + UnitStep[t]], "u2" -> Function[t, Subscript[u, 0][[2, 2]] + UnitStep[t]]}|>];Show[SystemModelPlot[nonLin, {"y1"}], Plot[Evaluate@Tooltip[Subscript[y, 0][[1, 2]] + linY1, "linear y1"], {t, 0, 300}]]model = [image];Subscript[x, 0] = {{"H", 0.85}, {"Tu", 38}, {"Tx", 38}}Subscript[u, 0] = {{"u1", 5.23}, {"u2", 3.08}}ss = SystemModelLinearize[model, {Subscript[x, 0], Subscript[u, 0]}, "InitialValues"];{linY1, linY2} = OutputResponse[ss, {UnitStep[t], UnitStep[t]}, {t, 0, 300}];nonLin = SystemModelSimulate[model, {0, 300}, <|"InitialValues" -> Rule@@@Subscript[x, 0], "Inputs" -> {"u1" -> Function[t, Subscript[u, 0][[1, 2]] + UnitStep[t]], "u2" -> Function[t, Subscript[u, 0][[2, 2]] + UnitStep[t]]}|>];eqs = model["SystemEquations", t] /. model["ParameterValues"]Subscript[g, out] = Cases[eqs, (QuantityVariable["y1", _] | QuantityVariable["y2", _])[t] == rhs__ :> rhs];{Subscript[y, 2, 0], Subscript[y, 1, 0]} = Subscript[g, out] /. (Function[{var, val}, QuantityVariable[var, _][t] -> val]@@@Subscript[x, 0]);Show[Plot[Evaluate@Tooltip[Subscript[y, 1, 0] + linY1, "linear y1"], {t, 0, 300}], SystemModelPlot[nonLin, {"y1"}]]TransferFunctionModelを使って伝達関数表現に変換する:
SystemModelLinearize[[image]]TransferFunctionModel[%]ToDiscreteTimeModelを使って線形モデルを離散化する:
SystemModelLinearize[[image]]ToDiscreteTimeModel[%, 0.10, z]linearize1 = [image];linearize1["ModelicaDisplay"]ss1 = SystemModelLinearize[linearize1]linearize2 = [image];linearize2["ModelicaDisplay"]ss2 = SystemModelLinearize[linearize2]TransferFunctionModel[ss1] == TransferFunctionModel[ss2]StateSpaceModelは常微分方程式系を線形化できる:
ClearAll[t, x, θ, i, vin, g, r, lin, mc, mp, l, k, dc, dp, a];eqs = {(mc + mp)x''[t] - mp l Cos[θ[t]] θ''[t] + mp l Sin[θ[t]] θ'[t]^2 == k i[t] - dc x'[t], θ''[t]mp (4l^2 / 3 + a^2 / 4) - mp l x''[t] Cos[θ[t]] == mp g l Sin[θ[t]] - dp θ'[t], 0 == vin[t] - r i[t] - lin i'[t] - k x'[t]};opssm = Sequence[{{i[t], 0}, {θ[t], 0}, {θ'[t], 0}, {x[t], 0}, {x'[t], 0}}, {{vin[t], 0}}];outputs = {θ[t], x[t]};ssm = StateSpaceModel[eqs, opssm, outputs, t]//SimplifyparVals = {g -> 9.80665, r -> 13, lin -> 1, mc -> 445 * 0.1^3, mp -> 7700 * π * 0.005^2 * 0.61, l -> 0.61 / 2, a -> 0.005, k -> 3.7 * 157.48 * 1.6, dc -> 2, dp -> 0.01};ssm /. parValsSystemModelLinearizeを使って同じ系のSystemModelを線形化する:
model = SystemModel[[image], <|"ParameterValues" -> {"electricalMotor.J" -> 0}|>];op = FindSystemModelEquilibrium[model]SystemModelLinearize[model, op]方程式からNonlinearStateSpaceModelを作成し,SystemModelと比較する:
nssm = NonlinearStateSpaceModel[eqs, opssm, outputs, t]//SimplifyplotComparison[nssmVar_, smVar_] := Show[SystemModelPlot[nssm, {nssmVar}, 20, <|"ParameterValues" -> parVals, "Inputs" -> {vin -> UnitBox}|>, PlotLabel -> nssmVar, ...], SystemModelPlot[model, {smVar}, 20, <|"Inputs" -> {"V" -> UnitBox}|>, TargetUnits -> "Unit", ...]];plotComparison[θ, "pendulum.pendulumDamper.phi_rel"]plotComparison[x, "pendulum.sliderConstraint.s"]考えられる問題 (1)
SystemModelLinearize["DocumentationExamples.Modeling.ElectricCircuit.CircuitWithEvent", Method -> "SymbolicDerivative"]SystemModelLinearize["DocumentationExamples.Basic.StateOut", Method -> "SymbolicDerivative"]SystemModelLinearize["DocumentationExamples.Basic.InOutNoState", Method -> "SymbolicDerivative"]"NumericDerivative"を使って数値的に線形化する:
SystemModelLinearize["DocumentationExamples.Modeling.ElectricCircuit.CircuitWithEvent", Method -> "NumericDerivative"]関連するガイド
-
▪
- システムモデルの解析と設計 ▪
- システムモデリングの概要 ▪
- 基本的な系のモデル化 ▪
- 制御系
関連リンク
テキスト
Wolfram Research (2018), SystemModelLinearize, Wolfram言語関数, https://reference.wolfram.com/language/ref/SystemModelLinearize.html (2020年に更新).
CMS
Wolfram Language. 2018. "SystemModelLinearize." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2020. https://reference.wolfram.com/language/ref/SystemModelLinearize.html.
APA
Wolfram Language. (2018). SystemModelLinearize. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/SystemModelLinearize.html
BibTeX
@misc{reference.wolfram_2026_systemmodellinearize, author="Wolfram Research", title="{SystemModelLinearize}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/SystemModelLinearize.html}", note=[Accessed: 01-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_systemmodellinearize, organization={Wolfram Research}, title={SystemModelLinearize}, year={2020}, url={https://reference.wolfram.com/language/ref/SystemModelLinearize.html}, note=[Accessed: 01-September-2026]}