# 函数标注¶

## 数学函数标注¶

### derivative¶

#### 简单的一阶导数¶

derivative标注的基本用途是为了指定另一个Modelica函数的名称，用来计算被标注函数的一阶导数。例如：

function f
input Real x;
input Real y;
output Real z;
annotation(derivative=df);
algorithm
z := // some expression involving x and y
end f;

function df
input Real x;
input Real y;
input Real dx;
input Real dy;
output Real dz;
algorithm
dz := // some expression involving x, y, dx and dy
end df;


$\frac{\mathrm{d}f}{\mathrm{d}v}(x,y) = df(x, y, \frac{\partial x}{\partial v}, \frac{\partial y}{\partial v})$

#### 不敏感参数¶

function f
input Real x;
input Real y;
output Real z;
annotation(derivative=df, derivative(zeroDerivative=y)=df_onlyx);
algorithm
z := // some expression involving x and y
end f;


function df_onlyx
input Real x;
input Real y;
input Real dx;
output Real dz;
algorithm
dz := // some expression involving x, y, dx
end df_onlyx;


#### 二阶导数¶

function f
input Real x;
input Real y;
output Real z;
annotation(derivative=df, derivative(order=2)=ddf);
algorithm
z := // some expression involving x and y
end f;

function df
...
end df;

function ddf
input Real x;
input Real y;
input Real dx;
input Real dy;
input Real ddx;
input Real ddy;
output Real ddz;
algorithm
ddz := // some expression involving x, y, dx, dy,
// ddx and ddz
end ddf;


annotation(derivative=df, derivative(order=2)=ddf);


#### 非实数参数¶

function g
input Real x;
input Integer y;
output Real z;
algorithm
z := // some expression involving x and y
end g;


function g
input Real x;
input Integer y;
output Real z;
annotation(derivative=dg);
algorithm
z := // some expression involving x and y
end g;

function dg
input Real x;
input Integer y;
input Real dx;
output Real dz;
algorithm
dz := // some expression involving x, y and dx
end dg;


### inverse（反函数）¶

 function h
input Real a;
input Real b;
output Real c;
annotation(inverse(b = h_inv_b(a, c)));
algorithm
c := // some calculation involving a and b
end h;


 function h_inv_b
input Real a;
input Real c;
output Real b;
algorithm
b := // some calculation involving a and c
end h_inv_b;


## 代码生成¶

### Inline¶

Inline标注用于提示Modelica编译器，函数中的语句是否应被“内联”。此标注的取值用于决定了执行内联与否。标注的默认值为false（如果函数定义中没有出现Inline标注）。下面是使用Inline标注定义的函数示例：

function SimpleCalculation
input Real x;
input Real y;
output Real z;
annotation(Inline=true);
algorithm
z := 2*x-y;
end SimpleCalculation;


Inline标注的功能只是用于提示Modelica编译器，编译器不会自动关联内嵌函数。此外，编译器内嵌函数的能力取决于函数的复杂程度。通常情况下，编译器没有必要（或者期望）去内嵌函数。

### LateInline¶

Inline标注一样，LateInline标注的功能是告诉Modelica编译器采用内嵌函数的方式将更有效。LateInline标注也会分配一个Boolean值用以指定是否应采用内嵌函数的方式。InlineLateInline标注的区别是，LateInline标注表明应在符号运算完成后执行内嵌功能。关于函数内嵌以及符号运算之间的交互关系超出了本书的讨论范围。

 Inline LateInline 说明 false false Inline=false true false Inline=true false true LateInline=true true true LateInline=true

## 外部函数¶

### Include¶

annotation(Include="#include \"mydefs.h\"");


Note

Include标注的值是一个字符串，如果它包含嵌入的字符串，需进行相应的转义。

### IncludeDirectory¶

Include标注，我们已经讨论了该标注允许在生成的代码内插入路径。IncludeDirectory标注指定了Include标注声明的内容应在哪个目录下搜索。

IncludeDirectory=modelica://LibraryName/Resources/Include


### Library¶

Library标注主要用于指定函数可能依赖的所有编译库，该标注的值可以是一个表示库名字的字符串，也可以是上述字符串组成的数组，即：

annotation(Library="somelib");


annotation(Library={"onelib","anotherlib"});


Modelica编译器在“链接”生成代码时将使用这些信息。

### LibraryDirectory¶

LibraryDirectory=modelica://LibraryName/Resources/Library