xushili 1 rok pred
rodič
commit
078653fd7f

+ 39 - 11
power-fitting-JN/src/main/java/com.gyee.power.fitting/dispersionanalysis/InverterPowerAnalysis2.java

@@ -5,6 +5,7 @@ import com.gyee.power.fitting.common.alg.PolynomialCurveFitting;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
 import com.gyee.power.fitting.model.custom.PhotovoltaicInfo;
+import com.gyee.power.fitting.model.custom.TsDoubleData;
 import com.gyee.power.fitting.service.impl.IvPvCurveFittingService;
 import org.apache.commons.math3.fitting.WeightedObservedPoints;
 import org.springframework.stereotype.Component;
@@ -12,9 +13,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 //逆变器单位装机输出功率离散率分析
@@ -118,23 +117,52 @@ public class InverterPowerAnalysis2 {
     }
 
     // 计算功率离散率
-    public double calcPowerDeviation(List<PhotovoltaicInfo> infos, double averagePower) {
+    public double calcPowerDeviation(List<TsDoubleData> gzqd, List<TsDoubleData> yggl, double averagePower, long startTime, long endTime) {
+        List<TsDoubleData> S = dataCompletion(gzqd, startTime, endTime);
+        List<TsDoubleData> P = dataCompletion(yggl, startTime, endTime);
         WeightedObservedPoints points = new WeightedObservedPoints();
-        for (PhotovoltaicInfo info : infos) {
-            if (info.getS() < 1) {
+        double s, p;
+        for (int i = 0; i < S.size(); i++) {
+            s = S.get(i).getDoubleValue();
+            p = P.get(i).getDoubleValue();
+            if (s < 1 || p < 1) {
                 points.add(0, 0);
             }
-            points.add(info.getS(), info.getActualP());
+            points.add(s, p);
         }
 
         double[] run = pncf.run(points);
 
         double sum = 0.0, power;
         // 计算标准差
-        for (PhotovoltaicInfo info : infos) {
-            power = info.getActualP();
-            sum += Math.pow(power - pncf.calcPoly(power, run), 2);
+        for (int i = 0; i < S.size(); i++) {
+            s = S.get(i).getDoubleValue();
+            p = P.get(i).getDoubleValue();
+            sum += Math.pow(p - pncf.calcPoly(s, run), 2);
+        }
+        return Math.sqrt(sum / S.size());
+    }
+
+    private List<TsDoubleData> dataCompletion(List<TsDoubleData> gzqd, long startTime, long endTime) {
+        Collections.sort(gzqd, Comparator.comparing(TsDoubleData::getTs));
+        List<TsDoubleData> result = new ArrayList<>();
+        double last = gzqd.get(0).getDoubleValue();
+        int j = 0;
+        long ts;
+        for (long i = startTime; i < endTime; i += 1000) {
+            ts = gzqd.get(j).getTs();
+            if (ts > startTime) {
+                result.add(new TsDoubleData(startTime, last));
+            } else if (ts == startTime) {
+                result.add(new TsDoubleData(startTime, gzqd.get(j).getDoubleValue()));
+                j++;
+                last = gzqd.get(j).getDoubleValue();
+            } else {
+                result.add(new TsDoubleData(startTime, gzqd.get(j).getDoubleValue()));
+                j++;
+                last = gzqd.get(j).getDoubleValue();
+            }
         }
-        return Math.sqrt(sum / infos.size());
+        return result;
     }
 }