bio_img_japan-community

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

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

ホワイトボードのスケッチからパレートフロントまで: Agentic AI Playground の Symbolic Math Skills

※この投稿は 2026 年 6 月 25 日に The MATLAB Blog へ 投稿されたものの抄訳です。

Bio: 本日のゲストブロガーは Jack Erickson さんです。Jack は MathWorks で Symbolic Math Toolbox と Quantum Computing のプロダクトマネージャーを務めています。以前は Intel で AI 向けソフトウェア開発者マーケティングに携わっていました。
エンジニアは図で意思疎通します。ホワイトボードのスケッチから教科書の回路図、ノートの制御ループなどさまざまです。もし図を解析や MATLAB での探索に変換でき、新しいプロジェクトを第一原理から始められるとしたらどうでしょうか。
最近公開された MATLAB Agentic Toolkit は、MATLAB の力を AI エージェントやコーディングアシスタントと組み合わせます。これらのツールを支える基盤モデルの多くは、画像を理解するために視覚概念を言語トークンと一緒に処理できる、マルチモーダルな視覚言語機能も備えています。多くのエンジニアや科学者は図、スケッチ、論文、教科書から方程式を手でコード化してプロジェクトを始めるため、私たちは Symbolic Math Toolbox の機能を活用する出発点としてそれらを使いやすくするために GenAI を活用しました。
私たちは MATLAB と Simulink の作業向け Agent Skill を試作し実演するための実験的リポジトリである Agent Skills Playground で、Symbolic Math Toolbox skill v1.0 を公開しました。リポジトリの README で単一スキルからのインストール方法が説明しています。
matlab-symbolic-math スキルは、記号変数や方程式の定義、代入、操作に関する基本的な方法を扱います。これには、伝達関数の導出、状態空間方程式への変換、可変精度演算 (VPA) の利用、工学ワークフローでの数値解析向け MATLAB 関数生成など、特定のワークフローやタスクのための階層化スキルが含まれます。これらのスキルを自然言語プロンプトと組み合わせれば、Symbolic Math Toolbox のベストプラクティスに沿った始め方を学ぶこともできます。

AI エージェントによる Symbolic コード生成

今回の題材として、私はホワイトボードに簡単な PI 制御ループを書きました。
私の手書きが読みにくかったらすみません。私自身もしばしば読みにくいのですが、ほとんどの視覚言語モデルなら読み取れます。ともあれ、各ブロックが表しているのは次のとおりです。
  • PI 制御器: C(s) = Kp + Ki/s
  • DC モータプラント: G(s) = Km / (Js + B)
  • エンコーダフィードバック: H(s) = Ke
そしてこれが、MATLAB Agentic Toolkit とともに ~/.agents/skills ディレクトリへ Symbolic Math Toolbox スキルをインストールした状態で OpenAI Codex に与えたプロンプトです。
これは、既知の固定パラメータ値を代入し調整可能なパラメータのパレートフロントを探索する、単なる式操作を超える典型的なワークフローです。記号方程式はライブスクリプトで見やすく表示されるため、私はプレーンテキストのライブスクリプト形式 (.m) を生成するよう依頼しました。MATLAB Agentic Toolkit にはこのためのスキルが含まれています。というのも、このファイル形式は R2025a で最近導入されたばかりで、AI モデルによってはまだ正しく生成するよう学習されていない可能性があるからです。Codex の最後のメッセージを見ると、MATLAB live script と symbolic math のスキルが使われたことが分かります。

結果

生成 AI は非決定的であるため、得られるスクリプトは変わり得ます。それでも、プロンプトと画像入力に十分な情報を与えれば、用意されたスキルが AI モデルを適切なコード生成へ導いてくれるはずです。MATLAB Agentic Toolkit は生成 AI のプロセスを MATLAB に接続して生成コードをテストし、エラーなく実行できることを確認します。
私が試した実行では、この図を PI 制御器、モータプラント、負フィードバックゲインとして解釈し、伝達関数を構築するスクリプトが生成されました。
syms s
syms Kp Ki Km J B Ke positive
Gc = Kp + Ki/s;
Gp = Km/(J*s + B);
T = collect(simplify((Gc*Gp)/(1 + Ke*Gc*Gp)),s)
T =

簡潔さのため生成コード全体は載せませんが、このスクリプトは次に伝達関数を標準的な 2 次系の形式へ正規化し、σ (減衰係数)、ω_n (固有角周波数)、α といった主要なシステムパラメータを抽出しました。さらに、これらの解析的な構成要素を使って立ち上がり時間とオーバーシュート率の厳密な記号方程式を導出しました。最後に物理的なモータ定数を代入し、独立変数を K_p と K_i のみにした閉形式の方程式を得ました。
ここで、閉形式の解析が価値を発揮します。これらの symbolic 方程式は、MATLAB、Simulink、Simscape で使う数値コードとして展開できます。この例では、K_p と K_i のゲインパラメータの最適な組み合わせを特定したいので、matlabFunction を使って symbolic 式を数値 MATLAB 関数へ変換しつつ、K_p と K_i を変数のまま残し、その値を走査して最適な組み合わせを探します。
このコードを生成している間、Codex は Symbolic Math Toolbox スキルの 1 つを使用していることを示していました。

