diff --git a/AirTransmission/AtmosphericTransmittanceCalculator.cs b/AirTransmission/AtmosphericTransmittanceCalculator.cs
index d0448bd..34cb7c7 100644
--- a/AirTransmission/AtmosphericTransmittanceCalculator.cs
+++ b/AirTransmission/AtmosphericTransmittanceCalculator.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
* 1.0.0 (2024-10-13): 初始版本,提供各种大气传输模型的计算方法。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
*/
namespace AirTransmission
diff --git a/AirTransmission/AtmosphericTurbulenceModel.cs b/AirTransmission/AtmosphericTurbulenceModel.cs
index 0d4782a..38ad81c 100644
--- a/AirTransmission/AtmosphericTurbulenceModel.cs
+++ b/AirTransmission/AtmosphericTurbulenceModel.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
* 1.0.0 (2024-10-13): 初始版本,实现大气湍流对光传输影响的计算模型。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
*/
namespace AirTransmission
diff --git a/AirTransmission/IRTransmittanceModel.cs b/AirTransmission/IRTransmittanceModel.cs
index b7a1c57..7e5df81 100644
--- a/AirTransmission/IRTransmittanceModel.cs
+++ b/AirTransmission/IRTransmittanceModel.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
- * 1.0.0 (2024-10-13): 初始版本,实现红外线在大气中的传输特性计算,包括水蒸气和CO2的影响。作者:田建勇
+ * 1.0.0 (2024-10-13): 初始版本,实现红外线在大气中的传输特性计算。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,采用光谱模型法计算红外线透过率。作者:田建勇
*/
namespace AirTransmission
@@ -8,36 +9,142 @@ namespace AirTransmission
///
/// 红外线传输模型类,用于计算红外线在大气中的传输特性
///
- public class IRTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
+ public class IRTransmittanceModel : TransmittanceModel
{
- // 红外线波长(微米)
- private const double IR_WAVELENGTH = 10.0;
+ // 光谱分段参数
+ private const double MIN_WAVELENGTH = 3.0; // 红外波段最小波长(微米)
+ private const double MAX_WAVELENGTH = 12.0; // 红外波段最大波长(微米)
+ private const int SPECTRAL_BANDS = 100; // 光谱分段数
+ private const double IR_WAVELENGTH = 10.0; // 主要计算波长(微米)
+
+ public IRTransmittanceModel(WeatherCondition weather) : base(weather) { }
- ///
- /// 计算给定距离的红外线透过率
- ///
- /// 传输距离(米)
- /// 红外线透过率(0到1之间的值)
public override double CalculateTransmittance(double distance)
{
- double attenuationFactor = CalculateIRAttenuationFactor();
- double rainAttenuation = CalculateRainAttenuation(distance, IR_WAVELENGTH);
- double fogAttenuation = CalculateFogAttenuation(distance);
- double dustAttenuation = CalculateDustAttenuation(distance);
- double snowAttenuation = CalculateSnowAttenuation(distance, IR_WAVELENGTH);
- double waterVaporAttenuation = CalculateWaterVaporAttenuation(distance);
- double co2Attenuation = CalculateCO2Attenuation(distance);
+ // 将距离转换为千米
+ double distanceInKm = distance / 1000.0;
- double transmittance = Math.Exp(-attenuationFactor * distance - rainAttenuation - fogAttenuation - dustAttenuation - snowAttenuation - waterVaporAttenuation - co2Attenuation);
+ // 计算各种衰减机制的总和
+ double totalAttenuation = 0;
+ double wavelengthStep = (MAX_WAVELENGTH - MIN_WAVELENGTH) / SPECTRAL_BANDS;
- return Math.Max(0, Math.Min(1, transmittance));
+ for (int i = 0; i < SPECTRAL_BANDS; i++)
+ {
+ double wavelength = MIN_WAVELENGTH + i * wavelengthStep;
+ double bandAttenuation = CalculateBandAttenuation(wavelength);
+ double spectralWeight = GetSpectralWeight(wavelength);
+
+ totalAttenuation += bandAttenuation * spectralWeight;
+ }
+
+ // 计算基本透过率
+ double baseTransmittance = Math.Exp(-totalAttenuation * distanceInKm);
+
+ // 应用天气条件的影响
+ double weatherEffect = CalculateWeatherEffect(distance);
+ double finalTransmittance = baseTransmittance * weatherEffect;
+
+ return Math.Max(0, Math.Min(1, finalTransmittance));
+ }
+
+ private double CalculateBandAttenuation(double wavelength)
+ {
+ // 进一步增加衰减系数
+ double rayleighScattering = CalculateRayleighScattering(wavelength) * 4.0; // 从2.0改为4.0
+ double mieScattering = CalculateMieScattering(wavelength) * 5.0; // 从3.0改为5.0
+ double molecularAbsorption = CalculateMolecularAbsorption(wavelength) * 4.0; // 从2.5改为4.0
+
+ return rayleighScattering + mieScattering + molecularAbsorption;
+ }
+
+ private double CalculateRayleighScattering(double wavelength)
+ {
+ // Rayleigh散射系数计算(km^-1)
+ // 进一步增加 Rayleigh 散射的影响
+ double wavelengthMicrons = wavelength;
+ return 0.02735 * Math.Pow(wavelengthMicrons, -4.08) * (Pressure / 1013.25) * (288.15 / Temperature);
+ }
+
+ private double CalculateMieScattering(double wavelength)
+ {
+ // Mie散射系数计算(km^-1)
+ // 进一步增加 Mie 散射的影响
+ double beta = 3.91 / Visibility;
+ double alpha = 1.2 * Math.Pow(wavelength / 0.55, -1.3);
+ return beta * alpha * (AerosolDensity / STANDARD_AEROSOL_DENSITY) * 3.5; // 从2.0改为3.5
+ }
+
+ private double CalculateMolecularAbsorption(double wavelength)
+ {
+ // 分子吸收系数计算(km^-1)
+ double waterVaporAbsorption = CalculateWaterVaporAbsorption(wavelength);
+ double co2Absorption = CalculateCO2Absorption(wavelength);
+
+ return waterVaporAbsorption + co2Absorption;
+ }
+
+ private double CalculateWaterVaporAbsorption(double wavelength)
+ {
+ // 水汽吸收系数(km^-1)
+ // 进一步增加水汽吸收的影响
+ double waterVaporDensity = CalculateWaterVaporDensity();
+
+ if (wavelength >= 5.5 && wavelength <= 7.5)
+ return 2.4 * waterVaporDensity; // 从1.2改为2.4
+ else if (wavelength >= 2.5 && wavelength <= 3.5)
+ return 1.8 * waterVaporDensity; // 从0.9改为1.8
+ else
+ return 0.6 * waterVaporDensity; // 从0.3改为0.6
+ }
+
+ private double CalculateWaterVaporDensity()
+ {
+ // 使用Magnus公式计算饱和水汽压
+ double a = 17.27;
+ double b = 237.7;
+ double saturationVaporPressure = 6.112 * Math.Exp((a * (Temperature - 273.15)) / (b + (Temperature - 273.15)));
+
+ // 计算实际水汽压
+ double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure;
+
+ // 计算水汽密度 (g/m³)
+ return (actualVaporPressure * 2.16679) / Temperature;
+ }
+
+ private double CalculateCO2Absorption(double wavelength)
+ {
+ // CO2吸收系数(km^-1)
+ // 增加CO2吸收的影响
+ if (wavelength >= 4.2 && wavelength <= 4.4)
+ return 1.2 * (CO2Concentration / 400.0); // 从0.6改为1.2
+ else if (wavelength >= 14.0 && wavelength <= 16.0)
+ return 1.0 * (CO2Concentration / 400.0); // 从0.5改为1.0
+ else
+ return 0.16 * (CO2Concentration / 400.0); // 从0.08改为0.16
+ }
+
+ private double GetSpectralWeight(double wavelength)
+ {
+ // 调整权重分布
+ if (wavelength >= 3.0 && wavelength <= 5.0)
+ return 0.8; // 从1.0改为0.8
+ else if (wavelength >= 8.0 && wavelength <= 12.0)
+ return 0.6; // 从0.8改为0.6
+ else
+ return 0.2; // 从0.3改为0.2
+ }
+
+ private double CalculateWeatherEffect(double distance)
+ {
+ // 降低天气效应的影响
+ double rainEffect = CalculateRainAttenuation(distance, IR_WAVELENGTH) * 1.2; // 从1.5改为1.2
+ double snowEffect = CalculateSnowAttenuation(distance, IR_WAVELENGTH) * 1.2; // 从1.5改为1.2
+ double fogEffect = CalculateFogAttenuation(distance) * 1.5; // 从2.0改为1.5
+ double dustEffect = CalculateDustAttenuation(distance) * 1.5; // 从2.0改为1.5
+
+ return Math.Exp(-2.0 * (rainEffect + snowEffect + fogEffect + dustEffect)); // 从3.0改为2.0
}
- ///
- /// 计算雨对红外线的衰减系数K
- ///
- /// 波长(微米)
- /// 雨衰减系数K
protected override double CalculateRainKCoefficient(double wavelength)
{
if (wavelength >= 8 && wavelength <= 12)
@@ -47,18 +154,12 @@ namespace AirTransmission
}
else if (wavelength >= 3 && wavelength <= 5)
{
- // 对于中远红外波段(3-5μm)
+ // 对于中红外波段(3-5μm)
return 0.2656;
}
-
return 0;
}
- ///
- /// 计算雨对红外线的衰减系数α
- ///
- /// 波长(微米)
- /// 雨衰减系数α
protected override double CalculateRainAlphaCoefficient(double wavelength)
{
if (wavelength >= 8 && wavelength <= 12)
@@ -68,70 +169,22 @@ namespace AirTransmission
}
else if (wavelength >= 3 && wavelength <= 5)
{
- // 对于中远红外波段(3-5μm)
+ // 对于中红外波段(3-5μm)
return 0.7978;
}
-
return 0;
}
- ///
- /// 计算雪对红外线的衰减系数K
- ///
- /// 波长(微米)
- /// 雪衰减系数K
protected override double CalculateSnowKCoefficient(double wavelength)
{
return 0.365;
}
- ///
- /// 计算雪对红外线的衰减系数α
- ///
- /// 波长(微米)
- /// 雪衰减系数α
protected override double CalculateSnowAlphaCoefficient(double wavelength)
{
return 0.88;
}
- ///
- /// 计算红外线的总衰减因子
- ///
- /// 红外线总衰减因子
- private double CalculateIRAttenuationFactor()
- {
- double molecularFactor = CalculateIRMolecularFactor();
- double aerosolFactor = CalculateIRAerosolFactor();
- return molecularFactor + aerosolFactor;
- }
-
- ///
- /// 计算红外线的分子散射因子
- ///
- /// 红外线分子散射因子
- private double CalculateIRMolecularFactor()
- {
- // 对于10μm波长,分子散射可以忽略不计
- return 0.0001;
- }
-
- ///
- /// 计算红外线的气溶胶散射因子
- ///
- /// 红外线气溶胶散射因子
- private double CalculateIRAerosolFactor()
- {
- // 使用更适合IR的模型
- double beta = 0.0116 * Math.Pow(Visibility, -0.75);
- return beta;
- }
-
- ///
- /// 计算雾对红外线的衰减
- ///
- /// 传输路径长度(米)
- /// 雾对红外线的衰减
private double CalculateFogAttenuation(double pathLength)
{
if (!IsFoggy)
@@ -139,49 +192,7 @@ namespace AirTransmission
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
double beta = 3.91 / Visibility * Math.Pow(IR_WAVELENGTH / 0.55, -q);
- return beta * pathLength * 0.5;
- }
-
- ///
- /// 计算水蒸气对红外线的衰减
- ///
- /// 传输距离(米)
- /// 水蒸气对红外线的衰减
- private double CalculateWaterVaporAttenuation(double distance)
- {
- double waterVaporDensity = CalculateWaterVaporDensity();
- double absorptionCoefficient = 0.0005; // 这个值需要根据具体波长调整
- return absorptionCoefficient * waterVaporDensity * distance;
- }
-
- ///
- /// 计算水蒸气密度
- ///
- /// 水蒸气密度(g/m³)
- private double CalculateWaterVaporDensity()
- {
- // 使用Magnus公式计算饱和水汽压
- double a = 17.27;
- double b = 237.7;
- double saturationVaporPressure = 6.112 * Math.Exp((a * Temperature) / (b + Temperature));
-
- // 计算实际水汽压
- double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure;
-
- // 计算水汽密度 (g/m³)
- return (actualVaporPressure * 2.16679) / (Temperature + 273.15);
- }
-
- ///
- /// 计算二氧化碳对红外线的衰减
- ///
- /// 传输距离(米)
- /// 二氧化碳对红外线的衰减
- private double CalculateCO2Attenuation(double distance)
- {
- double co2Concentration = CO2Concentration; // ppm
- double absorptionCoefficient = 0.00001; // 这个值需要根据具体波长调整
- return absorptionCoefficient * (co2Concentration / 1000000) * distance;
+ return beta * pathLength * 1.0; // 从1.2改为1.0
}
}
}
diff --git a/AirTransmission/LaserTransmittanceModel.cs b/AirTransmission/LaserTransmittanceModel.cs
index 26bdeac..1f18137 100644
--- a/AirTransmission/LaserTransmittanceModel.cs
+++ b/AirTransmission/LaserTransmittanceModel.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
* 1.0.0 (2024-10-13): 初始版本,实现激光在大气中的传输特性计算,包括湍流效应。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
*/
namespace AirTransmission
@@ -110,7 +111,8 @@ namespace AirTransmission
double aerosolFactor = CalculateAerosolFactor();
double visibilityFactor = CalculateVisibilityFactor();
- return molecularFactor * aerosolFactor * visibilityFactor;
+ // 增加基础衰减
+ return molecularFactor * aerosolFactor * visibilityFactor * 1.2; // 增加1.2倍的基础衰减
}
///
@@ -119,7 +121,8 @@ namespace AirTransmission
/// 分子散射因子
private double CalculateMolecularFactor()
{
- return (Pressure / 1013.25) * (288.15 / Temperature);
+ // 增加分子散射的影响
+ return (Pressure / 1013.25) * (288.15 / Temperature) * 1.15; // 增加15%的分子散射
}
///
@@ -138,7 +141,8 @@ namespace AirTransmission
else
q = 0.585 * Math.Pow(1, 1.0/3.0);
- double aerosolFactor = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q);
+ // 增加气溶胶散射的影响
+ double aerosolFactor = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q) * 1.1; // 增加10%的气溶胶散射
if (Visibility < 5)
{
@@ -163,9 +167,10 @@ namespace AirTransmission
if (!IsFoggy)
return 0;
+ // 增加雾的衰减效应
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
double beta = 3.91 / Visibility * Math.Pow(LASER_WAVELENGTH / 0.55, -q);
- return beta * pathLength * 0.5;
+ return beta * pathLength * 1.2; // 从0.5改为1.2,增加雾的影响
}
///
diff --git a/AirTransmission/MillimeterWaveTransmittanceModel.cs b/AirTransmission/MillimeterWaveTransmittanceModel.cs
index b0d7296..07c7d6e 100644
--- a/AirTransmission/MillimeterWaveTransmittanceModel.cs
+++ b/AirTransmission/MillimeterWaveTransmittanceModel.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
- * 1.0.0 (2024-10-13): 初始版本,实现毫米波在大气中的传输特性计算,包括氧气和水蒸气的影响。作者:田建勇
+ * 1.0.0 (2024-10-13): 初始版本,实现毫米波在大气中的传输特性计算。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
*/
namespace AirTransmission
@@ -8,13 +9,15 @@ namespace AirTransmission
///
/// 毫米波传输模型类,用于计算毫米波在大气中的传输特性
///
- public class MillimeterWaveTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
+ public class MillimeterWaveTransmittanceModel : TransmittanceModel
{
///
/// 毫米波波长(毫米)
///
private const double MILLIMETER_WAVE_WAVELENGTH = 3.19; // 毫米(对应94 GHz)
+ public MillimeterWaveTransmittanceModel(WeatherCondition weather) : base(weather) { }
+
///
/// 计算给定距离的毫米波透过率
///
@@ -22,101 +25,120 @@ namespace AirTransmission
/// 毫米波透过率(0到1之间的值)
public override double CalculateTransmittance(double distance)
{
- double attenuationFactor = CalculateMillimeterWaveAttenuationFactor();
- double rainAttenuation = CalculateRainAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
- double fogAttenuation = CalculateMillimeterWaveFogAttenuation(distance);
- double snowAttenuation = CalculateSnowAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
- double transmittance = Math.Exp(-attenuationFactor * distance - rainAttenuation - fogAttenuation - snowAttenuation);
-
- return transmittance;
- }
-
- ///
- /// 计算雨对毫米波的衰减系数K
- ///
- /// 波长(毫米)
- /// 雨衰减系数K
- protected override double CalculateRainKCoefficient(double wavelength)
- {
- // 对应94 GHz毫米波
- return 0.926;
- }
-
- ///
- /// 计算雨对毫米波的衰减系数α
- ///
- /// 波长(毫米)
- /// 雨衰减系数α
- protected override double CalculateRainAlphaCoefficient(double wavelength)
- {
- // 对应94 GHz毫米波
- return 0.9551;
- }
-
- ///
- /// 计算雪对毫米波的衰减系数K
- ///
- /// 波长(毫米)
- /// 雪衰减系数K
- protected override double CalculateSnowKCoefficient(double wavelength)
- {
- return 0.997;
- }
-
- ///
- /// 计算雪对毫米波的衰减系数α
- ///
- /// 波长(毫米)
- /// 雪衰减系数α
- protected override double CalculateSnowAlphaCoefficient(double wavelength)
- {
- return 1.064;
- }
-
- ///
- /// 计算毫米波的总衰减因子
- ///
- /// 毫米波总衰减因子
- private double CalculateMillimeterWaveAttenuationFactor()
- {
- double oxygenAttenuation = CalculateOxygenAttenuation();
+ // 计算各种衰减机制
+ double molecularScattering = CalculateMolecularScattering();
+ double aerosolScattering = CalculateAerosolScattering();
double waterVaporAttenuation = CalculateWaterVaporAttenuation();
- return oxygenAttenuation + waterVaporAttenuation;
+ double oxygenAttenuation = CalculateOxygenAttenuation();
+
+ // 计算天气效应
+ double rainAttenuation = CalculateRainAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
+ double snowAttenuation = CalculateSnowAttenuation(distance, MILLIMETER_WAVE_WAVELENGTH);
+ double fogAttenuation = CalculateMillimeterWaveFogAttenuation(distance);
+
+ // 计算总衰减
+ double totalAttenuation = (molecularScattering + aerosolScattering + waterVaporAttenuation + oxygenAttenuation) * distance +
+ rainAttenuation + snowAttenuation + fogAttenuation;
+
+ // 计算透过率
+ double transmittance = Math.Exp(-totalAttenuation);
+
+ return Math.Max(0, Math.Min(1, transmittance));
}
///
- /// 计算氧气对毫米波的衰减
+ /// 计算分子散射系数
///
- /// 氧气衰减因子
- private double CalculateOxygenAttenuation()
+ /// 分子散射系数(km^-1)
+ private double CalculateMolecularScattering()
{
- double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15);
- return gamma * (Pressure / 1013.25);
+ // 分子散射系数计算(km^-1)
+ return 0.0015 * (Pressure / 1013.25) * (288.15 / Temperature) *
+ Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -4);
}
///
- /// 计算水蒸气对毫米波的衰减
+ /// 计算气溶胶散射系数
///
- /// 水蒸气衰减因子
+ /// 气溶胶散射系数(km^-1)
+ private double CalculateAerosolScattering()
+ {
+ // 气溶胶散射系数计算(km^-1)
+ double beta = 0.0434 * (AerosolDensity / STANDARD_AEROSOL_DENSITY);
+ return beta * Math.Pow(MILLIMETER_WAVE_WAVELENGTH / 3.0, -1.2);
+ }
+
+ ///
+ /// 计算水汽吸收系数
+ ///
+ /// 水汽吸收系数(km^-1)
private double CalculateWaterVaporAttenuation()
{
- double rho = Humidity * 0.01 * 6.11 * Math.Exp(17.27 * (Temperature - 273.15) / (Temperature - 35.85));
- return 0.05 * rho * (MILLIMETER_WAVE_WAVELENGTH / 100.0) * (Temperature / 293.15);
+ // 水汽吸收系数计算(km^-1)
+ double rho = CalculateWaterVaporDensity();
+ double pressureFactor = Math.Sqrt(Pressure / 1013.25);
+ return 0.05 * rho * (MILLIMETER_WAVE_WAVELENGTH / 100.0) * (Temperature / 293.15) * pressureFactor;
+ }
+
+ ///
+ /// 计算水汽密度
+ ///
+ /// 水汽密度(g/m³)
+ private double CalculateWaterVaporDensity()
+ {
+ // 使用Magnus公式计算水汽密度(g/m³)
+ double saturationVaporPressure = 6.112 * Math.Exp(17.27 * (Temperature - 273.15) / (Temperature - 35.85));
+ double actualVaporPressure = (Humidity / 100.0) * saturationVaporPressure;
+ return (actualVaporPressure * 2.16679) / Temperature;
+ }
+
+ ///
+ /// 计算氧气吸收系数
+ ///
+ /// 氧气吸收系数(km^-1)
+ private double CalculateOxygenAttenuation()
+ {
+ // 氧气吸收系数计算(km^-1)
+ double gamma = 0.01 * (MILLIMETER_WAVE_WAVELENGTH / 60.0) * (Temperature / 293.15);
+ return gamma * (Pressure / 1013.25);
}
///
/// 计算雾对毫米波的衰减
///
/// 传输路径长度(米)
- /// 雾对毫米波的衰减
+ /// 雾衰减
private double CalculateMillimeterWaveFogAttenuation(double pathLength)
{
if (!IsFoggy)
return 0;
- double liquidWaterDensity = 0.05; // 假设的液态水密度,单位:g/m³
+ // 雾的衰减计算
+ double liquidWaterDensity = 0.05 * (1 - Visibility / 10.0); // 根据能见度估算液态水含量
double specificAttenuation = 0.4 * MILLIMETER_WAVE_WAVELENGTH * liquidWaterDensity / 1000.0;
return specificAttenuation * pathLength;
}
+
+ protected override double CalculateRainKCoefficient(double wavelength)
+ {
+ // 对应94 GHz毫米波
+ return 0.926;
+ }
+
+ protected override double CalculateRainAlphaCoefficient(double wavelength)
+ {
+ // 对应94 GHz毫米波
+ return 0.9551;
+ }
+
+ protected override double CalculateSnowKCoefficient(double wavelength)
+ {
+ return 0.997;
+ }
+
+ protected override double CalculateSnowAlphaCoefficient(double wavelength)
+ {
+ return 1.064;
+ }
}
}
diff --git a/AirTransmission/TransmittanceModel.cs b/AirTransmission/TransmittanceModel.cs
index 856c2fb..8358fe3 100644
--- a/AirTransmission/TransmittanceModel.cs
+++ b/AirTransmission/TransmittanceModel.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
* 1.0.0 (2024-10-13): 初始版本,实现大气透过率模型的基类,包括各种天气条件下的衰减计算。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,考虑目标位置关系和大气参数分布。作者:田建勇
*/
namespace AirTransmission
diff --git a/AirTransmission/UVTransmittanceModel.cs b/AirTransmission/UVTransmittanceModel.cs
index 0a0f0fb..3b62392 100644
--- a/AirTransmission/UVTransmittanceModel.cs
+++ b/AirTransmission/UVTransmittanceModel.cs
@@ -1,6 +1,7 @@
/*
* 版本历史:
* 1.0.0 (2024-10-13): 初始版本,实现紫外线在大气中的传输特性计算。作者:田建勇
+ * 1.1.0 (2024-10-18): 改进版本,采用光谱模型法计算紫外线透过率。作者:田建勇
*/
namespace AirTransmission
@@ -8,126 +9,140 @@ namespace AirTransmission
///
/// 紫外线传输模型类,用于计算紫外线在大气中的传输特性
///
- public class UVTransmittanceModel(WeatherCondition weather) : TransmittanceModel(weather)
+ public class UVTransmittanceModel : TransmittanceModel
{
- ///
- /// 紫外线波长(微米)
- ///
- private const double UV_WAVELENGTH = 0.308; // 微米 (308 nm)
+ // 光谱分段参数
+ private const double MIN_WAVELENGTH = 0.2; // 紫外波段最小波长(微米)
+ private const double MAX_WAVELENGTH = 0.4; // 紫外波段最大波长(微米)
+ private const int SPECTRAL_BANDS = 100; // 光谱分段数
+ private const double UV_WAVELENGTH = 0.308; // 主要计算波长(微米)
+
+ public UVTransmittanceModel(WeatherCondition weather) : base(weather) { }
- ///
- /// 计算给定距离的紫外线透过率
- ///
- /// 传输距离(米)
- /// 紫外线透过率(0到1之间的值)
public override double CalculateTransmittance(double distance)
{
- double attenuationFactor = CalculateUVAttenuationFactor();
- double rainAttenuation = CalculateRainAttenuation(distance, UV_WAVELENGTH);
- double fogAttenuation = CalculateFogAttenuation(distance);
- double dustAttenuation = CalculateDustAttenuation(distance);
- double snowAttenuation = CalculateSnowAttenuation(distance, UV_WAVELENGTH);
+ // 将距离转换为千米
+ double distanceInKm = distance / 1000.0;
- double transmittance = Math.Pow(STANDARD_TRANSMITTANCE, attenuationFactor * distance) *
- Math.Exp(-rainAttenuation - fogAttenuation - dustAttenuation - snowAttenuation);
+ // 计算各种衰减机制的总和
+ double totalAttenuation = 0;
+ double wavelengthStep = (MAX_WAVELENGTH - MIN_WAVELENGTH) / SPECTRAL_BANDS;
- return Math.Max(0, Math.Min(1, transmittance));
+ for (int i = 0; i < SPECTRAL_BANDS; i++)
+ {
+ double wavelength = MIN_WAVELENGTH + i * wavelengthStep;
+ double bandAttenuation = CalculateBandAttenuation(wavelength);
+ double spectralWeight = GetSpectralWeight(wavelength);
+
+ totalAttenuation += bandAttenuation * spectralWeight;
+ }
+
+ // 计算基本透过率
+ double baseTransmittance = Math.Exp(-totalAttenuation * distanceInKm);
+
+ // 应用天气条件的影响
+ double weatherEffect = CalculateWeatherEffect(distance);
+ double finalTransmittance = baseTransmittance * weatherEffect;
+
+ return Math.Max(0, Math.Min(1, finalTransmittance));
+ }
+
+ private double CalculateBandAttenuation(double wavelength)
+ {
+ // 计算各种衰减机制
+ double rayleighScattering = CalculateRayleighScattering(wavelength);
+ double mieScattering = CalculateMieScattering(wavelength);
+ double molecularAbsorption = CalculateMolecularAbsorption(wavelength);
+
+ // 返回总衰减系数(km^-1)
+ return rayleighScattering + mieScattering + molecularAbsorption;
+ }
+
+ private double CalculateRayleighScattering(double wavelength)
+ {
+ // Rayleigh散射系数计算(km^-1)
+ double wavelengthMicrons = wavelength;
+ return 0.008735 * Math.Pow(wavelengthMicrons, -4.08) * (Pressure / 1013.25) * (288.15 / Temperature);
+ }
+
+ private double CalculateMieScattering(double wavelength)
+ {
+ // Mie散射系数计算(km^-1)
+ double beta = 3.91 / Visibility;
+ double alpha = 1.2 * Math.Pow(wavelength / 0.55, -1.3);
+ return beta * alpha * (AerosolDensity / STANDARD_AEROSOL_DENSITY);
+ }
+
+ private double CalculateMolecularAbsorption(double wavelength)
+ {
+ // 分子吸收系数计算(km^-1)
+ double o2Absorption = CalculateO2Absorption(wavelength);
+ double o3Absorption = CalculateO3Absorption(wavelength);
+
+ return o2Absorption + o3Absorption;
+ }
+
+ private double CalculateO2Absorption(double wavelength)
+ {
+ // O₂吸收系数(km^-1)
+ if (wavelength < 0.25)
+ return 0.5;
+ return 0.1;
+ }
+
+ private double CalculateO3Absorption(double wavelength)
+ {
+ // O₃吸收系数(km^-1)
+ if (wavelength >= 0.2 && wavelength <= 0.3)
+ return 0.8;
+ return 0.2;
+ }
+
+ private double GetSpectralWeight(double wavelength)
+ {
+ // 调整光谱权重分布
+ if (wavelength >= 0.28 && wavelength <= 0.32)
+ return 1.0;
+ else if (wavelength > 0.32 && wavelength <= 0.38)
+ return 0.6;
+ return 0.3;
+ }
+
+ private double CalculateWeatherEffect(double distance)
+ {
+ // 增加天气效应的影响
+ double rainEffect = CalculateRainAttenuation(distance, UV_WAVELENGTH) * 0.8;
+ double snowEffect = CalculateSnowAttenuation(distance, UV_WAVELENGTH) * 0.8;
+ double fogEffect = CalculateFogAttenuation(distance) * 0.6;
+ double dustEffect = CalculateDustAttenuation(distance) * 0.6;
+
+ return Math.Exp(-rainEffect - snowEffect - fogEffect - dustEffect);
}
- ///
- /// 计算雨对紫外线的衰减系数K
- ///
- /// 波长(微米)
- /// 雨衰减系数K
protected override double CalculateRainKCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.4715;
}
- ///
- /// 计算雨对紫外线的衰减系数α
- ///
- /// 波长(微米)
- /// 雨衰减系数α
protected override double CalculateRainAlphaCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.6296;
}
- ///
- /// 计算雪对紫外线的衰减系数K
- ///
- /// 波长(微米)
- /// 雪衰减系数K
protected override double CalculateSnowKCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.5225;
}
- ///
- /// 计算雪对紫外线的衰减系数α
- ///
- /// 波长(微米)
- /// 雪衰减系数α
protected override double CalculateSnowAlphaCoefficient(double wavelength)
{
// 对于UV波段 (308 nm)
return 0.7937;
}
- ///
- /// 计算紫外线的总衰减因子
- ///
- /// 紫外线总衰减因子
- private double CalculateUVAttenuationFactor()
- {
- double molecularFactor = CalculateUVMolecularFactor();
- double aerosolFactor = CalculateUVAerosolFactor();
- double visibilityFactor = CalculateVisibilityFactor();
-
- return molecularFactor * aerosolFactor * visibilityFactor;
- }
-
- ///
- /// 计算紫外线的分子散射因子
- ///
- /// 紫外线分子散射因子
- private double CalculateUVMolecularFactor()
- {
- // UV分子散射比可见光更强
- return (Pressure / 1013.25) * (288.15 / Temperature) * 2.0;
- }
-
- ///
- /// 计算紫外线的气溶胶散射因子
- ///
- /// 紫外线气溶胶散射因子
- private double CalculateUVAerosolFactor()
- {
- double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
- double aerosolFactor = 3.91 / Visibility * Math.Pow(UV_WAVELENGTH / 0.55, -q);
-
- if (Visibility < 5)
- {
- aerosolFactor *= (1 + (5 - Visibility) / 5);
- }
-
- if (IsDusty)
- {
- aerosolFactor *= 1.5;
- }
-
- return Math.Max(1, aerosolFactor);
- }
-
- ///
- /// 计算雾对紫外线的衰减
- ///
- /// 传输路径长度(米)
- /// 雾对紫外线的衰减
private double CalculateFogAttenuation(double pathLength)
{
if (!IsFoggy)
@@ -135,7 +150,7 @@ namespace AirTransmission
double q = 0.585 * Math.Pow(Visibility, 1.0/3.0);
double beta = 3.91 / Visibility * Math.Pow(UV_WAVELENGTH / 0.55, -q);
- return beta * pathLength * 0.7; // UV在雾中的衰减可能比可见光更强
+ return beta * pathLength * 0.2;
}
}
}