SurvivalTimeModel.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. namespace SimulationCommon;
  2. public class tempNCread
  3. {
  4. public float[] longitudeArray = new float[10];//经度一维数组来源自文件'Text_readNC.cs'
  5. public float[] latitudeArray = new float[7];//纬度一维数组来源自文件'Text_readNC.cs'
  6. public float[][][] tempArray ;//温度三维数组来源自文件'temp_readNC.cs'
  7. }
  8. public class SurvivalTimeModel
  9. {
  10. //得到在某经纬度、任务运行时间下的落水人员幸存时间
  11. public static double SurvivalTime(tempNCread tempNCread, double latitude, double longitude, double time, int times, int latitudes, int longitudes, int days, int hour)
  12. //time表示任务执行时间,单位:秒,后续可以转换单位
  13. {
  14. int latitudeNum = 0;
  15. int longitudeNum = 0;
  16. int timeNum = 0;
  17. float[] longitudeArray = tempNCread.longitudeArray; //经度一维数组来源自文件'Text_readNC.cs'
  18. float[] latitudeArray = tempNCread.latitudeArray; //纬度一维数组来源自文件'Text_readNC.cs'
  19. float[][][] tempArray = tempNCread.tempArray;
  20. foreach (var item in tempArray)
  21. {
  22. foreach (var item1 in item)
  23. {
  24. for (int i = 0; i < item1.Length; i++)
  25. {
  26. if (item1[i] > 60)
  27. {
  28. int index = i;
  29. while (item1[index] > 60 && index < item1.Length) {
  30. index++;
  31. }
  32. if(index < item1.Length)
  33. {
  34. item1[i] = item1[index];
  35. }
  36. else
  37. {
  38. index--;
  39. while (item1[index] > 60 && index >= 0)
  40. {
  41. index--;
  42. }
  43. item1[i] = item1[index];
  44. }
  45. }
  46. }
  47. }
  48. }
  49. //定义NC文件中读取不到的坐标点海洋数据信息(后续可采用插值法等)
  50. //经度连续化
  51. for (int i = 0; i < longitudes - 1; i++)
  52. {
  53. if (longitude >= longitudeArray[i] && longitude < longitudeArray[i + 1])
  54. {
  55. longitude = longitudeArray[i];
  56. longitudeNum = i;
  57. }
  58. }
  59. //纬度连续化
  60. for (int i = 0; i < latitudes - 1; i++)
  61. {
  62. if (latitude >= latitudeArray[i] && latitude < latitudeArray[i + 1])
  63. {
  64. latitude = latitudeArray[i];
  65. latitudeNum = i;
  66. }
  67. }
  68. //时间连续化
  69. for (int i = 0; i < times - 1; i++)
  70. {
  71. if (time >= (i * 3600) && time < ((i + 1) * 3600))
  72. {
  73. timeNum = i;
  74. }
  75. }
  76. timeNum += (days - 1) * 24 + hour;
  77. double temp = (double)tempArray[timeNum][ latitudeNum][ longitudeNum]; //得到该坐标和时间下的温度
  78. double time1 = 1.2860 * Math.Exp(0.1604 * temp);
  79. double time2 = 1.0201 * Math.Exp(0.1277 * temp);
  80. double time3 = 0.5892 * Math.Exp(0.1246 * temp);
  81. // 生成符合正态分布的随机样本
  82. Random rand = new Random();
  83. double mu = (time1 + time3) / 2; // 平均值
  84. double sigma = (time3 - time1) / 6; // 标准差(假设曲线1和曲线3的幸存时间分布接近对称,因此标准差为幅度的六分之一)
  85. double survivalTime = NormalDistributionRandom(rand, mu, sigma); //计算该温度下的幸存时间
  86. return survivalTime;
  87. }
  88. // 生成符合正态分布的随机数
  89. public static double NormalDistributionRandom(Random rand, double mu, double sigma)
  90. {
  91. double u1 = 1.0 - rand.NextDouble(); // uniform(0,1] random doubles
  92. double u2 = 1.0 - rand.NextDouble();
  93. double normalRandom = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); // random normal(0,1)
  94. return mu + sigma * normalRandom; // random normal(mean,stdDev^2)
  95. }
  96. }