我想在经济建模(例如系统动力学)中使用非SI单位进行时间分析。当然,我可以花秒( s )然后使用displayUnit
,据我所知,没有很好的方法来修改 displayUnit 我主要使用的是System Modeler中的 time 。
因此,在编写库时,我希望用户选择一个名为type
的全局ModelTime
,理想情况下,在某些情况下将其声明为inner
和replaceable
顶级班。然后,模型中的任何组件都可以使用全局type
来始终如一地对待任何与时间相关的var。
以下示例显示了我想如何实现这一点。
package Units
声明了两种非SI单位类型(Time_year
,Time_month
)package Interfaces
包含部分模型类GenericSimulationModel
,它将成为使用该库编写的任何模型的顶级范围。应该提供type ModelTime
作为inner
和replaceable
类package Components
定义了一个简单的block
类,该类通过ModelTime
定义使用outer
来定义其output y
,并在其中简单地显示time
全局选择的时间单位model Example
将所有这些联系在一起,以提供一个示例,说明使用该库的任何模型应如何工作代码如下:
model MinimalExample
package Units
type Time_year = Real(final quantity = "Time", final unit = "yr");
type Time_month = Real(final quantity = "Time", final unit = "mo");
end Units;
package Interfaces
partial model GenericSimulationModel "Top-level model scope providing global vars"
inner replaceable type ModelTime = Years "Set to : Months, Years";
protected
type Years = Units.Time_year;
type Months = Units.Time_month;
end GenericSimulationModel;
end Interfaces;
package Components
block ComponentUsingTime
outer type ModelTime = MinimalExample.Units.Time_year;
output ModelTime y;
equation
y = time;
end ComponentUsingTime;
end Components;
model Example
extends Interfaces.GenericSimulationModel(
redeclare replaceable type ModelTime = Months
);
Components.ComponentUsingTime c;
end Example;
equation
end MinimalExample;
尽管所有内容在System Modeler和OpenModelica中都可以正确编译,但是很遗憾,该方法无法解决:在上述Example
模型的组件c中未使用重新声明的类型。
我该怎么做才能实现自己的目标?
答案 0 :(得分:0)
我从Wolfram MathCore(系统建模人员)的某人那里收到了feedback on Wolfram Community:
您在MinimalExample.example和MinimalLibrary.Example中看到的行为是错误,从我可以看到的情况来看,我已将其转发给从事这些工作的开发人员。