Modelica - 如何在方程式中使用单位
Modelica - How to use units in equations
如何在 Modelica 的方程式中直接使用单位?这可能吗?
一个简单的例子,一个参数,应该依赖于(作为默认值)不同单元的另一个参数。在下面的示例中,它会(自然地)给出一个单元警告。我怎么说我只想要变量的标称值而不是值+单位?
model customspringdamper
import SI = Modelica.SIunits;
parameter SI.TranslationalSpringConstant c =100;
parameter SI.TranslationalDampingConstant d= 0.01*c;
... < rest of stuff > ...
end customspringdamper;
当然我可以用单位和值 1 定义另一个参数,但这感觉比必要的更费力?
我可以看到三种方式:
- 将参数声明为没有单位的实数:
parameter Real c =100;
你失去了单位检查,但你似乎没有使用它。
- 使用常量将值转换为不同的单位:
import SI = Modelica.SIunits;
parameter SI.TranslationalSpringConstant c= 100;
parameter SI.TranslationalDampingConstant d= 0.01*(c/unitSpring)*unitDamping;
constant SI.TranslationalSpringConstant unitSpring=1;
constant SI.TranslationalDampingConstant unitDamping=1;
工具应该能够简化代码以删除那些常量。但是,您绕过了单元检查,这使您的代码更容易出错。
在某些情况下,以这种方式删除单元是合法的 - 但在这种情况下不合法。
和2基本一样,只不过你把单位放在了0.01
;并赋予它实际的物理意义:
import SI = Modelica.SIunits;
parameter SI.TranslationalSpringConstant c= 100;
parameter SI.Time SpringTime=0.01;
parameter SI.TranslationalDampingConstant d= SpringTime*c;
如何在 Modelica 的方程式中直接使用单位?这可能吗? 一个简单的例子,一个参数,应该依赖于(作为默认值)不同单元的另一个参数。在下面的示例中,它会(自然地)给出一个单元警告。我怎么说我只想要变量的标称值而不是值+单位?
model customspringdamper
import SI = Modelica.SIunits;
parameter SI.TranslationalSpringConstant c =100;
parameter SI.TranslationalDampingConstant d= 0.01*c;
... < rest of stuff > ...
end customspringdamper;
当然我可以用单位和值 1 定义另一个参数,但这感觉比必要的更费力?
我可以看到三种方式:
- 将参数声明为没有单位的实数:
parameter Real c =100;
你失去了单位检查,但你似乎没有使用它。 - 使用常量将值转换为不同的单位:
import SI = Modelica.SIunits;
parameter SI.TranslationalSpringConstant c= 100;
parameter SI.TranslationalDampingConstant d= 0.01*(c/unitSpring)*unitDamping;
constant SI.TranslationalSpringConstant unitSpring=1;
constant SI.TranslationalDampingConstant unitDamping=1;
工具应该能够简化代码以删除那些常量。但是,您绕过了单元检查,这使您的代码更容易出错。
在某些情况下,以这种方式删除单元是合法的 - 但在这种情况下不合法。
和2基本一样,只不过你把单位放在了
0.01
;并赋予它实际的物理意义:import SI = Modelica.SIunits; parameter SI.TranslationalSpringConstant c= 100; parameter SI.Time SpringTime=0.01; parameter SI.TranslationalDampingConstant d= SpringTime*c;