多领域物理统一建模语言与MWORKS实践 课件 4-6-Modelica语法详解-函数(1学时)_第1页
多领域物理统一建模语言与MWORKS实践 课件 4-6-Modelica语法详解-函数(1学时)_第2页
多领域物理统一建模语言与MWORKS实践 课件 4-6-Modelica语法详解-函数(1学时)_第3页
多领域物理统一建模语言与MWORKS实践 课件 4-6-Modelica语法详解-函数(1学时)_第4页
多领域物理统一建模语言与MWORKS实践 课件 4-6-Modelica语法详解-函数(1学时)_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论