Main Content

ステップ サイズと反復回数の選択

モデルのソルバーに指定するステップ サイズと反復回数は、リアルタイム シミュレーションの速度と精度に影響します。ステップ サイズを小さくするか、反復回数を増やすと、より精度の高い結果が得られますが、シミュレーションの実行速度は下がります。ステップ サイズを大きくするか、反復回数を減らすと、シミュレーションの実行速度は上がりますが、結果の精度は低くなります。

モデルをリアルタイム ターゲット マシンでのシミュレーション用に最適化するには、許容可能な精度とオーバーランを発生させない速度を実現する、ステップ サイズ (Ts) と反復回数 (N) の組み合わせを指定します。ソルバー タイプの場合と同様に、Simulink® グローバル ソルバーと、モデル内の独立した Simscape™ ネットワークそれぞれに、異なる Ts 値と N 値の組み合わせを指定できます。

次のワークフローは、リアルタイム シミュレーションのステップ サイズと反復回数の選択に役立ちます。

  • 油圧アクチュエータのモデルで可変ステップ シミュレーションを実行して、参照結果を得ます。

  • このモデルを修正したものを使用して、固定ステップ、固定コスト シミュレーションで十分に精度の高い結果を得るために使用可能な最大ステップ サイズを判定します。リアルタイム シミュレーションには、固定ステップ、固定コスト シミュレーションが必要です。

  • 修正モデルを使用して、グローバルとローカルの固定ステップ、固定コスト ソルバー設定を指定します。

  • 修正モデルで、時間測定付きシミュレーションを実行し、結果の精度を評価します。

  • ステップ サイズと反復回数を調整して、リアルタイム シミュレーションに必要な速度と精度を実現するソルバー設定を見つけます。

参照結果の取得

参照結果を取得するには、油圧アクチュエータ モデルの元のバージョンをシミュレートします。

  1. 油圧アクチュエータ モデルを開くには、MATLAB® コマンド プロンプトで次を入力します。

    model = 'ssc_hydraulic_actuator_digital_control';
    open_system(model)

  2. モデルは、データ点を制限するように構成されています。すべてのデータ点をログに記録するようにモデルを設定するには、モデルの [コンフィギュレーション パラメーター] を開き、[Simscape] ペインの [データ点を制限] チェック ボックスをオフにします。

  3. モデルのシミュレーションを実行します。

    sim(model)
    

  4. ログに記録した Simscape ノードから、圧力とシミュレーション ステップ時間のデータを抽出します。

    simlogRef = simlog_ssc_hydraulic_actuator_digital_control;
    pRefNode = simlogRef.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
    pRef = pRefNode.series.values('Pa');
    tRef = pRefNode.series.time;
  5. ステップ サイズをプロットします。

    h1 = figure;
    semilogy(tRef(1:end-1),diff(tRef),'-x')
    title('Solver Step Size')
    xlabel('Time (s)')
    ylabel('Step Size (s)')

    元のモデルで正確なリアルタイムの結果を得るための最大ステップ サイズ (Tsmax) は約 1e-2 秒です。Tsmax の決定についての詳細は、ステップ サイズの決定を参照してください。

  6. シミュレーション結果をプロットします。

    h2 = figure;
    plot(tRef,pRef, 'b-')
    h2Legend1 = legend({'Reference'},'Location','southoutside');
    title('Cylinder Pressure')
    xlabel('Time (s)')
    ylabel('Pressure (Pa)')

精度の高い結果を得るための最大ステップ サイズの決定

