min、max和abs是fortran标准定义的数值类内在函数。min与max从两个或更多参数中选择最小值与最大值;abs计算整数或实数的绝对值,参数为复数时计算复数的模。根据参数产生结果,不会修改作为参数传入的变量。
本文三个函数常用于从多个候选值中确定上下界、计算偏差大小或复数量值。比较适合在约束检查、误差评估和最不利工况筛选中使用,并可与算术表达式或其他函数结合,直接组成更完整的计算表达式。
函数的概念
函数是一类可以接收参数并返回结果的过程,函数引用可以作为表达式的一部分,例如max(abs(x), abs(y))。子程序同样属于过程,但通常用call调用,并通过参数完成操作,而不是在表达式中返回函数结果。
- 内在函数由fortran标准环境提供,不需要编写函数定义;也可以自行定义函数。
- 泛型函数允许同一名称根据参数类型和种类选择相应实现,例如abs可接收整数、实数或复数。
- 元素函数既能处理标量,也能逐元素处理形状相容的数组。min、max和abs都属于元素内在函数。
在实验和数值计算中,min与max可用于选择多个候选值的上下边界,abs可用于计算误差大小、距离或复数的模。多个偏差可以先分别取绝对值,再用max找出最不利情况。
语法结构
minimumValue = min(a1, a2 [, a3, ...])
maximumValue = max(a1, a2 [, a3, ...])
absoluteValue = abs(a)
- 标准fortran要求min或max的参数具有相同类型和种类,参数类型为整数或实数;结果与参数具有相同类型和种类。
- abs接收整数或实数时,结果与参数具有相同类型和种类;接收复数时,结果是与其实部和虚部同种类的实数。
- 对数组使用这些元素函数时会得到逐元素结果。要求整个数组的最小值或最大值,应使用minval或maxval。
本文代码
! MIN、MAX选择边界值,ABS计算偏差大小或复数的模。
program minMaxAbsDemo
implicit none
real :: temperature1, temperature2, temperature3
real :: targetTemperature
real :: lowestTemperature, highestTemperature, maximumDeviation
complex :: impedance
temperature1 = 19.2
temperature2 = 21.5
temperature3 = 20.1
targetTemperature = 20.0
impedance = cmplx(3.0, 4.0)
lowestTemperature = min(temperature1, temperature2, temperature3)
highestTemperature = max(temperature1, temperature2, temperature3)
maximumDeviation = max(abs(temperature1 - targetTemperature), &
abs(temperature2 - targetTemperature), abs(temperature3 - targetTemperature))
print "(A,F5.1,1X,A)", "最低温度:", lowestTemperature, "摄氏度"
print "(A,F5.1,1X,A)", "最高温度:", highestTemperature, "摄氏度"
print "(A,F5.1,1X,A)", "最大偏差:", maximumDeviation, "摄氏度"
print "(A,F5.1,1X,A)", "复阻抗的模:", abs(impedance), "欧姆"
end program minMaxAbsDemo
编译运行
(base) hong@hongdeMacBook-Pro 045.minMaxAbs % gfortran exampleMinMaxAbs.f90
(base) hong@hongdeMacBook-Pro 045.minMaxAbs % ./a.out
最低温度: 19.2 摄氏度
最高温度: 21.5 摄氏度
最大偏差: 1.5 摄氏度
复阻抗的模: 5.0 欧姆
现象分析
temp1-3的温度分别是19.2、21.5和20.1摄氏度,因此min选择19.2,max选择21.5,分别返回了最小、最大值。
三个温度与目标值20.0的差分别为-0.8、1.5和0.1;经过abs后得到0.8、1.5和0.1,再由外层max选择1.5。使用函数嵌套表达“最大绝对偏差”的计算过程。
复阻抗的实部为3.0、虚部为4.0,abs按计算其模,结果为实数5.0,而非复数。
核心知识点
- 函数接收参数并返回结果,函数引用可以嵌入表达式;内在函数由Fortran标准环境提供。
- min和max从同类型、同种类的数值参数中选择边界值。
- abs计算整数或实数的绝对值;对复数计算模并返回实数。
- 三个函数都是泛型、元素内在函数;数组逐元素运算与minval、maxval的数组归约不是同一操作。