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

049.expLog_指数与对数函数

exploglog10是Fortran标准定义的泛型、元素内在函数。exp(x)计算以自然常数e为底的指数,log(x)计算自然对数,log10(x)计算常用对数。它们常用于增长与衰减、时间常数和数量级计算,适合在指数模型中用exp求状态,并与loglog10结合反求未知量或换算分贝。

语法结构

exponentialValue = exp(x)
naturalLogarithm = log(x)
commonLogarithm = log10(x)
  • exp的参数可以是实数或复数,返回值与参数类型、种类相同。
  • log的参数可以是实数或复数;实数计算要求参数大于零,复数参数不能为零。
  • log10的标准参数是实数,实数计算同样要求参数大于零;结果与参数具有相同种类。
  • 较大的正指数可能使exp上溢,绝对值很大的负指数可能下溢;调用对数前应检查参数范围。

应用模型

RC电路断开电源后,电容电压按V(t)=V0etτV(t)=V_0e^{-t/\tau}衰减,其中V₀是初始电压,τ是时间常数。测得当前电压后,可以通过t=τln(VV0)t=-\tau\ln(V/V_0)反求经过时间;电压比对应的衰减量为AdB=20log10(V0V)A_{dB}=20\log_{10}(V_0/V)

本文代码

! EXP模拟RC电路电压衰减,LOG和LOG10反求时间与分贝。
program expLogDemo
  use iso_fortran_env, only: real64
  implicit none

  real(real64) :: initialVoltage, timeConstant, elapsedTime
  real(real64) :: voltage, recoveredTime, attenuationDb

  initialVoltage = 5.0_real64
  timeConstant = 2.0_real64
  elapsedTime = 3.0_real64

  voltage = initialVoltage * exp(-elapsedTime / timeConstant)
  recoveredTime = -timeConstant * log(voltage / initialVoltage)
  attenuationDb = 20.0_real64 * log10(initialVoltage / voltage)

  print "(A,F8.4,1X,A)", "3秒后的电压:", voltage, "V"
  print "(A,F8.4,1X,A)", "反求经过时间:", recoveredTime, "s"
  print "(A,F8.4,1X,A)", "电压衰减:", attenuationDb, "dB"
end program expLogDemo

编译运行

(base) hong@hongdeMacBook-Pro 049.expLog % gfortran -Wall -Wextra -std=f2018 exampleExpLog.f90
(base) hong@hongdeMacBook-Pro 049.expLog % ./a.out
3秒后的电压:  1.1157 V
反求经过时间:  3.0000 s
电压衰减: 13.0288 dB

现象分析

电压指数中的无量纲比值为-t/τ=-3/2=-1.5,exp(-1.5)约为0.22313016。初始电压5.0 V乘以该衰减因子得到1.1156508 V,按四位小数显示为1.1157 V。

当前电压与初始电压之比约为0.22313016,也就是exp(-1.5)。自然对数log(exp(-1.5))在浮点误差范围内恢复-1.5,再乘以-τ=-2,反求时间为3.0 s。这展示了log对实数指数关系的反解作用。

初始电压与当前电压之比约为4.481689,log10(4.481689)约为0.6514417;乘以电压幅值采用的系数20,得到13.0288 dB。loglog10处理的是同一个正数比值,但底数和物理用途不同。

核心知识点

  • exp计算自然指数,log计算自然对数,log10计算以10为底的对数。
  • 实数loglog10要求参数大于零;比值参与对数时还应保证分子、分母及单位具有合理含义。
  • log可反解以e为底的指数模型,log10适合数量级和分贝换算。
  • 指数与对数在数学上互逆,但浮点计算只能在可表示范围和舍入误差内近似恢复原值。

发表回复

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