簡體   English   中英

OpenModelica 和 JModelica 提供了截然不同的結果

[英]OpenModelica and JModelica deliver significantly different results

這個問題之后,我試圖比較 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 論壇上發布了一個后續問題。

首先,我在上一篇文章中提到的代碼是錯誤的。 除了這里討論的一些小問題外,應該使用noEvent function 來確保正確編譯 if 語句的條件(更多信息在這里)。 這里提到了正確版本的代碼。

為了讓 JModelica 提供與 OpenModelica 類似的結果, Christian Winther在這里指示我使用opts["CVode_options"]["maxh"]參數,該參數的默認值為0 我將選項設置為:

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

和 JModelica 工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM