运行仿真的 Java 代码
以下 Java 代码运行 Simulink vdp 模型仿真,并将结果返回到 Java。该实现执行以下操作:
创建一个 MATLAB 引擎对象,并启动一个 MATLAB 会话。
调用 MATLAB load_system 命令以启动 Simulink 并以异步方式加载 vdp 模型。轮询任务,直到 Future 返回。
调用 MATLAB sim 命令以设置仿真参数并运行仿真。轮询任务,直到 Future 返回。
捕获仿真结果。sim 函数的输出是在 MATLAB 基础工作区中创建的 MATLAB Simulink.SimulationOuput(Simulink) 对象。
引擎 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();
}
}