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

052.complexIntrinsics_复数构造、分解与共轭

2026年9月29日基础级

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返回实数模,而不是分别对两个分量取绝对值。

本例我把交流电路阻抗写成Z=R+iXZ=R+\mathrm{i}X。

电阻R=3 Ω、电抗X=4 Ω时,阻抗为3+4i Ω;

电压相量为120+0i V,电流相量由I=VZI=V/Z计算。

本文代码

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。

阻抗与其共轭的乘积为(3+4i)(3−4i)=32+42=25(3+4\mathrm{i})(3-4\mathrm{i})=3^2+4^2=25,交叉项相消,所以输出25+0i。abs计算|Z|=25=5\lvert Z\rvert=\sqrt{25}=5,验证了ZZ¯=|Z|2Z\overline{Z}=\lvert Z\rvert^2。

计算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|²可用于推导复数除法、计算模平方并检查计算结果。

发表回复

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