InverterPowerAnalysis.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package com.gyee.power.fitting.dispersionanalysis;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.*;
  5. public class InverterPowerAnalysis {
  6. public static void main(String[] args) {
  7. List<InverterData> inverterDataList = generateInverterData();
  8. // 使用Map来存储每个逆变器的历史功率数据
  9. Map<String, List<Double>> historicalPowerData = new HashMap<>();
  10. for (InverterData inverterData : inverterDataList) {
  11. String inverterId = inverterData.getInverterId();
  12. double outputPower = inverterData.getOutputPower();
  13. // 更新历史功率数据
  14. historicalPowerData.computeIfAbsent(inverterId, k -> new ArrayList<>()).add(outputPower);
  15. // 更新历史数据并进行分析
  16. analyzeInverterPerformance(historicalPowerData, inverterId);
  17. }
  18. // 将数据存储到CSV文件
  19. saveDataToCSV(historicalPowerData, "historical_power_data.csv");
  20. }
  21. // 模拟生成逆变器数据
  22. private static List<InverterData> generateInverterData() {
  23. List<InverterData> data = new ArrayList<>();
  24. Random rand = new Random();
  25. for (int i = 1; i <= 10; i++) {
  26. String inverterId = "Inverter" + i;
  27. long timestamp = System.currentTimeMillis();
  28. double outputPower = rand.nextDouble() * 1000;
  29. double lightIntensity = rand.nextDouble() * 1000;
  30. data.add(new InverterData(inverterId, timestamp, outputPower, lightIntensity));
  31. }
  32. return data;
  33. }
  34. // 分析逆变器性能,包括计算离散率和平均功率
  35. private static void analyzeInverterPerformance(Map<String, List<Double>> historicalPowerData, String inverterId) {
  36. List<Double> powerData = historicalPowerData.get(inverterId);
  37. // 计算平均功率
  38. double averagePower = calculateAveragePower(powerData);
  39. // 计算功率离散率
  40. double powerDeviation = calculatePowerDeviation(powerData, averagePower);
  41. // 分析逆变器状态
  42. String inverterStatus = analyzeInverterStatus(powerDeviation, averagePower);
  43. System.out.println("逆变器ID: " + inverterId + ",离散率: " + powerDeviation + ",平均功率: " + averagePower + ",状态: " + inverterStatus);
  44. }
  45. // 计算功率离散率
  46. private static double calculatePowerDeviation(List<Double> powerData, double averagePower) {
  47. double sum = 0.0;
  48. // 计算标准差
  49. for (Double power : powerData) {
  50. sum += Math.pow(power - averagePower, 2);
  51. }
  52. return Math.sqrt(sum / powerData.size());
  53. }
  54. // 计算平均功率
  55. private static double calculateAveragePower(List<Double> powerData) {
  56. double sum = 0.0;
  57. for (Double power : powerData) {
  58. sum += power;
  59. }
  60. return sum / powerData.size();
  61. }
  62. // 根据复杂规则分析逆变器状态
  63. private static String analyzeInverterStatus(double powerDeviation, double averagePower) {
  64. if (powerDeviation < 0.1 && averagePower > 800) {
  65. return "运行稳定";
  66. } else if (powerDeviation < 0.2 && averagePower > 600) {
  67. return "运行良好";
  68. } else if (powerDeviation < 0.3 && averagePower > 400) {
  69. return "运行水平有待提高";
  70. } else {
  71. return "必须整改";
  72. }
  73. }
  74. // 将数据存储到CSV文件
  75. private static void saveDataToCSV(Map<String, List<Double>> historicalPowerData, String fileName) {
  76. try {
  77. FileWriter writer = new FileWriter(fileName);
  78. writer.append("InverterId,PowerData\n");
  79. for (Map.Entry<String, List<Double>> entry : historicalPowerData.entrySet()) {
  80. String inverterId = entry.getKey();
  81. List<Double> powerData = entry.getValue();
  82. StringBuilder powerDataStr = new StringBuilder();
  83. for (Double power : powerData) {
  84. powerDataStr.append(power).append(",");
  85. }
  86. writer.append(inverterId).append(",").append(powerDataStr.toString()).append("\n");
  87. }
  88. writer.flush();
  89. writer.close();
  90. System.out.println("数据已保存到 " + fileName);
  91. } catch (IOException e) {
  92. e.printStackTrace();
  93. }
  94. }
  95. }