我知道可以使用python dymola接口进行参数研究。然而,这假设已经存在现有模型。我特别感兴趣的是在python中编写modelica方程。但我没有找到任何关于此的文件。有没有人有一些饲料?谢谢!
答案 0 :(得分:2)
正如matth指出的那样,最干净的方法可能是使用模板引擎。 但是要开始,简单的python字符串格式化也会这样做。
然而,问题或多或少是复杂的,这取决于您是想更新现有模型的部分还是仅从头开始创建新模型。
以下是一个示例,如果可以从您的参数,变量和方程式中创建一个简单的Modelica模型(如果它们已经在Python中可用):
name = 'myModel'
parameters = ['Real x=3', 'Boolean a=false']
variables = ['Real y', 'Boolean b']
equations = ['der(y) = x*time', 'b=not a']
template = """
model {name}
{parameters}
{variables}
equation
{equations}
end {name};"""
model = template.format(name=name,
parameters='parameter '+';\n parameter '.join(parameters)+';' if parameters else '',
variables=';\n '.join(variables)+';' if variables else '',
equations=';\n '.join(equations)+';' if equations else '')
如果需要,可以使用与参数相同的方式处理常量。
如果现有模型的某些部分应该更新,则会变得更加复杂,因为您必须解析Modelica代码并确保正确识别参数,变量,方程等。
如果您只想对某些设计用于例如更新的方程式变得更简单。您可以标记方程式部分的开头和结尾,以便轻松识别它们并插入新的方程式。所以你会例如有这样的模型:
model myModel
equation
// #equationSectionStart
...
// #equationSectionEnd
end myModel;
然后使用正则表达式替换标记之间的内容。
你还必须以某种方式阅读和编写模型,因此下面有一些提示。
您可以读取.mo文件的内容或使用python接口,并从Dymola获取已加载的Modelica类的代码
getClassText(fullName, includeAnnotations=True, formatted=False)
其中fullName是Dymolas包浏览器中Modelica类的完整路径。
Dymola没有提供更新模型部分的任何内容,但是如果该类已经存在,则有一个命令可以创建新类或覆盖整个类文本:
setClassText(parentName, fullText)
parentName
是父类的路径,通常是一个包(如果类应位于顶层,则为空字符串),新类文本为fullText
。
至于阅读,你也可以在文件的基础上进行操作,只需创建一个.mo文件并在Dymola中加载。
函数setClassText
和getClassText
也适用于java接口和DymolaCommands
库中的Dymola。
答案 1 :(得分:1)
Dymola Python界面的文档在您的本地计算机上,对于Windows用户来说就是这里(只需将URL复制到您的webbrowser):
file:///C:/Program Files (x86)/Dymola 2018/Modelica/Library/python_interface/doc/index.html
快速扫描我看不到任何功能,例如从字符串创建模型。 我以为我在OpenModelica scripting documentation看到了这样的功能,但我再也找不到了。
但是你当然可以将该字符串写入.mo文件,然后模拟该文件。 也许使用像Mako或Jinja2这样的模板引擎对你来说是个有趣的选择吗?您必须编写一个只替换少量变量的模型模板。或者使用f-strings introduced with Python 3.6执行相同操作。
在此基础上,您还可以为具有参数,属性,方法,构造函数等的模型编写自己的面向对象的Python类。还有一个抽象层,以便可以在Dymola,OpenModelica,SimulationX或FMU中模拟模型。
或者Modelica-related packages on PyPI中的一个可以做你需要的事情吗?