bio_img_japan-community

MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

MATLAB MCP Server を使った Simulink モデルのリファクタリング

※この投稿は 2026 年 3 月 26 日に Guy on Simulink へ 投稿されたものの抄訳です。

AI エージェントを使い始めると、なかなかやめられなくなりますね!

今回の記事では、Sourcegraph が開発した AI コーディングエージェントで、Claude Code と似た存在である Amp を使って、私が Simulink ユーザーを支援する中で最も頻繁に行っている作業のひとつ:アクセラレータモードで参照モデルを使用することにより、モデルのコンポーネント化を改善する作業をやってみました。

課題

私が常に Simulink ユーザーに推奨しており、また Improving Simulation Performance in Simulink という記事でも紹介しているベストプラクティスのひとつが、アクセラレータモードで参照モデルを活用することです。参照モデルは事前にコンパイルできるため、シミュレーション間で変更がない場合には、初期化がほぼ瞬時に行われ、シミュレーションも高速に実行されます。

このワークフローを分かりやすく示すために、この例(Helicopter Modeling and Simulation – MATLAB & Simulink)から始めました。この例を MATLAB 上で開きたい場合は、次のコマンドを実行してください。

openExample(‘simulink_aerospace/HelicopterModelingAndSimulationExample’)
私が目にする多くのユーザーモデルと同様に、参照モデルへ変換するのに適した候補は制御ロジックです。この例では、Attitude and Altitude Control: サブシステムがそれに該当します。

作業の大部分を自動で行える Model Reference Conversion Advisor が Simulink には用意されていますが、変換後に何かしらが期待どおりに動作しない、というケースはよくあります。

この例にはそうした問題がいくつか含まれていることを知っていたため、AI エージェントを試すには良い題材だと考えました。

試した結果

まずは、Amp が MATLAB MCP Server との反復処理を通じて、このタスクをどのように達成したかを示す動画をご覧ください。

私が指示した内容は次のとおりです。

  • やることAttitudeAltitude Control サブシステムを参照モデルに変換する
  • 今回の目的:参照モデルをアクセラレータモードでシミュレーションすることでシミュレーション速度を向上させる
  • 要件:コントローラー内のバリアントを変更しても、アクセラレータターゲットの再ビルドが発生しないようにしたい

また、最終結果が元のモデルと一致していることを検証するため、まずはベースラインテストを作成し、それをもとに反復を進めるよう提案しました。

詳細

それでは、この動画の中で AI エージェントが実際に行ったことを詳しく見ていきましょう。

Skills

お気付きかもしれませんが、Amp は私が作成した 3 つのスキルを読み込んでいます。これらはいずれも非常に基本的なスキルで、モデル参照への変換を支援することを目的としたものではありません。以下に簡単な概要と、ダウンロード用のリンクを示します。
  • simulink-interaction: AI エージェントが Simulink 上で何が起きているかを把握できるようにするためのスキルです。たとえば、「this block」は gcb、「this model」は bdroot、「this subsystem」は gcs を意味します。このスキルがあると、より自然な形でエージェントと「会話」できると感じています。
  • simulink-simulation: 古い set_paramsim(‘modelname’) の組み合わせではなく、 Simulink.SimulationInput オブジェクトの構文を使うようエージェントを誘導するためのスキルです。必須ではありませんが、私はこの書き方のほうがコードとして好みです。
  • simulink-baseline-test: これも必須ではなく、AI エージェントはテストを自力で書くことができます。私好みの setup や teardown を含めるなど、細かな点のために使用しています。
さらに追加のスキルがあれば、AI エージェントの作業はさらに容易になり、必要なトークン数も減り、より早く収束したかもしれません。しかし、今回の実験で観察したかったのは、追加のスキルなしでどこまでうまくできるかという点でした。

ベースラインテスト

AI エージェントであれ人間であれ、変更を加える前にシステムの挙動を捉えたベースラインテストを用意しておくことは重要です。このケースでは、エージェントはモデルを解析し、変数 state がバリアント条件を制御していることを特定できました。以下は、state を使用しているブロックの一例です。

テストでは、バリアント構成ごとに 1 つのベースラインを取得できるよう、テストパラメーターとして設定しました。

classdef HelicopterBaselineTest < sltest.TestCase
    properties (Constant)
        ModelName = ‘HelicopterModelingSimulation’
        RefModelName = ‘AttitudeAltitudeControl’
        RelTol = 1e-6
        AbsTol = 1e-8
    end
    properties (TestParameter)
        variant = {‘hover’, ‘level’, ‘path’}
    end
    methods (Test)
        function testVariantMatchesBaseline(testCase, variant)
            baselineFile = fullfile(fileparts(mfilename(‘fullpath’)),
                sprintf(‘baseline_%s.mat’, variant));
            testCase.assertTrue(isfile(baselineFile),
                sprintf(‘Baseline not found: %s’, baselineFile));
            in = Simulink.SimulationInput(testCase.ModelName);
            in = in.setVariable(‘state’, FlightMode.(variant));
            out = sim(in);
            S = load(baselineFile, ‘baselineLogsout’);
            testCase.verifySignalsMatch(out.logsout, S.baselineLogsout,
                ‘RelTol’, testCase.RelTol,
                ‘AbsTol’, testCase.AbsTol);
        end

モデル参照への変換

これは、1 行のコードで実現できます。

blk = ‘HelicopterModelingSimulation/Attitude and Altitude Control’;
mdlName = ‘AttitudeAltitudeControl’;
Simulink.SubSystem.convertToModelReference(blk,mdlName,
    “AutoFix”,true,
    “ReplaceSubsystem”,true,
    “SimulationModes”,“Accelerator”,
    “BuildTarget”,“Sim”);

ひとつ問題がありました。元のサブシステムの境界でログ取得されていた信号が、変換の過程で失われてしまったのです。エージェントはこれを素早く修正し、正しい信号に対してログ取得を再度有効化しました。

 

再ビルドなしでアクティブなバリアントを変更する

元のモデルでは、バリアントサブシステムは: Variant Activation Time = Update Diagram に設定されていました。
この構成では、アクティブなバリアントが変更されるたびに、参照モデルを再ビルドする必要があります。再ビルドには時間がかかるため、これは避けたいところです。これを回避するために、Variant Activation Time = Startup に変更します。

Startup のアクティベーション時間には制約があり、それについては次のドキュメントで詳しく説明されています。Considerations and Limitations for startup Variant Activation Time – MATLAB & Simulink.

エージェントは次の問題に直面しました。

  • Startup を使用する場合、各バリアントで選択されるサブシステムはアトミックでなければならない
  • Startup では、バリアント制御式に文字列を使用することができない

バリアントで選択されるサブシステムをアトミックにすることは簡単でした。2 つ目の制約に対処するため、エージェントは文字列の代わりに 列挙型 を作成することを決定しました。これは、私がユーザーに対して推奨するのとまったく同じ対応です。以下に、左側が元の状態、右側が修正後の状態を示します。

再ビルド不要という要件

Simulink には、参照モデルが再ビルドされているかどうかを プログラム的に判定するための分かりやすい方法は用意されていません。エージェントはいくつかの手法を試しました。
  • MATLAB のベースワークスペースの diary を記録し、ビルドサマリーを解析する
  • Simulink.BlockDiagram.getChecksum の出力を比較する
  • 参照モデルの mex ファイルに対して dir を実行し、その戻り値の datenum フィールドを比較する

最終的に最後の方法に落ち着きました。私としてもこの方法で問題なく、十分に信頼できるものだと思います。

        function testNoRebuildOnVariantChange(testCase)
            variants = {FlightMode.hover, FlightMode.level, FlightMode.path};
            % First simulation — cold build may occur
            in = Simulink.SimulationInput(testCase.ModelName);
            in = in.setVariable(‘state’, variants{1});
            in = in.setModelParameter(‘StopTime’, ‘0’);
            sim(in);
            % Record the MEX file timestamp after first build
            mexFile = which([testCase.RefModelName ‘_msf’]);
            testCase.assertNotEmpty(mexFile,
                ‘Accelerator MEX target not found after first simulation.’);
            d = dir(mexFile);
            timestampAfterBuild = d.datenum;
            % Simulate with remaining variants and verify no rebuild
            for v = 2:numel(variants)
                in = Simulink.SimulationInput(testCase.ModelName);
                in = in.setVariable(‘state’, variants{v});
                in = in.setModelParameter(‘StopTime’, ‘0’);
                sim(in);
                d = dir(mexFile);
                testCase.verifyEqual(d.datenum, timestampAfterBuild,
                    sprintf(‘Accelerator target was rebuilt when switching to variant %d.’, v));
            end
        end
動画を注意深く見ていると分かると思いますが、テストをより短時間で完了させるために、シミュレーション全体を実行する代わりに、停止時間をゼロにしてシミュレーションするという小さな修正を私が依頼しました。エージェントはそれを即座に適用しました。

まとめ

全体として、このプロセスにはとても満足しています。明確に定義されたスキルがあれば、エージェントはもっと短時間で、より少ないトークン数で作業できたかもしれませんが、それでもタスクは成功しました。そして、同じ作業を私自身が手作業で行うよりも速く完了しました。

次はあなたの番です

私が AI コーディングエージェントと Simulink に関する実験を共有しているのは、このブログの読者の多くが新しい技術をいち早く取り入れるタイプであり、Simulink がこの新しい世界にどのように適合するのかを早く知りたいと考えていると分かっているからです。もし興味と意欲があれば、本記事や前回の記事で紹介したことは、少しの「自作セットアップ」によって、今日すぐにでも実現可能です。

一方で、もう少し待ちたいという方のために言うと、多くの同僚がエージェント型ツールや機能の開発に積極的に取り組んでおり、Simulink のエコシステムに完全に統合された形で、近いうちに提供される予定です。

|
  • print

댓글

댓글을 남기려면 링크 를 클릭하여 MathWorks 계정에 로그인하거나 계정을 새로 만드십시오.