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()

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

               
                      Рис.1 - Скорость в зависимости от времени, решенная с помощью JModelica.                

а также

               
           Рис.2 - Зависимость силы трения и сдвига от времени, решенная с помощью JModelica.                

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

                     
                    Рис.3 - Параметры моделирования в OpenModelica.                

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

               
                   Рис.4 - Скорость в зависимости от времени, решенная OpenModelica.                

а также

               
        Рис.5 - Зависимость силы трения и сдвига от времени, решенная OpenModelica.                

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

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

1 ответ

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

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

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

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

Другие вопросы по тегам