OpenModelica и JModelica дают существенно разные результаты

Следуя этому вопросу, я пытаюсь сравнить результаты моделирования между JModelica и OpenModelica. Файл Modelica идентичен вышеупомянутому сообщению, а оболочка JModelica - это исправленная версия:

#%%
from pymodelica import compile_fmu
from pyfmi import load_fmu
import matplotlib.pylab as plt

#%%
model_name = 'friction1D.fricexample_1'
mofile = 'friction1D.mo'

#%%
fmu_name = compile_fmu(model_name, mofile)
sim = load_fmu(fmu_name)

#%%
opts = sim.simulate_options()
opts["ncp"] = 500
opts['CVode_options']['rtol'] = 1.0e-8
res = sim.simulate(final_time=10, options=opts)

#%%
time = res['time']
vel = res['v']
ffo = res['ffo']
sfo = res['sfo']

#%%
plt.plot(time, vel)
plt.xlabel("Time (s)")
plt.ylabel("Velocity (m/s)")
plt.show()

#%%
plt.plot(time, ffo, label="friction force")
plt.plot(time, sfo, label="shear force")
plt.xlabel("Time (s)")
plt.ylabel("Force (N)")
plt.legend()
plt.show()

в результате чего:

               
                      Fig.1 - Velocity versus time solved by JModelica.                

а также

               
           Fig.2 - Friction and shear force versus time solved by JModelica.                

но если я установлю параметры моделирования в OpenModelica как:

                     
                    Fig.3 - Simulation options in OpenModelica.                

что приводит к:

               
                   Fig.4 - Velocity versus time solved by OpenModelica.                

а также

               
        Fig.5 - Friction and shear force versus time solved by OpenModelica.                

Я был бы признателен, если бы вы помогли мне узнать, почему результаты такие разные и как я могу добиться аналогичной симуляции с этими двумя разными компиляторами.

PS опубликовал дополнительный вопрос здесь, на форуме OpenModelica.


person Foad    schedule 03.10.2019    source источник


Ответы (1)


Прежде всего, код, который я упомянул в предыдущем сообщении, был неправильным. Помимо некоторых мелких проблем, которые обсуждались здесь, следует использовать функцию noEvent, чтобы убедиться, что условия оператора if скомпилированы правильно (подробнее здесь). Правильная версия кода упоминается здесь.

Чтобы JModelica выдавала результаты, аналогичные OpenModelica, меня проинструктировал Кристиан Винтер здесь, чтобы поиграть с параметром opts["CVode_options"]["maxh"], который имеет значение по умолчанию 0. Я установил вариант:

opts['CVode_options']['maxh'] = 0.01

и JModelica работала нормально.

person Foad    schedule 07.10.2019