sqrt是Fortran标准定义的泛型、元素内在函数,用于计算实数或复数的平方根。实数参数必须非负并返回实数;复数参数返回复数主平方根,结果的kind与参数相同。它常用于频率、距离、能量等包含开方的物理计算,适合与cmplx结合,在阻尼振动、波动分析等特征方程出现负判别式的情况中使用。
语法结构
realResult = sqrt(realArgument)
complexResult = sqrt(complexArgument)
- 参数只能是real或complex,不能直接把整数传给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
现象分析
质量-弹簧系统的无阻尼固有角频率为。代入刚度k=10与质量m=1,先得到k/m=10,再由sqrt(10.0)得到约3.1622777,按四位小数显示为3.1623 rad/s。参数10.0是非负实数,因此这一步在实数域中完成。
含阻尼系统的特征方程为,其中m=1、阻尼系数c=2、k=10。判别式,代入后得到4-40=-36。负实数-36不能直接得到实数平方根,代码先用cmplx(discriminant,0.0)构造-36+0i,再由sqrt得到主平方根0+6i。
特征根公式为。代入-c=-2、√D=6i、2m=2,第一根为(-2+6i)/2=-1+3i,第二根为(-2-6i)/2=-1-3i。负实部-1表示振动幅度随时间衰减,虚部的绝对值3表示振荡角频率;两个根互为共轭复数。若采用判别式的另一个平方根-6i,只会交换两个特征根的先后顺序。
核心知识点
- sqrt只接受实数或复数,返回值与参数类型相同,结果kind也与参数一致。
- 实数参数必须非负;需要计算负数的平方根时,必须在调用sqrt之前将参数转换为复数。
- 复数sqrt返回主平方根,另一个平方根是返回值的相反数。
- 接收变量的类型不能改变函数根据实参类型选择的计算域,参数类型才是关键。