fortran fortran中文资料网
手气不错
Article

045.min&Max&Abs_数值函数

minmaxabs是fortran标准定义的数值类内在函数。minmax从两个或更多参数中选择最小值与最大值;abs计算整数或实数的绝对值,参数为复数时计算复数的模。根据参数产生结果,不会修改作为参数传入的变量。

本文三个函数常用于从多个候选值中确定上下界、计算偏差大小或复数量值。比较适合在约束检查、误差评估和最不利工况筛选中使用,并可与算术表达式或其他函数结合,直接组成更完整的计算表达式。

函数的概念

函数是一类可以接收参数并返回结果的过程,函数引用可以作为表达式的一部分,例如max(abs(x), abs(y))。子程序同样属于过程,但通常用call调用,并通过参数完成操作,而不是在表达式中返回函数结果。

  • 内在函数由fortran标准环境提供,不需要编写函数定义;也可以自行定义函数。
  • 泛型函数允许同一名称根据参数类型和种类选择相应实现,例如abs可接收整数、实数或复数。
  • 元素函数既能处理标量,也能逐元素处理形状相容的数组。minmaxabs都属于元素内在函数。

在实验和数值计算中,minmax可用于选择多个候选值的上下边界,abs可用于计算误差大小、距离或复数的模。多个偏差可以先分别取绝对值,再用max找出最不利情况。

语法结构

minimumValue = min(a1, a2 [, a3, ...])
maximumValue = max(a1, a2 [, a3, ...])
absoluteValue = abs(a)
  • 标准fortran要求minmax的参数具有相同类型和种类,参数类型为整数或实数;结果与参数具有相同类型和种类。
  • abs接收整数或实数时,结果与参数具有相同类型和种类;接收复数时,结果是与其实部和虚部同种类的实数。
  • 对数组使用这些元素函数时会得到逐元素结果。要求整个数组的最小值或最大值,应使用minvalmaxval

本文代码

! 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\(\sqrt{3^2+4^2}\)\sqrt{3^2+4^2}计算其模,结果为实数5.0,而非复数。

核心知识点

  • 函数接收参数并返回结果,函数引用可以嵌入表达式;内在函数由Fortran标准环境提供。
  • minmax从同类型、同种类的数值参数中选择边界值。
  • abs计算整数或实数的绝对值;对复数计算模并返回实数。
  • 三个函数都是泛型、元素内在函数;数组逐元素运算与minvalmaxval的数组归约不是同一操作。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注