cmplx、real、aimag、conjg和abs是Fortran标准内在函数,分别用于构造复数、提取实部和虚部、求共轭以及求模。多用于交流电路、频域信号、波动方程和特征值计算;适合在实数物理分量与复数模型之间转换,并与复数乘除结合使用。
语法结构
z = cmplx(x, y, kind=realKind)
x = real(z, kind=realKind)
y = aimag(z)
conjugateValue = conjg(z)
magnitude = abs(z)
- cmplx(x,y,kind)把x和y转换为实部与虚部。省略y时虚部为0;若x本身是复数,则不能再提供y。
- cmplx省略kind时返回默认复数kind,即使x和y具有更高精度也不例外。需要保持real64时,应显式写出kind=real64。
- real(z)与aimag(z)分别返回实部和虚部;复数参数下,省略kind的real结果以及aimag结果都保留z的分量kind。
- conjg(a+bi)返回a-bi;复数abs返回实数模,而不是分别对两个分量取绝对值。
本例我把交流电路阻抗写成。
电阻R=3 Ω、电抗X=4 Ω时,阻抗为3+4i Ω;
电压相量为120+0i V,电流相量由计算。
本文代码
program complexIntrinsicsDemo
use iso_fortran_env, only: real64
implicit none
real(real64) :: resistance, reactance
real(real64) :: realPart, imaginaryPart, impedanceMagnitude
complex(real64) :: impedance, conjugateImpedance
complex(real64) :: voltage, current, magnitudeSquared
resistance = 3.0_real64
reactance = 4.0_real64
impedance = cmplx(resistance, reactance, kind=real64)
realPart = real(impedance, kind=real64)
imaginaryPart = aimag(impedance)
conjugateImpedance = conjg(impedance)
impedanceMagnitude = abs(impedance)
magnitudeSquared = impedance * conjugateImpedance
voltage = cmplx(120.0_real64, 0.0_real64, kind=real64)
current = voltage / impedance
print "(A,SP,F7.2,F7.2,A)", "阻抗:", realPart, imaginaryPart, "i ohm"
print "(A,F7.2,1X,A)", "电阻分量:", realPart, "ohm"
print "(A,F7.2,1X,A)", "电抗分量:", imaginaryPart, "ohm"
print "(A,SP,F7.2,F7.2,A)", "共轭阻抗:", &
real(conjugateImpedance, kind=real64), aimag(conjugateImpedance), "i ohm"
print "(A,F7.2,1X,A)", "阻抗模:", impedanceMagnitude, "ohm"
print "(A,SP,F7.2,F7.2,A)", "Z乘CONJG(Z):", &
real(magnitudeSquared, kind=real64), aimag(magnitudeSquared), "i ohm^2"
print "(A,SP,F7.2,F7.2,A)", "电流:", &
real(current, kind=real64), aimag(current), "i A"
print "(A,F7.2,1X,A)", "电流模:", abs(current), "A"
end program complexIntrinsicsDemo
编译运行
(base) hong@hongdeMacBook-Pro 052.complexIntrinsics % gfortran -Wall -Wextra -std=f2018 exampleComplexIntrinsics.f90 -o exampleComplexIntrinsics
(base) hong@hongdeMacBook-Pro 052.complexIntrinsics % ./exampleComplexIntrinsics
阻抗: +3.00 +4.00i ohm
电阻分量: 3.00 ohm
电抗分量: 4.00 ohm
共轭阻抗: +3.00 -4.00i ohm
阻抗模: 5.00 ohm
Z乘CONJG(Z): +25.00 +0.00i ohm^2
电流: +14.40 -19.20i A
电流模: 24.00 A
现象分析
cmplx把电阻3与电抗4组成3+4i;real和aimag又分别取回3与4。conjg只改变虚部符号,因此共轭阻抗为3-4i。
阻抗与其共轭的乘积为,交叉项相消,所以输出25+0i。abs计算,验证了。
计算120/(3+4i)时,分子分母同乘3-4i,得到120(3-4i)/25=14.4-19.2i A。电流模为√(14.4²+19.2²)=24 A,也等于电压模120除以阻抗模5。输出格式中的SP只负责显示正号,不改变复数数值。
核心知识点
- cmplx负责构造或转换复数;目标不是默认kind时,应显式提供kind参数。
- real和aimag拆分两个分量,conjg保留实部并反转虚部符号。
- 复数abs返回与复数分量同kind的实数模。
- 恒等式z×conjg(z)=|z|²可用于推导复数除法、计算模平方并检查计算结果。