油圧アクチュエータ モデルの修正バージョンでは、Tsmax の値を変更できます。これは、精度の高いリアルタイム シミュレーション結果を得るための最大ステップ サイズです。

  1. 修正した油圧アクチュエータ モデルを開きます。

    ssc_hydraulic_actuator_HIL

    このバージョンの油圧アクチュエータには、離散化され、分割されたコントローラーがあります。Hydraulic Actuator サブシステムのローカル ソルバーでは、固定ステップ、固定コスト シミュレーションが有効になっています。ステップ サイズはパラメーター化されているため (ts)、ソルバーを調整して、オーバーラン発生の可能性を下げることができます。油圧アクチュエータのコントローラーを離散化する方法を示す例は、HIL テスト用に構成された油圧アクチュエータを参照してください。

  2. 精度の高いリアルタイム シミュレーション結果を得るために使用する最大ステップ サイズを決定するには、グローバル可変ステップ ソルバーでシミュレートします。グローバル ソルバーを使用した可変ステップ シミュレーション用に修正モデルを構成するには、ローカル ソルバーの構成を無効にします。Hydraulic Actuator サブシステムの Solver Configuration ブロックのプロパティ インスペクターで、[ローカル ソルバーを使用] チェック ボックスをオフにします。

  3. モデルのシミュレーションを実行します。

  4. ログに記録した Simscape ノードから、圧力と時間のデータを抽出します。

    simlog0 = simlog_ssc_hydraulic_actuator_HIL;
    pNodeSim0 = simlog0.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
    pSim0 = pNodeSim0.series.values('Pa');
    tSim0 = pNodeSim0.series.time;

  5. ステップ サイズを、元のモデルのステップ サイズ データを含む Figure にプロットします。

    figure(h1)
    hold on
    semilogy(tSim0(1:end-1),diff(tSim0),'--x', 'Color','r',...
        'LineWidth',.1,'MarkerSize',5)
    title('Solver Step Size')
    xlabel('Time (s)')
    ylabel('Step Size (s)')
    h1Legend1 = legend({'Reference','Modified'},...
        'Location','southoutside');

離散化モデルでは、Tsmax は 1e-2 ~ 1e-3 秒の間です。

グローバル ソルバー設定とローカル ソルバー設定のパラメーター化

最適なリアルタイム シミュレーション ソルバー設定を見つけるためにステップ数を削減するには、ワークスペース変数を使用してソルバー構成をパラメーター化します。Hydraulic Actuator Discrete Model では、ローカル ソルバー構成用のステップ サイズは、ワークスペース変数 ts として指定されます。この例では、ワークスペース変数を使用して、グローバル ステップ サイズ (tsG) と、ローカル非線形反復回数 (N) もパラメーター化します。

  1. 修正モデルのモデル コンフィギュレーション パラメーターのプロパティ インスペクターで、次の設定を指定します。

    ペインパラメーター目的

    ソルバー

    タイプFixed-step固定ステップ シミュレーションの修正モデルのグローバル ソルバーを構成します。
    ソルバーdiscrete (no continuous states)グローバル ソルバーを構成して、コントローラーの状態に一致させます。
    [追加オプション][固定ステップ サイズ (基本サンプル時間)]tsGグローバル ステップ サイズをパラメーター化します。

    Simscape

    データ点を制限チェック ボックスをオフにします。ソルバーのステップ サイズを小さくすると、シミュレーションによって生成されるデータ点の数が増加します。このオプションをオフにして、シミュレーションの精度を評価するために必要なすべてのデータを確実に収集します。

  2. ローカル ソルバーを固定ステップ シミュレーション用に構成します。Hydraulic Actuator サブシステムの Solver Configuration ブロックのプロパティ インスペクターで、[ローカル ソルバーを使用] をオンにします。

  3. シミュレーションのコストをパラメーター化するには、[Nonlinear iterations]N に設定します。

固定ステップ、固定コスト シミュレーションの実行

モデルをシミュレートしてから、結果の精度とシミュレーションの速度を評価することで、ソルバー設定がリアルタイム シミュレーションに適切かどうかを判断できます。精度を評価するには、結果を参照結果および他の固定ステップ、固定コスト シミュレーションの結果と比較します。シミュレーション速度を評価するには、経過時間を、指定したシミュレーション時間、およびシミュレーションの実行予定時間と比較します。速度または精度が許容できない場合、ステップ サイズと反復回数を調整し、モデルをリアルタイム対応にします。

