版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Modelica语法详解函数哈工大计算学部-工业软件中心哈工大重庆研究院-无人装备中心曲明成
博士/副教授
qumingcheng@2025年4月23日
functionLineWithProtected
input
Realx;
input
Realp0[2];
input
Realp1[2];
output
Realy;protected
Realm=(p1[2]-p0[2])/(p1[1]-p0[1]);
Realb=(p1[2]+p0[2]-m*(p1[1]+p0[1]))/2.0;algorithm
y:=m*x+b;endLineWithProtected;那么如何继续计算多项式?…Example函数Modelica代码
例如4阶多项式的表达式为:使用递归的方式更加高效,仅用加法和乘法,避免了处理更复杂的求幂运算。functionPolynomial"多项式计算"
input
Realx"独立变量";
input
Realc[:]"多项式系数";
output
Realy"多项式的值";protected
Integern=size(c,1);algorithm
y:=c[1];
foriin
2:nloop
y:=y*x+c[i];
endfor;endPolynomial;modelEvaluationTest1
Realyf;
Realyp;equation
yf=Polynomial(time,{1,-2,2});yp=time^2-2*time+2;endEvaluationTest1;如何在Modelica中实现递归?如何增加算法的重用性?函数声明函数调用Example函数是数学意义上的纯函数,也就是说相同的输入总是具有相同的输出,并且调用顺序与调用次数不改变所在模型的仿真状态。functionPolynomial"多项式计算"
input
Realx"独立变量";
input
Realc[:]"多项式系数";
output
Realy"多项式的值";protected
Integern=size(c,1);algorithm
y:=c[1];
foriin
2:nloop
y:=y*x+c[i];
endfor;endPolynomial;函数该如何声明?由哪些部分组成?怎么调用函数?modelEvaluationTest1
Realyf;
Realyp;equation
yf=Polynomial(time,{1,-2,2});yp=time^2-2*time+2;endEvaluationTest1;思考modelUriTest1//将外部函数封装成function
functionIncTest1
input
Reala1;
input
Realb1;
output
Realc1;//外部函数声明//IncludeDirectory注解指定包含文件所在的位置,以URI的modelica模式表示//Include指定外部函数所需的头文件
external"C"c1=add(a1,b1)
annotation(IncludeDirectory=
"modelica://ExternFunc/Include",Include="#include\"add.c\"");
endIncTest1;//调用函数IncTest1
Realy=IncTest1(2.0,3.0);endUriTest1;doubleadd(doublea,doubleb){returna+b;}目录1.
函数声明2.函数调用3.内置函数4.记录构造函数6.本章回顾5.函数微分注解声明function
LineWithProtected
"计算直线点坐标"
input
Real
x
"输入横坐标";
input
Real
p0[2]
"直线上p0点坐标";
input
Real
p1[2]
"直线上p1点坐标";
output
Real
y
"对应x的y坐标";protected
Real
m
=
(p1[2]
-
p0[2])
/
(p1[1]
-
p0[1]);
Real
b
=
(p1[2]
+
p0[2]
-
m
*
(p1[1]
+
p0[1]))
/
2.0
;algorithm
y
:=
m
*
x
+
b;end
LineWithProtected;函数一般结构Modelica函数是使用关键字function的特化类,一般由输入变量、输出变量、中间变量、算法组成。functionnameinputTypeI1in1;inputTypeI2in2;inputTypeI3in3:=default_expr1"Comment"annotation(...);...outputTypeO1out1;outputTypeO2out2:=default_expr2;...protected
<localvariables>...algorithm...<statements>...endname;定义function名称定义输入定义输出定义中间变量描述function算法结束function定义1.函数声明注意事项functionIsVectorEqual"判断向量是否相等"
input
Realv1[:];
input
Realv2[:];
input
Realeps(min=0)=0;
output
Booleanresult;protected
Integeri=1;algorithm
result:=false;
ifsize(v1,1)<>size(v2,1)then
return;
endif;result:=true;
whilei<size(v1,1)loop
ifabs(v1[i]-v2[i])>epsthen
result:=false;
return;
endif;i:=i+1;
endwhile;endIsVectorEqual;函数中输入形参赋值只是给输入形参一个缺省值,即调用函数时如果不给eps赋值,eps默认为0。输入形参是只读的,在算法中不能给输入形参赋值函数中不能用于连接,不能有“equation”,至多有一个“algorithm”区域或外部函数接口。函数中所有数组的长度必须可以通过输入形参或者函数中的参数、常量确定。函数中不能调用der、initial、terminal、sample、pre、edge、change、delay、cardinality、reinit等内置操作符和函数,也不能使用when语句。“return”语句表示退出函数调用,返回值取输出形参的当前值。public区域的变量声明是函数的形参,必须有“input”或“output”前缀,protected区域的变量声明是函数的临时变量,不能有“input”和“output”前缀。1.函数声明变量定义与记录类配合使用:recordComplex"复数"
Realre"实数部分";
Realim"虚数部分";endComplex;modeltest
Complexc1(re=2,im=3);
Complexc2(re=sin(time),im=cos(time));
Complexc;equation
c=Complex_add(c1,c2);endtest;functionComplex_add
input
Complexu;
input
Complexv;
output
Complexw(re=u.re+v.re,im=u.im+v.im);endComplex_add;方式1:functionComplex_add
input
Complexu;
input
Complexv;
output
Complexw;algorithm
w:=Complex(re=u.re+v.re,im=u.im+v.im);endComplex_add;方式2:functionComplex_add
input
Complexu;
input
Complexv;
output
Complexw;algorithm
w.re:=u.re+v.re;w.im:=u.im+v.im;endComplex_add;方式3:优点:record相当于集合,能够增加形参的重用性,有效减少工作量将相关变量使用record集合化,可增加仿真结果的直观性。1.函数声明目录1.
函数声明2.函数调用3.内置函数4.记录构造函数6.本章回顾5.函数微分注解声明functionEqual
input
Realx1;
input
Realx2=2;
input
Realx3=3;
output
Realy1;
output
Realy2;
output
Realy3;algorithm
y1:=x1;y2:=x2;y3:=x3;endEqual;modelEqual_Test
parameter
Reala=1;
parameter
Realb=2;
parameter
Realc=3;
Realy1;
Realy2;
Realy3;equation
(y1,y2,y3)=Equal(a,b,c);endEqual_Test;方式1:按位置传参(y1,y2,y3)=Equal(a,b,c);方式2:按形参名字传参(推荐使用)(y1,y2,y3)=Equal(x3=c,x2=b,x1=a);方式3:混合方式传参(不推荐使用)(y1,y2,y3)=Equal(a,x3=c);结果等价注意:实参与形参数据类型与维度均保持一致形参如有缺省值则可以不传参。混合传参时,按形参名字传参的实参必须放在按位置传参的实参之后,不推荐使用。2.函数调用-形参输入functionEqual
input
Realx1;
input
Realx2=2;
input
Realx3=3;
output
Realy1;
output
Realy2;
output
Realy3;algorithm
y1:=x1;y2:=x2;y3:=x3;endEqual;modelEqual_Test
parameter
Reala=1;
parameter
Realb=2;
parameter
Realc=3;
Realy1;
Realy2;
Realy3;equation
(y1,y2,y3)=Equal(a,b,c);endEqual_Test;全部传参(y1,y2,y3)=Equal(a,b,c);求解前两个值(y1,y2)=Equal(x3=c,x2=b,x1=a);求解第1,3两个值(y1,,y3)=Equal(a,x3=c);注意:多个输出使用“()”表示输出传参只能按照位置传参,与function中定义的输出形参顺序一致。求解后两个值(,y2,y3)=Equal(x3=c,x2=b,x1=a);y1=1y2=2y3=3y1=1y2=2y1=1y3=3y2=2y3=3未赋值变量需要使用其他等式进行赋值2.函数调用-形参输出向量化调用自定义函数functionvec_sum
input
RealA[:];
output
Realres;algorithmres:=0;
foriin
1:size(A,1)loopres:=res+A[i];
endfor;endvec_sum;modelvec_sum_Test
parameter
Reala[:,:]={{1,2,3,4},{2,4,6,8}};
Realsum[size(a,1)];equation
sum=vec_sum(a);endvec_sum_Test;sum={vec_sum({1,2,3,4}),vec_sum({2,4,6,8});等价于内置函数Modelica的函数向量化调用,即返回标量值的函数可以应用向量化调用方式实现以数组作为实参调用函数,Modelica自动以数组逐个元素作为参数来调用函数,返回结果数组,极大地提高了建模效率。sin({a,b,c})={sin(a),sin(b),sin(c)}sin([a,b,c])=[sin(a),sin(b),sin(c)]sin([1,2;3,4])=[sin(1),sin(2);sin(3),sin(4)]div({a,b,c},{d,e,f})={div(a,d),div(b,e),div(c,f)}2.函数调用目录1.
函数声明2.函数调用3.内置函数4.记录构造函数6.本章回顾5.函数微分注解声明分类函数名称说明数值函数abs(a)返回标量绝对值sign(a) 返回标量符号sqrt(a) 返回标量平方根转换函数Integer(e)返回枚举型序数String(a,<options>)将一个标量表达式转为字符串表示事件触发数学函数div(x,y) 返回x/y的商且丢弃小数部分mod(x,y)返回x/y的整数模,即x-floor(x/y)*yrem(x,y)返回x/y整除的余数ceil(x)返回不小于x的最小整数floor(x)返回不大于x的最大整数integer(x)返回不大于x的最大整数,结果必为整型求导和特殊用途函数der(expr)返回表达式对时间求导delay()返回表达式的迟滞信号semiLinear(x,positiveSlope,negativeSlope)若x>=0结果为positiveSlope*x,否则结果为negativeSlope*x分类函数名称说明数学函数sin(x)正弦函数cos(x)余弦函数tan(x)正切函数asin(x)反正弦函数acos(x)反余弦函数atan(x)反正切函数atan2(x,y)四象限反向切值sinh(x)双曲正弦函数cosh(x)双曲余弦函数tanh(x)双曲正切函数exp(x)自然指数函数log(x)自然对数(e为底),x>0log10(x)10为底的对数,x>0关于数组函数详细内容在《数组》章节中进行详细讲解关于事件相关函数详细内容在《事件》章节中进行详细讲解3.内置函数数值函数abs(a):返回标量绝对值sign(a):返回标量符号sqrt(a):返回平方根modelValue
parameter
Reala=-4;
Realb;
Realc;
Reald;equation
b=abs(a);c=sign(a);d=sqrt(abs(a));endValue;b=4;c=-1;d=2;注意:sqrt(a)中的输入实参必须为非负数abs(a)、sign(a)、sqrt(a)中的输入实参类型均为实型或整型;3.内置函数转换函数Integer(e):返回枚举值的序数modelInteger_f
type
SelectMode=enumeration(Mode1"模式1",Mode2"模式2",Mode3"模式3")
"选择模式";
parameter
SelectModem=SelectMode.Mode2;
Realb;equation
b=Integer(m);endInteger_f;b=2;注意:Integer(e)输入实参为枚举型中确定的枚举值;返回值为整型或实型;String(a,<options>):将一个标量表达式转为字符串表示modelString_f
parameter
Reala1=3.1415926;Stringb1;equation
b1=String(a1,significantDigits=2,minimumLength=5,leftJustified=false);endString_f;b1=“3.1”;说明:string()输入实参的数据类型可为实型、整型、布尔型、枚举型。significantDigits=2,表示字符串有效数字个数为2,赋值必须为整型,且只能用于实型输入实参。minimumLength=5,表示字符串最小长度,用空格填充未用空间,赋值必须为整型,可用于所有类型输入实参。leftJustified=false,表示右对齐,如果赋值为true则为左对齐,赋值必须为布尔型,可用于所有类型输入实参。3.内置函数事件触发数学函数div(x,y):返回x/y的商,舍弃小数部分mod(x,y):返回x/y的整数模,即x-floor(x/y)*yrem(x,y):返回x/y的整余数ceil(x):返回不小于x的最小整数floor(x):返回不大于x的最大整数integer(x):返回不大于x的最大整数,结果必为整型在when子句之外使用modelEvent_math
parameter
Realx=3.2;parameter
Realy=2;
Reala;
Realb;
Realc;
Reald;Reale;
Integerf;equation
a=div(x,y);b=mod(x,y);c=rem(x,y);d=ceil(x);e=floor(x);f=integer(x);endEvent_math;a=1;b=1.2;c=1.2;d=4;e=3;f=3;注意:div(x,y)、mod(x,y)、rem(x,y)中x、y均为整型时,输出实参可以为整型或者实型,否则输出实参均为实型。ceil(x)、floor(x)参数和输出只可为实型,integer(x)参数只可为实型,输出只可为整型。3.内置函数modelMath
parameter
Integera=2;
Realb;
Realc;
Reald;equation
b=sin(a);c=cos(a);d=tan(a);endMath;b=sin(2);c=cos(2);d=tan(2);注意:以上函数参数为实型或整型,输出为实型。函数名称说明sin(x)正弦函数cos(x)余弦函数tan(x)正切函数,x≠π/2,3π/2,…asin(x)反正弦函数,-1≤x≤1acos(x)反余弦函数,-1≤x≤1atan(x)反正切函数atan2(x,y)四象限反向切值sinh(x)双曲正弦函数cosh(x)双曲余弦函数tanh(x)双曲正切函数exp(x)自然指数函数log(x)自然对数(e为底),x>0log10(x)10为底的对数,x>03.内置函数数学函数求导和特殊用途函数注意:参数必须可微分。der(expr):返回表达式对时间求导modelDer
Realx=sin(time);
Realy;equation
y=der(x);endDer;注意:delay(expr,delayTime)时,delayTime必须为参数或常数。delay(expr,delayTime,delayMax)时,delayMax必须为参数或常数,此时delayTime可为变量,delayTime≤delayMax。delay(expr,delayTime):delay(expr,delayTime,delayMax)modelDelay
parameter
Realdelaytime=1;
Reala=sin(time);
Realb1;
Realb2;equation
b1=delay(a,delaytime);b2=delay(a,sin(time),delaytime);endDelay;返回表达式的迟滞信号3.内置函数本例中,延迟时间为时间的正弦函数,但当它大于1时,延迟时间为1.求导和特殊用途函数说明:semiLinear函数用于处理流体系统中的回流,例如:H_flow=semiLinear(m_flow,port.h,h);即,焓流速H_flow可以依据流向,由物质流速m_flow和返侵比焓来计算。semiLinear(x,positiveSlope,negativeSlope):若x>=0结果为positiveSlope*x,否则结果为negativeSlope*xmodelSemiLinear
Realx=sin(time);
Realsa=2;
Realsb=3;
Realy;equationy=semiLinear(x,sa,sb);endSemiLinear;3.内置函数目录1.
函数声明2.函数调用3.内置函数4.记录构造函数6.本章回顾5.函数微分注解声明每实例化一个记录,都隐含定义了一个记录构造函数,它与记录同名,与记录类有相同的作用域,记录类赋值方式与函数相同。packagedemo
recordRecord1
parameterRealr0=0;
endRecord1;
recordRecord2extends
Record1;
constant
Realc1=2.0;
constant
Realc2;
parameter
Integern1=5;
parameter
Integern2;
parameter
Realr1"comment";
parameter
Realr2=sin(c1);
parameter
Realr4;
parameter
Realr5=5.0;
Realr6[n1];
Realr7[n2];
final
parameter
Realr3=cos(r2);
endRecord2;enddemo;packageDemo
functionRecord1
input
Realr0=0;
output
Record1'result'(r0=r0);
endRecord1;
functionRecord2
input
Realr0=0;
input
Realc1=2;
input
Realc2;
input
Integern1:=5;
input
Integern2;
input
Realr1"comment";
input
Realr2:=sin(c1);
input
Realr4;
input
Realr5=5.0;
input
Realr6[n1];
input
Realr7[n2];
output
Record2'result’(r0=r0,c2=c2,n1=n1,n2=n2,r1=r1,r2=r2,r4=r4,r5=r5,r6=r6,r7=r7);
protected
finalparameterRealr3=cos(r2);
endRecord2;endDemo;记录类赋值说明:前缀为:finalparameter时,被记为保护组件,不能进行重新赋值。前缀为constant、parameter或无前缀时,原记录类中赋值为缺省赋值,可以重新进行赋值。传参方式:按形参名传参(推荐)按位置传参modelRecord_test
Record2r1=Record2(r0=1,c1=4,c2=2,n1=2,n2=3,r1=1,
r2=2,r4=5,r5=5,r6={1,2},r7={1,2,3});
Record2r2=Record2(1,4,2,2,3,1,2,5,5,{1,2},{1,2,3});endRecord_test;隐式定义4.记录构造函数目录1.
函数声明2.函数调用3.内置函数4.记录构造函数6.本章回顾5.函数微分注解声明对于内置函数,可以直接使用der对时间进行求导;对于自定义函数,可以使用smoothOrder让工具自行推导出导函数5.函数微分注解声明modelder_func_testfunctionsin_cos
input
Realx;
output
Realy;algorithm
y:=0;y:=sin(x)*cos(x);endsin_cos;
Realx=sin(time)*cos(time);
Realy=der(x);
Realx2=sin_cos(time);
Realy2=der(x2);endder_func_test;functionsin_cosinput
Realx;output
Realy;
annotation(smoothOrder=1);algorithm
y:=0;y:=sin(x)*cos(x);endsin_cos;形式:function+函数名称<属性描述>annotation(smoothOrder=n)<行为描述>end+函数名称modelder_func_testfunctionsin_cos
input
Realx;
output
Realy;algorithm
y:=0;y:=sin(x)*cos(x);endsin_cos;
Realx=sin(time)*cos(time);
Realy=der(x);
Realx2=sin_cos(time);
Realy2=der(x2);endder_func_test;在一些特定情况下,smoothOrder无法推出导函数,还可以自己推导导函数并进行相关绑定。如何关联原函数和推导的导函数?functionsin_cosinput
Realx;output
Realy;
annotation(derivative=sin_cos_d);algorithm
y:=sin(x)*cos(x);endsin_cos;functionsin_cos_d
input
Realx;
input
Realder_x;
output
Realder_y;algorithm
der_y:=der_x*cos(x)^2
-der_x*sin(x)^2;endsin_cos_d;形式:function+函数名称<属性描述>annotation(derivative=导函数路径)<行为描述>end+函数名称5.函数微分注解声明多阶复合函数求导functionf
input
Realx;
output
Realy;
annotation(derivative=der_f);algorithm
…endf;functionder_f
input
Realx;
input
Realder_x;
output
Realder_y;
annotation(derivative(order=2)=der_2_f);algorithm
…endder_f;functionder_2_f
input
Realx;
input
Realder_x;
input
Realder_2_x;
input
Realder_y;
output
Realder_2_y;algorithm
…endder_2_f;形式:function+函数名称<属性描述>annotation(derivative(order=n)=n阶导函数路径)<行为描述>end+函数名称说明:order=n表示n阶导函数,n为整型,且缺省值为1;Modelder_FRealx=sin(time);Realy;
Realy1;
Realy2;equation
y=f(x);y1=der(y);y2
=
der(y1);endsin_cos;系统自行求出引用第一阶结果5.函数微分注解声明示例5.函数微分注解声明建一个model,以time作为函数的输入求输出y1,y2求解y2一阶导数和二阶导数的值function
func_y1
inputRealx;
output
Realy1;algorithm
ifsin(x)>0
then
y1:=sin(x)+0.5;
elsey1:=cos(x)+4;
endif;end
func_y1;function
func_y2
input
Realx;
output
Realy2;protected
Realy1=func_y1(x);algorithm
y2:=x*y1;end
func_y2;modelCal
Realx=time;
Realy1;
Realy2;equationy1=func_y1(x);y2=func_y2(x);endDy2;5.函数微分注解声明functionDer1"y2一阶导数"
input
Realx;
input
Realder_x;
output
Realdy2;
annotation(derivative(order=2)=Der2);algorithm
ifsin(x)>0
then
dy2:=(0.5+sin(x)+x*cos(x))*der_x;
elsedy2:=(cos(x)-x*sin(x)+4)*der_x;
endif;endDer1;functionDer2"y2二阶导数"
input
Realx;
input
Realder_x;
input
Realdy2;
output
Realddy2;algorithm
ifsin(x)>0
then
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年国家开发银行(青岛市分行)人员招聘笔试备考题库及答案详解
- 2026重庆百业兴物业管理有限责任公司招聘2人笔试参考题库及答案详解
- 2026年淮北市相山区中小学新任教师公开招聘10名笔试备考试题及答案详解
- 2026年衢州龙游县公开招聘卫生专业技术人员26人笔试模拟试题及答案详解
- 2026浙江台州市玉环市城更建设开发有限公司招聘编外人员3人笔试参考题库及答案详解
- 线上线下土特产销售合作协议范本
- 2026云南黄金矿业集团股份有限公司第一次招聘工作人员13人笔试备考题库及答案详解
- 2026河北石家庄市委党校(石家庄行政学院、石家庄市社会主义学院、河北正定干部学院)公开选聘专职教师14名笔试参考题库及答案详解
- 畜牧养殖场动物疫病防控合作协议
- 2026陕西旅游烹饪职业学院招聘6人笔试备考试题及答案详解
- 2025年下半年安徽省港航集团有限公司所属企业社会公开招聘22名考试参考试题及答案解析
- 安眠药服用安全知识培训课件
- 电机学教案本
- (正式版)DB42∕T 1787.4-2021 《科技馆展览教育通 用要求 第4部分:说明牌》
- 【MOOC答案】《智能仪器设计技术》(东南大学)章节期末慕课答案
- Zippo-2024原版年册完整集合系列
- 盒子记号打印器设计
- 租赁模板脚手架维修保养技术规范
- 《电力管理信息系统工程初步设计文件内容深度规定》编制说明
- TSG G7001-2015 锅炉监督检验规则
- 贵州光伏项目可行性研究报告
评论
0/150
提交评论