SurvivalTimeModel.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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)
  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. //定义NC文件中读取不到的坐标点海洋数据信息(后续可采用插值法等)
  21. //经度连续化
  22. for (int i = 0; i < 9; i++)
  23. {
  24. if (longitude >= longitudeArray[i] && longitude < longitudeArray[i + 1])
  25. {
  26. longitude = longitudeArray[i];
  27. longitudeNum = i;
  28. }
  29. }
  30. //纬度连续化
  31. for (int i = 0; i < 6; i++)
  32. {
  33. if (latitude >= latitudeArray[i] && latitude < latitudeArray[i + 1])
  34. {
  35. latitude = latitudeArray[i];
  36. latitudeNum = i;
  37. }
  38. }
  39. //时间连续化
  40. for (int i = 0; i < 23; i++)
  41. {
  42. if (time >= (i * 3600) && time < ((i + 1) * 3600))
  43. {
  44. timeNum = i;
  45. }
  46. }
  47. double temp = (double)tempArray[timeNum][ latitudeNum][ longitudeNum]; //得到该坐标和时间下的温度
  48. double time1 = 1.2860 * Math.Exp(0.1604 * temp);
  49. double time2 = 1.0201 * Math.Exp(0.1277 * temp);
  50. double time3 = 0.5892 * Math.Exp(0.1246 * temp);
  51. // 生成符合正态分布的随机样本
  52. Random rand = new Random();
  53. double mu = (time1 + time3) / 2; // 平均值
  54. double sigma = (time3 - time1) / 6; // 标准差(假设曲线1和曲线3的幸存时间分布接近对称,因此标准差为幅度的六分之一)
  55. double survivalTime = NormalDistributionRandom(rand, mu, sigma); //计算该温度下的幸存时间
  56. return survivalTime;
  57. }
  58. // 生成符合正态分布的随机数
  59. public static double NormalDistributionRandom(Random rand, double mu, double sigma)
  60. {
  61. double u1 = 1.0 - rand.NextDouble(); // uniform(0,1] random doubles
  62. double u2 = 1.0 - rand.NextDouble();
  63. double normalRandom = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); // random normal(0,1)
  64. return mu + sigma * normalRandom; // random normal(mean,stdDev^2)
  65. }
  66. }