この例のシミュレーション実行予定時間は 4 秒です。モデルの実行予定時間を決定する方法の詳細は、計算コストの推定を参照してください。

  1. 1 番目のシミュレーションでは、グローバルとローカルのステップ サイズの両方を、ステップ プロットの Tsmax に設定可能な最大の値に指定します。両方のソルバーのステップ サイズに比較的大きな値を指定し、ローカル ソルバーの非線形反復回数に 3 を指定します。

    ts = 1e-2;
    tsG = 1e-2;
    N = 3;

  2. 時間測定付きの固定ステップ、固定コスト シミュレーションを実行します。

    tic; sim('ssc_hydraulic_actuator_HIL'); tSim1 = toc;
    time1 = max(tSim1);

  3. ログに記録した Simscape ノードから、圧力とシミュレーション時間のデータを抽出します。

    simlog1 = simlog_ssc_hydraulic_actuator_HIL;
    pNodeSim1 = simlog1.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
    pSim1 = pNodeSim1.series.values('Pa');
    tSim1 = pNodeSim1.series.time;

  4. シミュレーション結果を、参照結果が含まれる Figure にプロットします。経過時間を図の凡例に書き込みます。

    figure(h2)
    hold on
    plot(tSim1, pSim1, 'g--')
    delete(h2Legend1)
    configSim1L = ['Local: Ts= ',num2str(ts),'s, N= ',num2str(N),'.'];
    configSim1G = [' Global: Ts= ',num2str(tsG),'s.'];
    timeSim1T = ['Time=',num2str(time1)]; 
    cfgSim1 = [configSim1L,configSim1G,timeSim1T];
    h2Legend2 = legend({'Reference',num2str(cfgSim1)},...
        'Location','southoutside');

    経過時間は場合によって異なります。これは、シミュレーションを実行するコンピューターにおけるその時点の計算能力に依存するためです。この凡例の経過時間は、16 GB のメモリと共に 3.6 GHz の Intel® CPU を使ったシミュレーションのものです。実際の凡例には、ご使用のコンピューターでのシミュレーションの経過時間が記載されます。

    このシミュレーションを完了するのにかかった時間は、指定したシミュレーション時間 (10 秒) より短いため、シミュレーションは開発コンピューターのリアルタイム シミュレーションよりも速く実行されています。また、経過時間は、この例でのシミュレーション実行予定時間 (4 秒) よりも短くなっています。したがって、指定したソルバー構成は、実行予定時間データの提示されたターゲット マシンでのリアルタイム シミュレーションに対し、許容可能な安全余裕を提供しています。

  5. 変曲点にズームして、結果の精度を評価します。

    figure(h2)
    xStart = 0;
    xEnd = 10;
    yStart = 0;
    yEnd = 3.5e6;
    xZoomStart = 0.3;
    xZoomEnd = 0.6;
    yZoomStart = 2.6e6;
    yZoomEnd = 3.5e6;
    axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])

    理論データと実測データが、参照結果を裏付けています。ソルバーが参照データの解に収束する前に振動しているため、このシミュレーション結果の精度は許容できません。

許容できる結果の精度を得られたとしても、シミュレーションが指定の実行予定時間に対して遅すぎる場合は、ステップ サイズを大きくするか、反復回数を減らして、速度を上げます。

十分に精度の高い結果と、実行予定時間内に収まるシミュレーション速度を実現するソルバー設定の組み合わせが見つかったら、ハードウェアインザループ シミュレーション ワークフローを実行して、リアルタイム ターゲット マシン上でのモデルの実行を試みることができます。ソルバー設定の適切な組み合わせが見つからない場合、リアルタイム モデルの準備のワークフローを実行するか、リアルタイム計算能力を上げて、シミュレーションの速度と精度を改善します。リアルタイム計算能力を上げるには、ターゲット ハードウェアをアップグレードするか、モデルを並列処理用に分割します。

ソルバー設定の調整による精度の向上

