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

048.sqrt_SQRT平方根内在函数

sqrt是Fortran标准定义的泛型、元素内在函数,用于计算实数或复数的平方根。实数参数必须非负并返回实数;复数参数返回复数主平方根,结果的kind与参数相同。它常用于频率、距离、能量等包含开方的物理计算,适合与cmplx结合,在阻尼振动、波动分析等特征方程出现负判别式的情况中使用。

语法结构

realResult = sqrt(realArgument)
complexResult = sqrt(complexArgument)
  • 参数只能是realcomplex,不能直接把整数传给sqrt
  • 实数参数小于零时不满足实数平方根的定义域。即使接收结果的变量是复数,sqrt仍根据参数类型选择运算,必须先把负实数转换成复数。
  • 复数通常有互为相反数的两个平方根,sqrt返回其中的主平方根;另一个平方根是该结果的相反数。
  • 作为元素函数,sqrt也可以逐元素作用于实数或复数数组。

本文代码

! SQRT计算振动系统的固有角频率和复数特征根。
program sqrtDemo
  implicit none

  real :: mass, damping, stiffness, naturalFrequency, discriminant
  complex :: complexDiscriminant, root1, root2

  mass = 1.0
  damping = 2.0
  stiffness = 10.0

  naturalFrequency = sqrt(stiffness / mass)
  discriminant = damping**2 - 4.0 * mass * stiffness
  complexDiscriminant = cmplx(discriminant, 0.0)
  root1 = (-damping + sqrt(complexDiscriminant)) / (2.0 * mass)
  root2 = (-damping - sqrt(complexDiscriminant)) / (2.0 * mass)

  print "(A,F7.4,1X,A)", "固有角频率:", naturalFrequency, "rad/s"
  print "(A,F5.1)", "判别式:", discriminant
  print "(A,2F6.1)", "判别式的主平方根:", sqrt(complexDiscriminant)
  print "(A,2F6.1)", "特征根1:", root1
  print "(A,2F6.1)", "特征根2:", root2
end program sqrtDemo

编译运行

(base) hong@hongdeMacBook-Pro 048.sqrt % gfortran -Wall -Wextra -std=f2018 exampleSqrt.f90
(base) hong@hongdeMacBook-Pro 048.sqrt % ./a.out
固有角频率: 3.1623 rad/s
判别式:-36.0
判别式的主平方根:   0.0   6.0
特征根1:  -1.0   3.0
特征根2:  -1.0  -3.0

现象分析

质量-弹簧系统的无阻尼固有角频率为ω0=km\omega_0=\sqrt{k/m}。代入刚度k=10与质量m=1,先得到k/m=10,再由sqrt(10.0)得到约3.1622777,按四位小数显示为3.1623 rad/s。参数10.0是非负实数,因此这一步在实数域中完成。

含阻尼系统的特征方程为mr2+cr+k=0mr^2+cr+k=0,其中m=1、阻尼系数c=2、k=10。判别式D=c24mkD=c^2-4mk,代入后得到4-40=-36。负实数-36不能直接得到实数平方根,代码先用cmplx(discriminant,0.0)构造-36+0i,再由sqrt得到主平方根0+6i。

特征根公式为r1,2=c±D2mr_{1,2}=\frac{-c\pm\sqrt{D}}{2m}。代入-c=-2、√D=6i、2m=2,第一根为(-2+6i)/2=-1+3i,第二根为(-2-6i)/2=-1-3i。负实部-1表示振动幅度随时间衰减,虚部的绝对值3表示振荡角频率;两个根互为共轭复数。若采用判别式的另一个平方根-6i,只会交换两个特征根的先后顺序。

核心知识点

  • sqrt只接受实数或复数,返回值与参数类型相同,结果kind也与参数一致。
  • 实数参数必须非负;需要计算负数的平方根时,必须在调用sqrt之前将参数转换为复数。
  • 复数sqrt返回主平方根,另一个平方根是返回值的相反数。
  • 接收变量的类型不能改变函数根据实参类型选择的计算域,参数类型才是关键。

发表回复

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