Main Content

Javaからの金宝appシミュレーションの実行

シミュレーションを実行するMATLABコマンド

Java®用の MATLAB®エンジン API を使用して Simulink®シミュレーションを実行することができます。プログラムによりシミュレーションを実行するための基本的な手順は以下のとおりです。

  • MATLAB エンジン オブジェクトを作成して MATLAB セッションを開始します。

  • MATLAB に Simulink モデルを読み込みます (load_system(Simulink))。

  • 特定のシミュレーション パラメーターを設定してシミュレーションを実行します (sim(Simulink))。

  • 返されたSimulink.SimulationOuput(Simulink)オブジェクトのメソッドを使用して、シミュレーションの結果にアクセスします。

MATLAB からプログラムによりシミュレーションを実行する方法の詳細については、個々のシミュレーションの実行(Simulink)を参照してください。

Javaからの vdp モデルの実行

Simulink のvdpブロック線図は、ファン デル ポールの方程式をシミュレートします。これは 2 階微分方程式です。このモデルは、モデルによって定義された初期条件と構成パラメーターを使用して方程式を解きます。

シミュレーションを実行するためのMATLABコード

次の MATLAB コードは、シミュレーションをプログラムによって実行するためのコマンドを示しています。Simulink.SimulationOuputオブジェクトのgetメソッドは、結果と時間ベクトルを返します。

mdl ='vdp'; load_system(mdl); simOut = sim(mdl,'SaveOutput','on',...'OutputSaveName','yOut',...'SaveTime','on',...'TimeSaveName','tOut'); y = simOut.get('yOut'); t = simOut.get('tOut');

データのグラフ化

次の MATLAB コードはシミュレーション出力のグラフを作成し、そのグラフを JPEG イメージ ファイルにエクスポートします。

plot(t,y) print('vdpPlot','-djpeg')

シミュレーションを実行するためのJavaコード

次の Java コードは Simulinkvdpモデルのシミュレーションを実行し、結果を Java に返します。この実装により、以下の処理が実行されます。

  • MATLAB エンジン オブジェクトを作成して MATLAB セッションを開始します。

  • MATLABload_systemコマンドを呼び出して Simulink を起動し、vdpモデルを非同期的に読み込みます。Futureが返されるまでタスクをポーリングします。

  • MATLABsimコマンドを呼び出してシミュレーション パラメーターを設定し、シミュレーションを実行します。Futureが返されるまでタスクをポーリングします。

  • シミュレーションの結果を取得します。関数simの出力は MATLABSimulink.SimulationOuput(Simulink)オブジェクトであり、これは MATLAB ベース ワークスペースで作成されます。

    エンジン API はこのタイプのオブジェクトをサポートしていません。そのため、この例ではオブジェクトのgetメソッドを使用して MATLAB ワークスペースのシミュレーション データにアクセスしています。

  • シミュレーション データのグラフィックスを作成して、このグラフを JPEG ファイルにエクスポートします。

  • シミュレーション結果と時間ベクトルをdouble配列として Java に返します。

import com.mathworks.engine.*; import java.util.concurrent.Future; import java.util.Arrays; public class RunSimulation { public static void main(String[] args) throws Exception { MatlabEngine eng = MatlabEngine.startMatlab(); Future fLoad = eng.evalAsync("load_system('vdp')"); while (!fLoad.isDone()){ System.out.println("Loading Simulink model..."); Thread.sleep(10000); } Future fSim = eng.evalAsync("simOut = sim('vdp','SaveOutput'," + "'on','OutputSaveName','yOut'," + "'SaveTime','on','TimeSaveName','tOut');"); while (!fSim.isDone()) { System.out.println("Running Simulation..."); Thread.sleep(10000); } // Get simulation data eng.eval("y = simOut.get('yOut');"); eng.eval("t = simOut.get('tOut');"); // Graph results and create image file eng.eval("plot(t,y)"); eng.eval("print('vdpPlot','-djpeg')"); // Return results to Java double[][] y = eng.getVariable("y"); double[] t = eng.getVariable("t"); // Display results System.out.println("Simulation result " + Arrays.deepToString(y)); System.out.println("Time vector " + Arrays.toString(t)); eng.close(); } }

関連するトピック