InverterPowerAnalysis2.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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.web.bind.annotation.*;
  10. import javax.annotation.Resource;
  11. import java.io.FileWriter;
  12. import java.io.IOException;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.Random;
  17. import java.util.stream.Collectors;
  18. //逆变器单位装机输出功率离散率分析
  19. @CrossOrigin
  20. @RequestMapping("/discreteness")
  21. @RestController
  22. public class InverterPowerAnalysis2 {
  23. @Resource
  24. private IvPvCurveFittingService curveFittingService;
  25. @Resource
  26. private PolynomialCurveFitting pncf;
  27. // 模拟生成逆变器数据
  28. private static List<InverterData> generateInverterData() {
  29. List<InverterData> data = new ArrayList<>();
  30. Random rand = new Random();
  31. for (int i = 1; i <= 10; i++) {
  32. String inverterId = "Inverter" + i;
  33. long timestamp = System.currentTimeMillis();
  34. double outputPower = rand.nextDouble() * 1000;
  35. double lightIntensity = rand.nextDouble() * 1000;
  36. data.add(new InverterData(inverterId, timestamp, outputPower, lightIntensity));
  37. }
  38. return data;
  39. }
  40. // 计算平均功率
  41. private static double calculateAveragePower(List<Double> powerData) {
  42. double sum = 0.0;
  43. for (Double power : powerData) {
  44. sum += power;
  45. }
  46. return sum / powerData.size();
  47. }
  48. // 根据复杂规则分析逆变器状态
  49. private static String analyzeInverterStatus(double powerDeviation, double averagePower) {
  50. if (powerDeviation < 0.1 && averagePower > 800) {
  51. return "运行稳定";
  52. } else if (powerDeviation < 0.2 && averagePower > 600) {
  53. return "运行良好";
  54. } else if (powerDeviation < 0.3 && averagePower > 400) {
  55. return "运行水平有待提高";
  56. } else {
  57. return "必须整改";
  58. }
  59. }
  60. // 将数据存储到CSV文件
  61. private static void saveDataToCSV(Map<String, List<Double>> historicalPowerData, String fileName) {
  62. try {
  63. FileWriter writer = new FileWriter(fileName);
  64. writer.append("InverterId,PowerData\n");
  65. for (Map.Entry<String, List<Double>> entry : historicalPowerData.entrySet()) {
  66. String inverterId = entry.getKey();
  67. List<Double> powerData = entry.getValue();
  68. StringBuilder powerDataStr = new StringBuilder();
  69. for (Double power : powerData) {
  70. powerDataStr.append(power).append(",");
  71. }
  72. writer.append(inverterId).append(",").append(powerDataStr.toString()).append("\n");
  73. }
  74. writer.flush();
  75. writer.close();
  76. System.out.println("数据已保存到 " + fileName);
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. }
  81. @GetMapping("/rate")
  82. private JSONObject getFileList(
  83. @RequestParam(value = "station", required = true) String station,
  84. @RequestParam(value = "inverters", required = false) List<String> inverters,
  85. @RequestParam(value = "startdate", required = true) long startdate,
  86. @RequestParam(value = "interval", required = false) Integer interval,
  87. @RequestParam(value = "enddate", required = true) long enddate) {
  88. Map<String, List<PhotovoltaicInfo>> datasInfos = curveFittingService.getDatas2File1(station, startdate, enddate, interval);
  89. /*List<PhotovoltaicInfo> infos = new ArrayList<>();
  90. //单台拟合
  91. if (inverters.size() == 1) {
  92. infos = datasInfos.get(inverters.get(0));
  93. //多台拟合
  94. } else if (inverters.size() > 1) {
  95. infos = inverters.stream().flatMap(inverter -> datasInfos.get(inverter).stream()).collect(Collectors.toList());
  96. //全场拟合
  97. } else {
  98. infos = datasInfos.values().stream().flatMap(List::stream).collect(Collectors.toList());
  99. }*/
  100. List<InverterData2> inverterData2s = new ArrayList<>();
  101. datasInfos.forEach((k, v) -> {
  102. WeightedObservedPoints points = new WeightedObservedPoints();
  103. for (PhotovoltaicInfo info : v) {
  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. inverterData2s.add(analyzeInverterPerformance(v, run, k));
  111. });
  112. return JsonResult.successData(ResultCode.SUCCESS, inverterData2s);
  113. }
  114. // 分析逆变器性能,包括计算离散率和平均功率
  115. private InverterData2 analyzeInverterPerformance(List<PhotovoltaicInfo> infos, double[] run, String inverterId) {
  116. List<Double> collect = infos.stream().map(info -> info.getS()).collect(Collectors.toList());
  117. // 计算功率离散率
  118. double powerDeviation = calculatePowerDeviation(collect, run);
  119. // 计算平均功率
  120. double averagePower = calculateAveragePower(collect);
  121. // 分析逆变器状态
  122. String inverterStatus = analyzeInverterStatus(powerDeviation, averagePower);
  123. return new InverterData2(inverterId, powerDeviation, averagePower, inverterStatus, "离散率");
  124. }
  125. // 计算功率离散率
  126. private double calculatePowerDeviation(List<Double> powerData, double[] run) {
  127. double sum = 0.0;
  128. // 计算标准差
  129. for (Double power : powerData) {
  130. sum += Math.pow(power - pncf.calcPoly(power, run), 2);
  131. }
  132. return Math.sqrt(sum / powerData.size());
  133. }
  134. }