ノミナル値によるスケーリングを使用したパフォーマンスの改善
ノミナル値は、モデル内で予想される変数の大きさを指定する方法を提供します。これは、変圧器の定格の指定や電圧計の範囲の設定に似ています。この例では、モデル内で個々の変数のスケーリングを微調整してソルバーのパフォーマンスを改善し、シミュレーションのロバスト性を高めるための方法を説明します。
ソルバーが数値シミュレーションおよび数値解析を実行する際には、単位なしの変数が使用されます。ノミナル値は、単位をもつ工学変数を単位なしの変数に変換し、それらをソルバーの最適なパフォーマンス用にスケーリングするための方法です。ノミナル値の値には単位があり、この単位を使用して数値計算で単位を除去します。ノミナル値は次に、数値アルゴリズムから見た変数の大きさを決定します。一般に、大きさのスケールが近いと有利になります。
大きなバネ定数をもつ単純なマス-バネ-ダンパー モデルを考えてみましょう。
このモデルでは、バネ定数を除き、既定のブロック パラメーター設定が使用されています。
バネ定数、k = 1e6 N/m
減衰係数、b = 100 N/(m/s)
質量、m =1 kg
初期の質量速度変数 v の優先度は [High]
、初期ターゲット値は 0.1 m/s です。モデルでは、m
を長さの単位とする既定のノミナル値を使用します。
このモデルをシミュレートすると、バネの [変形] (位置) 変数 x は 10^-5 m の範囲の小さな値になります。
モデル ウィンドウの右下隅にあるハイパーリンクをクリックして、ソルバー プロファイラーを開きます。
ソルバーでは位置変数が完全に無視され、速度変数のみに注目します。位置の数値的大きさは、この変数の許容誤差を下回っています。
ソルバー プロファイラーのツールストリップからアクセスした状態ビューアーには、ソルバーから見た各変数の大きさが表示されます。
モデルの方程式を見ると、状況は明らかです。
m や b と比べて k が非常に大きい場合、x は、積 k*x が妥当なサイズとなるよう、方程式内の他の項と比べて小さくなります。この状況を是正するには、x をスケーリングする必要があります。言い換えると、スケーリングされた変数 xs がより妥当なサイズになるよう、x のノミナル値には小さな値を選択する必要があります。
ここで、c は大きな値です。たとえば、ノミナル値が 1 μm で、元の x の単位が m の場合、c は 1e6 です。方程式は次のようになります。
各項は、同じようなスケールの大きさになります。
このスケーリングの原則をモデル変数に適用してみましょう。最初に、プロパティ インスペクターを使用して、バネの [変形] 変数のノミナル値 x を 100 um
(1e-4 m) に変更します。
同様に、質量の [速度] 変数のノミナル値を 10 cm/s (0.1 m/s) に変更します。
これにより、ソルバーから見た両変数の大きさのスケールがおよそ 1 になります。
シミュレーションを再実行します。
これで、ソルバーの例外はシミュレーション開始時の 2 件だけになります。
質量の速度では、有効な絶対許容誤差が絞られていることに注意してください。Simscape™ モデルの有効な絶対許容誤差には単位があり、(ノミナル値 * 単位なしのグローバル AbsTol
) として計算されます。最初のシミュレーション実行において、有効な絶対許容誤差は 1e-3 m/s でしたが、現在は 1e-4 m/s となっています。これは、ノミナル値の大きさが変わり、グローバル AbsTol
は 1e-3
のままであるためです。しかし、質量の速度で AbsTol
が大きくなり、タイム ステップが大きくなっても、シミュレーションの速度はほぼ同じです。
ソルバーから見た値は、速度変数と位置変数の両方についてほぼ同じ大きさです。
次に、最初のシミュレーション実行中の速度変数の精度により厳密に合致するよう、グローバル AbsTol
を 1e-2
に変更します。
シミュレーションを再実行します。
タイム ステップは同様で、例外は 3 件あり、ここでもシミュレーションの開始時のものです。