一般に、反復回数を増やすか、ステップ サイズを小さくすると、精度を向上できます。

  1. 反復回数 (N) を 10 に増やして、精度の向上を試みます。

    N = 10;

  2. 時間測定付きシミュレーションを実行します。

    tic; sim('ssc_hydraulic_actuator_HIL'); tSim2 = toc;
    time2 = max(tSim2);
    
  3. 圧力とシミュレーション時間のデータを抽出します。

    simlog2 = simlog_ssc_hydraulic_actuator_HIL;
    pNodeSim2 = simlog2.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
    pSim2 = pNodeSim2.series.values('Pa');
    tSim2 = pNodeSim2.series.time;

  4. 結果をプロットします。

    figure(h2)
    hold on
    plot(tSim2, pSim2, 'r:')
    delete(h2Legend2)
    axis([xStart xEnd yStart yEnd])
    configSim2L = ['Local: Ts= ',num2str(ts),'s, N= ',num2str(N),'.'];
    configSim2G = [' Global: Ts= ',num2str(tsG),'s.'];
    timeSim2T = ['Time=',num2str(time2)]; 
    cfgSim2 = [configSim2L,configSim2G,timeSim2T];
    h2Legend3 = legend({'Reference',num2str(cfgSim1),num2str(cfgSim2)},...
        'Location','southoutside');

    シミュレーションの実行にかかった時間が、シミュレーション実行予定時間の 4 秒より短いため、このシミュレーションはリアルタイム シミュレーションに十分な速度を備えています。

  5. ズームして精度を評価します。

    figure(h2)
    axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])

    総合的に見て、反復回数の少ないシミュレーションに比べて、結果の精度はそれほど高くありません。

  6. ローカル ソルバーとグローバル ソルバーのステップ サイズを 1e-3 秒に減らして、精度の向上を試みます。反復回数 (N) に 3 を指定します。

    ts = 1e-3;
    tsG = 1e-3;
    N = 3;
    
  7. 時間測定付きシミュレーションを実行します。

    tic; sim('ssc_hydraulic_actuator_HIL'); tSim3 = toc;
    time3 = max(tSim3);
    
  8. 圧力とシミュレーション時間のデータを抽出します。

    simlog3 = simlog_ssc_hydraulic_actuator_HIL;
    pNodeSim3 = simlog3.Hydraulic_Actuator.Hydraulic_Cylinder.Chamber_A.A.p;
    pSim3 = pNodeSim3.series.values('Pa');
    tSim3 = pNodeSim3.series.time;

  9. 結果をプロットします。

    figure(h2)
    hold on
    plot(tSim3, pSim3, 'k--')
    delete(h2Legend3)
    axis([xStart xEnd yStart yEnd])
    configSim3L = ['Local: Ts= ',num2str(ts),'s, N= ',num2str(N),'.'];
    configSim3G = [' Global: Ts= ',num2str(tsG),'s.'];
    timeSim3T = ['Time=',num2str(time3)]; 
    cfgSim3 = [configSim3L,configSim3G,timeSim3T];
    h2Legend4 = legend...
    	({'Reference',num2str(cfgSim1),num2str(cfgSim2),num2str(cfgSim3)},...
        'Location','southoutside');

    シミュレーションにかかる時間は長くなりますが、シミュレーション実行予定時間の 4 秒と比較すると十分に高速です。

  10. ズームしてより正確に精度を評価します。

    figure(h2)
    axis([xZoomStart xZoomEnd yZoomStart yZoomEnd])

結果の精度は許容可能です。修正モデルを使用したリアルタイム シミュレーションでは、許容可能な速度と精度を実現した次のソルバー設定を使用します。

  • 非線形反復回数 3 回

  • グローバルおよびローカル ステップ サイズ 1e-3 秒

十分に精度の高い結果を達成できたとしても、シミュレーションの実行時間が実行予定時間に対して遅すぎる場合、ステップ サイズを大きくするか、反復回数を減らして、速度を改善します。

十分に精度の高い結果と、実行予定時間より高速なシミュレーション速度を実現するソルバー設定の組み合わせが見つかったら、モデルをリアルタイム ターゲット マシン上で実行できます。モデルをリアルタイム ターゲット マシン上で実行するには、ハードウェアインザループ シミュレーション ワークフローを実行します。

リアルタイム シミュレーションに使用する適切なソルバー設定の組み合わせが見つからない場合、モデルのスコープまたは忠実度を修正して、シミュレーションの速度と精度を改善します。詳細は、リアルタイム モデルの準備のワークフローを参照してください。

モデルのスコープまたは忠実度を変更しても、モデルをリアルタイム対応にできない場合、リアルタイム計算能力を向上させます。詳細は、ターゲット ハードウェアのアップグレードシステムの各部分の並列シミュレーションを参照してください。

参考

|

関連する例

詳細