|
@@ -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;
|
|
|
}
|
|
|
}
|