1

在 PyFMI 中将手推车问题模拟为 FMU 时,我得到不同的结果,给出相同的输入,具体取决于我是使用“模型交换”还是“协同模拟”。ME结果是正确的,CS结果似乎完全不正确。

模型交换结果

模型交换结果

model = load_fmu(fmu='CartPole.fmu', 
                 kind='ME')

model.set('theta_0', 0)
model.set('m_cart', 20)
model.set('m_pole', 5)
model.set('length', 2)
model.set('poleCartConnection.density', 0)
model.set('f', 0)
res = model.simulate(start_time=0, final_time=10)


plt.plot(res['f'])
plt.plot(res['x'])
plt.plot(res['x_dot'])
plt.plot(res['theta'])
plt.plot(res['theta_dot'])
plt.legend(['f', 'x', 'x_dot', 'theta', 'theta_dot'])
plt.show() 

相比(即完全相同,但使用 CS 而不是 ME)

model = load_fmu(fmu='CartPole.fmu', 
                 kind='CS')

model.set('theta_0', 0)
model.set('m_cart', 20)
model.set('m_pole', 5)
model.set('length', 2)
model.set('poleCartConnection.density', 0)
model.set('f', 0)
res = model.simulate(start_time=0, final_time=10)


plt.plot(res['f'])
plt.plot(res['x'])
plt.plot(res['x_dot'])
plt.plot(res['theta'])
plt.plot(res['theta_dot'])
plt.legend(['f', 'x', 'x_dot', 'theta', 'theta_dot'])
plt.show()

使用默认 ncp 的联合仿真结果

使用默认 ncp 的联合仿真结果

我怀疑它是由于求解器设置,但这些不能在 CS 案例中设置?当我将“ncp”设置为非常高的数字时,错误会减少。非常感谢您的回复!

具有高 ncp 的联合仿真结果

与高 ncp 的联合仿真

干杯

4

1 回答 1

3

在 OpenModelica 中,在导出协同仿真 FMU 时,Euler 是目前唯一受支持的求解器,如此处所述。OpenModelica 1.16 版应该可以解决这个问题。

于 2020-01-12T12:20:45.717 回答