matlabFunction-patterns.md スキルは、自由変数を正しく指定して MATLAB 関数を生成する適切な方法を提供します。このケースでは、Codex は matlabFunction を呼び出す際にそのスキルの Troubleshooting セクションを使いました。
生成されたコードは、K_p と K_i を自由変数として持つ MATLAB 関数ハンドルを正しく生成しています。
riseTimeFcn = matlabFunction(riseTimeExpr,‘Vars’,{Kp,Ki});
percentOvershootFcn = matlabFunction(percentOvershootExpr,‘Vars’,{Kp,Ki});
zetaFcn = matlabFunction(zetaVal,‘Vars’,{Kp,Ki});
得られた関数は Optimization Toolbox の fmincon のような非線形ソルバでも使えます。しかし今回は単純な問題なので、Codex はこれらの関数を使ってパラメータ値を掃引し、パレートフロントを生成しました。次のコードは、対数グリッドを生成し、減衰不足かつ有限なゲインの組だけを残した方法を示しています。
KpVals = linspace(0,1000,251);
KiVals = logspace(3.5,6,251);
[KpGrid,KiGrid] = meshgrid(KpVals,KiVals);
zetaGrid = zetaFcn(KpGrid,KiGrid);
validGrid = isfinite(zetaGrid) & zetaGrid > 0 & zetaGrid < 1;
riseTimeGrid = nan(size(KpGrid));
percentOvershootGrid = nan(size(KpGrid));
riseTimeGrid(validGrid) = real(riseTimeFcn(KpGrid(validGrid),KiGrid(validGrid)));
percentOvershootGrid(validGrid) = max(0,real(percentOvershootFcn(KpGrid(validGrid),KiGrid(validGrid))));
ここでもコードの詳細は省きますが、これは立ち上がり時間を悪化させずにオーバーシュートを改善できない非支配点だけを抽出し、最も速い立ち上がり時間から遅い順へ並べています。
head(paretoTable)
Kp Ki RiseTime_s Overshoot_percent
____ __________ __________ _________________1000 1e+06 0.015787 73.293
1000 9.7724e+05 0.015972 73.032
1000 9.5499e+05 0.016159 72.768
1000 9.3325e+05 0.016348 72.502
1000 9.1201e+05 0.016539 72.235
1000 8.9125e+05 0.016733 71.965
1000 8.7096e+05 0.016929 71.693
1000 8.5114e+05 0.017127 71.419

可視化

私は Codex にパレートフロントを可視化するよう依頼しました。
scatter(riseTimeVec,percentOvershootVec,12,[0.65 0.65 0.65],“filled”,“MarkerFaceAlpha”,0.25)
hold on
plot(paretoTable.RiseTime_s,paretoTable.Overshoot_percent,“r.-“,“LineWidth”,1.5,“MarkerSize”,10)
hold off
grid on
xlabel(“Rise time (s)”)
ylabel(“Percent overshoot (%)”)
title(“Pareto front for PI gains”)
legend(“Sweep samples”,“Pareto front”,“Location”,“northeast”)
xlim([0.00 1.056])
ylim([0.00 1.35])
個々のサンプルをいくつか見やすくするために、私は xlim/ylim コマンドを手動で追加して拡大表示しました。赤い点がパレートフロントです。ここでは立ち上がり時間とオーバーシュートの両方を最小化できる選択肢の集合が得られています。

次のステップ: 理想化された方程式から現実的な物理モデルへ

記号的な掃引によって、大きなゲイン探索空間は小さなパレート集合へ絞り込まれます。グリッドを有効な減衰不足な候補に絞り込むと、パレート最適なゲイン対は約 20 組しか残りません。その後は、電流制限、スティクション、PWM 量子化、センサノイズ、熱挙動といった効果を含む、より高忠実度の Simscape モデルでそれらの候補を評価できます。
Simulink と Simscape を使えるなら、ぜひ試してみてください。これらの候補を Simscape モデルに差し込み、並列にプログラム実行してシミュレーションするコードを生成するよう、AI エージェントに促してみましょう。
要するに、閉形式の解析式を使ったこの高速な絞り込みステップによって、詳細な非線形モデルに対する手作業の試行錯誤チューニングや総当たりの掃引に頼らずに済みます。

より現実的な問題に取り組む前に

これは説明のための単純な例でした。実際には、私はこのアプローチをさまざまな応用で使ってきて、その過程でいくつかのことを学びました。
  • できるだけ多くの問題設定とタスク情報を提供してください。これはテキスト入力と視覚入力のどのような組み合わせでも構いません。モデルが視覚入力から抽出した情報は必ず確認すべきですが、最近の視覚言語機能の進歩には感心しています。
  • 何を生成したいのかを明確に指定してください。どんなプログラミング手法と同じく、AI は心を読めません。GenAI は指定が曖昧な箇所をもっともらしいが役に立たない出力で埋めてしまい、時間の無駄になることがあります。
  • 補助となるスキルを提供してください。特に Symbolic Math Toolbox とライブスクリプト生成のスキルは出力品質を大きく改善します。こうしたスキルが AI モデルの学習データに取り込まれるまでは、閉形式の解析を伴うワークフローのような専門タスクを補完する役割を果たします。ギャップを見つけたら、再利用可能な新しいスキルを生成するよう GenAI ツールに促してみてください。
このワークフローは、あなたのプロジェクトを Symbolic Math Toolbox に持ち込み、そこで数理的基盤を効率よく導出、操作、探索する助けになります。この Toolbox に慣れていない場合は、自習形式のトレーニングコースが習熟の良い出発点になります。
Agent Skills Playground にある Symbolic Math Toolbox スキルは実験的なものです。皆さんの経験やフィードバックに基づいて改善したいと考えているので、ぜひ下のコメント欄かリポジトリの issue で知らせてください。

|
  • print

コメント

コメントを残すには、ここ をクリックして MathWorks アカウントにサインインするか新しい MathWorks アカウントを作成します。