InverterPowerAnalysis2.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package com.gyee.power.fitting.dispersionanalysis;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.gyee.power.fitting.common.alg.PolynomialCurveFitting;
  4. import com.gyee.power.fitting.common.result.JsonResult;
  5. import com.gyee.power.fitting.common.result.ResultCode;
  6. import com.gyee.power.fitting.model.custom.PhotovoltaicInfo;
  7. import com.gyee.power.fitting.service.impl.IvPvCurveFittingService;
  8. import org.apache.commons.math3.fitting.WeightedObservedPoints;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.web.bind.annotation.GetMapping;
  11. import org.springframework.web.bind.annotation.RequestParam;
  12. import javax.annotation.Resource;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.stream.Collectors;
  17. //逆变器单位装机输出功率离散率分析
  18. //@CrossOrigin
  19. //@RequestMapping("/discreteness")
  20. //@RestController
  21. @Component
  22. public class InverterPowerAnalysis2 {
  23. @Resource
  24. private IvPvCurveFittingService curveFittingService;
  25. @Resource
  26. private PolynomialCurveFitting pncf;
  27. // 计算平均功率
  28. public double calculateAveragePower(List<Double> powerData) {
  29. double sum = 0.0;
  30. for (Double power : powerData) {
  31. sum += power;
  32. }
  33. return sum / powerData.size();
  34. }
  35. // 根据复杂规则分析逆变器状态
  36. public String analyzeInverterStatus(double powerDeviation, double averagePower) {
  37. if (powerDeviation < 0.1 && averagePower > 800) {
  38. return "运行稳定";
  39. } else if (powerDeviation < 0.2 && averagePower > 600) {
  40. return "运行良好";
  41. } else if (powerDeviation < 0.3 && averagePower > 400) {
  42. return "运行水平有待提高";
  43. } else {
  44. return "必须整改";
  45. }
  46. }
  47. @GetMapping("/rate")
  48. private JSONObject getFileList(
  49. @RequestParam(value = "station", required = true) String station,
  50. @RequestParam(value = "inverters", required = false) List<String> inverters,
  51. @RequestParam(value = "startdate", required = true) long startdate,
  52. @RequestParam(value = "interval", required = false) Integer interval,
  53. @RequestParam(value = "enddate", required = true) long enddate) {
  54. Map<String, List<PhotovoltaicInfo>> datasInfos = curveFittingService.getDatas2File1(station, startdate, enddate, interval);
  55. /*List<PhotovoltaicInfo> infos = new ArrayList<>();
  56. //单台拟合
  57. if (inverters.size() == 1) {
  58. infos = datasInfos.get(inverters.get(0));
  59. //多台拟合
  60. } else if (inverters.size() > 1) {
  61. infos = inverters.stream().flatMap(inverter -> datasInfos.get(inverter).stream()).collect(Collectors.toList());
  62. //全场拟合
  63. } else {
  64. infos = datasInfos.values().stream().flatMap(List::stream).collect(Collectors.toList());
  65. }*/
  66. List<InverterData2> inverterData2s = new ArrayList<>();
  67. datasInfos.forEach((k, v) -> {
  68. WeightedObservedPoints points = new WeightedObservedPoints();
  69. for (PhotovoltaicInfo info : v) {
  70. if (info.getS() < 1) {
  71. points.add(0, 0);
  72. }
  73. points.add(info.getS(), info.getActualP());
  74. }
  75. double[] run = pncf.run(points);
  76. inverterData2s.add(analyzeInverterPerformance(v, run, k));
  77. });
  78. return JsonResult.successData(ResultCode.SUCCESS, inverterData2s);
  79. }
  80. // 分析逆变器性能,包括计算离散率和平均功率
  81. public InverterData2 analyzeInverterPerformance(List<PhotovoltaicInfo> infos, double[] run, String inverterId) {
  82. List<Double> collect = infos.stream().map(info -> info.getS()).collect(Collectors.toList());
  83. // 计算功率离散率
  84. double powerDeviation = calculatePowerDeviation(collect, run);
  85. // 计算平均功率
  86. double averagePower = calculateAveragePower(collect);
  87. // 分析逆变器状态
  88. String inverterStatus = analyzeInverterStatus(powerDeviation, averagePower);
  89. return new InverterData2(inverterId, powerDeviation, averagePower, inverterStatus, "离散率");
  90. }
  91. // 计算功率离散率
  92. private double calculatePowerDeviation(List<Double> powerData, double[] run) {
  93. double sum = 0.0;
  94. // 计算标准差
  95. for (Double power : powerData) {
  96. sum += Math.pow(power - pncf.calcPoly(power, run), 2);
  97. }
  98. return Math.sqrt(sum / powerData.size());
  99. }
  100. // 计算功率离散率
  101. public double calcPowerDeviation(List<PhotovoltaicInfo> infos, double averagePower) {
  102. WeightedObservedPoints points = new WeightedObservedPoints();
  103. for (PhotovoltaicInfo info : infos) {
  104. if (info.getS() < 1) {
  105. points.add(0, 0);
  106. }
  107. points.add(info.getS(), info.getActualP());
  108. }
  109. double[] run = pncf.run(points);
  110. double sum = 0.0, power;
  111. // 计算标准差
  112. for (PhotovoltaicInfo info : infos) {
  113. power = info.getActualP();
  114. sum += Math.pow(power - pncf.calcPoly(power, run), 2);
  115. }
  116. return Math.sqrt(sum / infos.size());
  117. }
  118. }