using IStation.Curve;
|
using MathNet.Numerics.LinearAlgebra;
|
using MathNet.Numerics.LinearAlgebra.Double;
|
using System.IO;
|
using System.Text;
|
using Yw.Untity;
|
|
namespace IStation.Win.Schedule
|
{
|
public partial class bjMain : DevExpress.XtraBars.Ribbon.RibbonForm
|
{
|
public bjMain()
|
{
|
InitializeComponent();
|
|
this.gridViewS1.SetNormalView();
|
this.gridViewS2.SetNormalView();
|
this.Load += FrmMain_Load;
|
|
this.colStation.Visible = false;
|
this.colStation1.Visible = false;
|
|
this.colTargetFrequency.Visible = true;
|
this.colTargetFrequency1.Visible = true;
|
this.colBeforeFlow.Visible = false;
|
|
this.colBeforeWL.Visible = false;
|
this.colBeforeWL1.Visible = false;
|
|
}
|
|
|
private static readonly IStation.Service.AnalysisParameter _service_analysis_parameter = new();
|
private static readonly IStation.Service.Station _service_station = new();
|
private static readonly IStation.Service.ScheduleConfig _service_schedule_config = new();
|
private static readonly IStation.Service.ScheduleRequest _service_schedule_request = new();
|
private static readonly IStation.Service.ScheduleConclusion _service_schedule_conclusion = new();
|
private static readonly IStation.Service.ScheduleScada _service_schedule_scada = new();
|
private static readonly IStation.Service.SchedulePump _service_schedule_pump = new();
|
|
private static readonly IStation.Service.MonitorRecord _service_monitor_record = new();
|
private static readonly Service.AnalysisDeviation _service_analysis_deviation = new();
|
|
private long _last_request_id = 0;
|
private bool _use_debug_scada = true;
|
|
private List<StationScheduleVm> _station_schedule_vm_list = null;
|
private List<PumpScheduleVm> _pump_schedule_vm_list1 = null;
|
private List<PumpScheduleVm> _pump_schedule_vm_list2 = null;
|
|
private List<Model.Pump> _pump_list1 = new();
|
private List<Model.Pump> _pump_list2 = new();
|
|
private List<Model.ScheduleRequest> _schedule_request_list = null;
|
private Dictionary<DateTime, List<Model.MonitorRecord>> _monitor_record_dict = null;
|
private Model.ScheduleRequest _schedule_request = null;
|
|
|
private void FrmMain_Load(object sender, EventArgs e)
|
{
|
IStation.Settings.ParasHelper.DataBase.SQLite.AnalysisConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\analysis.db";
|
IStation.Settings.ParasHelper.DataBase.SQLite.ScheduleConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\schedule.db";
|
IStation.Settings.ParasHelper.DataBase.SQLite.HydraulicConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\hydraulic.db";
|
IStation.Settings.ParasHelper.DataBase.SQLite.MonitorConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\monitor.db";
|
IStation.Settings.ParasHelper.Save();
|
_pump_list1 = new IStation.Service.Station().Get().Station1;
|
_pump_list2 = new IStation.Service.Station().Get().Station2;
|
IStation.Service.AnalysisParameter.GetDictCache();
|
var request_list = _service_schedule_request.GetAll();
|
|
Start();
|
}
|
|
|
private void Start()
|
{
|
this.repImgDate.Items.Clear();
|
this.repImgCmbRealTime.Items.Clear();
|
_schedule_request = null;
|
_monitor_record_dict = null;
|
_schedule_request_list = _service_schedule_request.GetAll();
|
if (_schedule_request_list == null)
|
{
|
return;
|
}
|
var deline = new DateTime(2024,12,1);
|
var deline2 = new DateTime(2025,1,1);
|
var time_list = _schedule_request_list.Where(x=>x.ReceptionTime>=deline&&x.ReceptionTime<= deline2).Select(x => x.ReceptionTime).OrderBy(x => x).ToList();
|
|
foreach (var item in time_list)
|
{
|
this.repImgDate.Items.Add(item.ToString("G"), item, -1);
|
}
|
var monitor_record_list = _service_monitor_record.GetByReceiptTimeRange(deline, deline2);
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
{
|
return;
|
}
|
_monitor_record_dict = monitor_record_list?.GroupBy(x => x.ReceiptTime).ToDictionary(x => x.Key, y => y.ToList());
|
|
}
|
|
private void Schedule(Model.ScheduleRequest request)
|
{
|
if (request == null)
|
{
|
Reset();
|
return;
|
}
|
|
var request_id = request.ID;
|
var scada_list = _service_schedule_scada.GetByRequestID(request_id);
|
var monitor_record_list = scada_list.Select(x => new Model.MonitorRecord()
|
{
|
DataTime = x.DataTime,
|
DataCode = x.DataCode,
|
DataValue = x.DataValue,
|
ReceiptTime = x.ReceiptTime,
|
}).ToList();
|
|
List<Model.ScheduleConclusion> conclusion_list = null;
|
List<Model.SchedulePump> pump_list = null;
|
if (this.barCekSimSchedule.Checked)
|
{
|
var target_flow1 = request.TargetFlow1;
|
var target_flow2 = request.TargetFlow2;
|
|
var target_pressure1 = Curve.PumpCalculateHelper.Mpa2M(request.TargetPressure1);
|
var target_pressure2 = Curve.PumpCalculateHelper.Mpa2M(request.TargetPressure2);
|
|
var station_info = _service_station.Get();
|
var station1 = station_info.Station1;
|
var station2 = station_info.Station2;
|
var station1_schedule_config = _service_schedule_config.GetStation1();
|
var station2_schedule_config = _service_schedule_config.GetStation2();
|
var analysis_deviation_list = _service_analysis_deviation.GetList();
|
if (!this.barCekUseCalcDev.Checked)
|
{
|
analysis_deviation_list = null;
|
}
|
|
if (this.barCekCalcPressureDiff.Checked)
|
{
|
var time = Convert.ToDateTime(this.barEditImgRealTime.EditValue);
|
if (_monitor_record_dict != null && _monitor_record_dict.ContainsKey(time))
|
{
|
var valid_record_list = _monitor_record_dict[time];
|
var station_scada_dict = GetStationScadaDict(monitor_record_list);
|
|
var validRealTimePressure = station_scada_dict[IStation.eDockingStation.Ch1s][0].Item2 ;
|
if (validRealTimePressure.HasValue)
|
{
|
var validRealTimePressureDiff = validRealTimePressure.Value - target_pressure1;
|
target_pressure1 += validRealTimePressureDiff;
|
AlertTool.ShowInfo(this, "填补压力缺失", $"{validRealTimePressureDiff:N3}");
|
}
|
}
|
}
|
|
if (this.barCekCalcFlowDiff.Checked)
|
{
|
var ptList = new List<CurvePoint>();
|
try
|
{
|
var filePath = @"D:\WorkCode\Project\ChDt1\Schedule.Ch.V1.0\02-desktop\Desktop\IStation.Test\bin\Debug\net6.0-windows\stationcsv\characteristic_curve.csv";
|
using (StreamReader reader = new StreamReader(filePath))
|
{
|
reader.ReadLine();
|
string line;
|
while ((line = reader.ReadLine()) != null)
|
{
|
// 按逗号分隔每一行
|
string[] values = line.Split(',');
|
var xStr = values[0];
|
var yStr = values[1];
|
|
var pX = double.Parse(xStr);
|
var pY = double.Parse(yStr);
|
|
pY = Math.Abs(pY);
|
ptList.Add(new CurvePoint(pX, pY));
|
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
Console.WriteLine("读取文件时出错: " + ex.Message);
|
}
|
|
var x = ptList.Select(x => x.X).ToArray();
|
var y = ptList.Select(x => x.Y).ToArray();
|
|
// 多项式回归的阶数(例如,二次多项式)
|
int degree = 3;
|
|
// 拟合多项式回归模型
|
double[] coefficients = NonlinearRegressionHelper.FitPolynomial(x, y, degree);
|
|
// 使用模型进行预测
|
double xNew = target_pressure2;
|
double yPredicted = NonlinearRegressionHelper.PredictPolynomial(xNew, coefficients);
|
|
target_flow2 += yPredicted;
|
AlertTool.ShowInfo(this, "预测流量缺失", $"{yPredicted:N1}");
|
|
|
// 计算 R² 和 MSE
|
double rSquared = NonlinearRegressionHelper.CalculateRSquared(x, y, coefficients);
|
double mse = NonlinearRegressionHelper.CalculateMSE(x, y, coefficients);
|
|
}
|
|
|
|
GlobalHelper.GetStationOpenFlagList(monitor_record_list, out List<int> station1_open_flag_list, out List<int> station2_open_flag_list);
|
GlobalHelper.GetStationFlagStateList(monitor_record_list, out List<int> station1_maintenance_flag_list, out List<int> station2_maintenance_flag_list, out List<int> station1_priority_flag_list, out List<int> station2_priority_flag_list);
|
GlobalHelper.GetFlagInletWaterLevelDict(monitor_record_list, out Dictionary<int, double> station1_flag_inlet_water_level_dict, out Dictionary<int, double> station2_flag_inlet_water_level_dict);
|
|
var helper = new Service.ScheduleHelper();
|
helper.Initial(station1_open_flag_list, station1_schedule_config, analysis_deviation_list);
|
var optimal_combine1 = helper.GetOptAnaCombine(station1, station1_flag_inlet_water_level_dict, target_flow1, target_pressure1);
|
|
helper.Initial(station2_open_flag_list, station2_schedule_config, analysis_deviation_list);
|
var optimal_combine2 = helper.GetOptAnaCombine(station2, station2_flag_inlet_water_level_dict, target_flow2, target_pressure2);
|
|
conclusion_list = new List<Model.ScheduleConclusion>();
|
pump_list = new List<Model.SchedulePump>();
|
|
if (optimal_combine1 != null)
|
{
|
optimal_combine1.Round();
|
var schedule_conclusion1 = new Model.ScheduleConclusion
|
{
|
ID = Yw.YitIdHelper.NextId(),
|
RequestID = request_id,
|
Station = IStation.eDockingStation.Ch1s,
|
TotalFlow = optimal_combine1.TotalFlow,
|
TotalPressure = optimal_combine1.TotalPressure,
|
TotalPower = optimal_combine1.TotalPower,
|
TotalEfficiency = optimal_combine1.TotalEfficiency,
|
WP = optimal_combine1.WP,
|
UWP = optimal_combine1.UWP,
|
Flags = IntListHelper.ToString(optimal_combine1.Flags),
|
MeritRatio = optimal_combine1.MeritRatio
|
};
|
var schedule_pump_list1 = new List<Model.SchedulePump>();
|
foreach (var fre_pump in optimal_combine1.AnaFrePumps)
|
{
|
var flag = fre_pump.Flag;
|
var schedule_pump = new Model.SchedulePump
|
{
|
RequestID = request_id,
|
Station = IStation.eDockingStation.Ch1s,
|
Flag = flag,
|
Flow = fre_pump.Flow,
|
Head = fre_pump.Head,
|
PressureDiff = fre_pump.PressureDiff,
|
Power = fre_pump.Power,
|
Efficiency = fre_pump.Eff,
|
Hz = fre_pump.Frequency,
|
Rpm = fre_pump.Speed
|
};
|
schedule_pump_list1.Add(schedule_pump);
|
|
}
|
conclusion_list.Add(schedule_conclusion1);
|
pump_list.AddRange(schedule_pump_list1);
|
}
|
|
if (optimal_combine2 != null)
|
{
|
optimal_combine2.Round();
|
var schedule_conclusion2 = new Model.ScheduleConclusion
|
{
|
ID = Yw.YitIdHelper.NextId(),
|
RequestID = request_id,
|
Station = IStation.eDockingStation.Ch2s,
|
TotalFlow = optimal_combine2.TotalFlow,
|
TotalPressure = optimal_combine2.TotalPressure,
|
TotalPower = optimal_combine2.TotalPower,
|
TotalEfficiency = optimal_combine2.TotalEfficiency,
|
WP = optimal_combine2.WP,
|
UWP = optimal_combine2.UWP,
|
Flags = IntListHelper.ToString(optimal_combine2.Flags),
|
MeritRatio = optimal_combine2.MeritRatio
|
};
|
var schedule_pump_list2 = new List<Model.SchedulePump>();
|
foreach (var fre_pump in optimal_combine2.AnaFrePumps)
|
{
|
var flag = fre_pump.Flag;
|
var schedule_pump = new Model.SchedulePump
|
{
|
RequestID = request_id,
|
Station = IStation.eDockingStation.Ch2s,
|
Flag = flag,
|
Flow = fre_pump.Flow,
|
Head = fre_pump.Head,
|
PressureDiff = fre_pump.PressureDiff,
|
Power = fre_pump.Power,
|
Efficiency = fre_pump.Eff,
|
Hz = fre_pump.Frequency,
|
Rpm = fre_pump.Speed
|
};
|
schedule_pump_list2.Add(schedule_pump);
|
}
|
|
conclusion_list.Add(schedule_conclusion2);
|
pump_list.AddRange(schedule_pump_list2);
|
}
|
}
|
else
|
{
|
conclusion_list = _service_schedule_conclusion.GetByRequestID(request_id);
|
pump_list = _service_schedule_pump.GetByRequestID(request_id);
|
|
}
|
|
ScheduleRequest(request, conclusion_list, pump_list, monitor_record_list);
|
|
}
|
|
private void ScheduleRequest(Model.ScheduleRequest request, List<Model.ScheduleConclusion> conclusion_list, List<Model.SchedulePump> pump_list, List<Model.MonitorRecord> monitor_record_list)
|
{
|
if (request == null)
|
{
|
Reset();
|
return;
|
}
|
|
try
|
{
|
|
if (conclusion_list == null || !conclusion_list.Any())
|
{
|
Reset();
|
return;
|
}
|
if (pump_list == null || !pump_list.Any())
|
{
|
Reset();
|
return;
|
}
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
{
|
Reset();
|
return;
|
}
|
|
|
var station_scada_dict = GetStationScadaDict(monitor_record_list);
|
var pump_scada_dict = GetPumpScadaDict(monitor_record_list);
|
|
|
_station_schedule_vm_list = new List<StationScheduleVm>();
|
_pump_schedule_vm_list1 = new List<PumpScheduleVm>();
|
_pump_schedule_vm_list2 = new List<PumpScheduleVm>();
|
|
foreach (var cl in conclusion_list)
|
{
|
double target_flow = 0, target_pressure = 0;
|
var before_flow = station_scada_dict[(eDockingStation)cl.Station][0].Item1;
|
var before_head = station_scada_dict[(eDockingStation)cl.Station][0].Item2;
|
|
if (cl.Station == eDockingStation.Ch1s)
|
{
|
target_flow = request.TargetFlow1;
|
target_pressure = request.TargetPressure1;
|
|
}
|
else
|
{
|
target_flow = request.TargetFlow2;
|
target_pressure = request.TargetPressure2;
|
}
|
|
|
target_pressure.Mpa2M();
|
target_pressure.Round(3);
|
|
var vm = new StationScheduleVm();
|
vm.Name = GetStationName(cl.Station);
|
vm.Flag = (eDockingStation)cl.Station;
|
vm.BeforeFlow = before_flow;
|
vm.BeforePressure = before_head;
|
vm.TargetFlow = target_flow;
|
vm.TargetPressure = target_pressure;
|
_station_schedule_vm_list.Add(vm);
|
}
|
|
foreach (var flag in GlobalHelper.Station1FlagList)
|
{
|
var pump = pump_list.Find(x => x.Flag == flag);
|
var vm = new PumpScheduleVm();
|
vm.Station = GetStationName(IStation.eDockingStation.Ch1s);
|
vm.Flag = flag;
|
if (pump != null)
|
{
|
vm.BeforeWL = pump_scada_dict[flag].Item1;
|
vm.BeforeRpm = pump_scada_dict[flag].Item2;
|
vm.TargetRpm = pump.Rpm;
|
vm.BeforeFlow = pump_scada_dict[flag].Item3;
|
vm.TargetFlow = pump.Flow;
|
vm.BeforePressure = pump_scada_dict[flag].Item4;
|
vm.TargetPressure = pump.PressureDiff + vm.BeforeWL;
|
vm.TargetHead = pump.Head;
|
vm.TargetFrequency = pump.Hz;
|
vm.TargetPressureDiff = pump.PressureDiff;
|
|
}
|
_pump_schedule_vm_list1.Add(vm);
|
}
|
|
foreach (var flag in GlobalHelper.Station2FlagList)
|
{
|
var pump = pump_list.Find(x => x.Flag == flag);
|
var vm = new PumpScheduleVm();
|
vm.Station = GetStationName(IStation.eDockingStation.Ch2s);
|
vm.Flag = flag;
|
if (pump != null)
|
{
|
vm.BeforeWL = pump_scada_dict[flag].Item1;
|
vm.BeforeRpm = pump_scada_dict[flag].Item2;
|
vm.TargetRpm = pump.Rpm;
|
vm.BeforeFlow = pump_scada_dict[flag].Item3;
|
vm.TargetFlow = pump.Flow;
|
vm.BeforePressure = pump_scada_dict[flag].Item4;
|
vm.TargetPressure = pump.PressureDiff + vm.BeforeWL;
|
vm.TargetHead = pump.Head;
|
vm.TargetFrequency = pump.Hz;
|
vm.TargetPressureDiff = pump.PressureDiff;
|
|
}
|
_pump_schedule_vm_list2.Add(vm);
|
}
|
|
|
}
|
catch (Exception ex)
|
{
|
Yw.LogHelper.Error(ex.Message);
|
}
|
|
|
this.pumpScheduleVmBindingSource.DataSource = _pump_schedule_vm_list1;
|
this.pumpScheduleVmBindingSource.ResetBindings(false);
|
|
|
this.pumpScheduleVmBindingSource1.DataSource = _pump_schedule_vm_list2;
|
this.pumpScheduleVmBindingSource1.ResetBindings(false);
|
|
}
|
|
private void ScheduleVerify(
|
List<StationScheduleVm> station_schedule_vm_list,
|
List<PumpScheduleVm> pump_schedule_vm_list1,
|
List<PumpScheduleVm> pump_schedule_vm_list2,
|
List<Model.MonitorRecord> monitor_record_list)
|
{
|
this.memoEditInfo.Text = string.Empty;
|
if (station_schedule_vm_list == null || !station_schedule_vm_list.Any())
|
return;
|
if (pump_schedule_vm_list1 == null || !pump_schedule_vm_list1.Any())
|
return;
|
|
if (pump_schedule_vm_list2 == null || !pump_schedule_vm_list2.Any())
|
return;
|
|
station_schedule_vm_list.ForEach(x => x.Clear());
|
pump_schedule_vm_list1.ForEach(x => x.Clear());
|
pump_schedule_vm_list2.ForEach(x => x.Clear());
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
return;
|
|
|
try
|
{
|
|
var station_scada_dict = GetStationScadaDict(monitor_record_list);
|
var pump_scada_dict = GetPumpScadaDict(monitor_record_list);
|
|
double total_target_flow = 0, total_real_flow = 0;
|
double total_flow1 = 0, total_curve_flow1 = 0;
|
var str_build = new StringBuilder();
|
str_build.AppendLine(DateTime.Now.ToString("G"));
|
|
foreach (var vm in station_schedule_vm_list)
|
{
|
var flag = vm.Flag;
|
vm.RealTimeFlow = station_scada_dict[flag][0].Item1;
|
vm.FlowDeviation = vm.RealTimeFlow - vm.TargetFlow;
|
|
vm.RealTimePressure = station_scada_dict[flag][0].Item2;
|
vm.PressureDeviation = vm.RealTimePressure - vm.TargetPressure;
|
|
vm.Round();
|
if (flag == eDockingStation.Ch1s)
|
{
|
total_flow1 = vm.RealTimeFlow ?? 0;
|
|
}
|
total_target_flow += vm.TargetFlow ?? 0;
|
total_real_flow += vm.RealTimeFlow ?? 0;
|
str_build.AppendLine($"{vm.Name} 目标流量:{vm.TargetFlow} 实际流量:{vm.RealTimeFlow} 流量偏差:{vm.FlowDeviation} 目标压力:{vm.TargetPressure} 实际压力:{vm.RealTimePressure} 压力偏差:{vm.PressureDeviation}");
|
}
|
|
str_build.AppendLine($"总目标流量:{total_target_flow:N1} 总实时流量:{total_real_flow:N1} 流量偏差:{total_target_flow - total_real_flow:N1}");
|
|
foreach (var vm in pump_schedule_vm_list1)
|
{
|
var flag = vm.Flag;
|
var pump = _pump_list1?.Find(x => x.Flag == flag);
|
|
if (vm.RealTimeRpm > 0 || pump_scada_dict[flag].Item2 > 0)
|
{
|
|
vm.RealTimeWL = pump_scada_dict[flag].Item1;
|
vm.RealTimeRpm = pump_scada_dict[flag].Item2;
|
vm.RpmDeviation = vm.RealTimeRpm - vm.TargetRpm;
|
|
vm.RealTimePressure = pump_scada_dict[flag].Item4;
|
vm.PressureDeviation = vm.RealTimePressure - vm.TargetPressure;
|
|
vm.RealTimePressureDiff = vm.RealTimePressure - vm.RealTimeWL;
|
|
if (vm.RealTimeRpm.HasValue)
|
{
|
var hz = vm.RealTimeRpm.Value / pump.Nr * 50;
|
hz = Math.Round(hz, 1);
|
if (hz > 50)
|
hz = 50;
|
vm.RealTimeFrequency = hz;
|
|
var pressure_diff = vm.RealTimePressureDiff ?? 0;
|
pressure_diff = Math.Round(pressure_diff, 1);
|
var run_flag = RunFlagHelper.Get(flag, pump.IsBp);
|
|
Model.AnalysisParameter hz_item = null;
|
for (int i = 0; i < 3; i++)
|
{
|
pressure_diff += i * 0.1;
|
pressure_diff = Math.Round(pressure_diff, 1);
|
var list = _service_analysis_parameter.GetList(run_flag, pressure_diff);
|
if (list == null || !list.Any())
|
{
|
continue;
|
}
|
hz_item = list.Find(x => x.Hz == hz);
|
if (hz_item != null)
|
{
|
total_curve_flow1 += hz_item.Flow;
|
vm.RealTimeFlow = hz_item.Flow;
|
vm.FlowDeviation = vm.RealTimeFlow - vm.TargetFlow;
|
vm.RealTimeHead = hz_item.Head;
|
break;
|
}
|
}
|
|
if (hz_item == null)
|
{
|
//AlertTool.ShowInfo(this, "提示", $"{flag} 无法获取压差:{pressure_diff}");
|
}
|
|
|
}
|
|
vm.Round();
|
}
|
}
|
|
str_build.AppendLine($"陈行1输 曲线总流量:{total_curve_flow1:N1} 实际差值(实-曲):{total_flow1 - total_curve_flow1:N1}");
|
|
foreach (var vm in pump_schedule_vm_list2)
|
{
|
var flag = vm.Flag;
|
var pump = _pump_list2?.Find(x => x.Flag == flag);
|
if (vm.RealTimeRpm > 0 || pump_scada_dict[flag].Item2 > 0)
|
{
|
vm.RealTimeWL = pump_scada_dict[flag].Item1;
|
|
vm.RealTimeRpm = pump_scada_dict[flag].Item2;
|
vm.RpmDeviation = vm.RealTimeRpm - vm.TargetRpm;
|
|
vm.RealTimeFlow = pump_scada_dict[flag].Item3;
|
vm.FlowDeviation = vm.RealTimeFlow - vm.TargetFlow;
|
|
vm.RealTimePressure = pump_scada_dict[flag].Item4;
|
vm.PressureDeviation = vm.RealTimePressure - vm.TargetPressure;
|
|
vm.RealTimePressureDiff = vm.RealTimePressure - vm.RealTimeWL;
|
|
if (vm.RealTimeRpm.HasValue)
|
{
|
var hz = vm.RealTimeRpm.Value / pump.Nr * 50;
|
hz = Math.Round(hz, 1);
|
if (hz > 50)
|
hz = 50;
|
vm.RealTimeFrequency = hz;
|
|
var pressure_diff = vm.RealTimePressureDiff;
|
pressure_diff = Math.Round(pressure_diff ?? 0, 1);
|
var run_flag = RunFlagHelper.Get(flag, pump.IsBp);
|
var list = _service_analysis_parameter.GetList(run_flag, pressure_diff ?? 0);
|
if (list != null && list.Any())
|
{
|
var hz_item = list.Find(x => x.Hz == hz);
|
if (hz_item != null)
|
{
|
vm.RealTimeHead = hz_item.Head;
|
}
|
}
|
}
|
}
|
|
vm.Round();
|
|
}
|
|
|
this.memoEditInfo.Text = str_build.ToString();
|
}
|
catch (Exception ex)
|
{
|
Yw.LogHelper.Error(ex.Message);
|
}
|
|
this.pumpScheduleVmBindingSource.ResetBindings(false);
|
this.pumpScheduleVmBindingSource1.ResetBindings(false);
|
}
|
|
|
private void Reset()
|
{
|
|
_station_schedule_vm_list = new List<StationScheduleVm>();
|
|
_pump_schedule_vm_list1 = new List<PumpScheduleVm>();
|
this.pumpScheduleVmBindingSource.DataSource = _pump_schedule_vm_list1;
|
this.pumpScheduleVmBindingSource.ResetBindings(false);
|
|
_pump_schedule_vm_list2 = new List<PumpScheduleVm>();
|
this.pumpScheduleVmBindingSource1.DataSource = _pump_schedule_vm_list2;
|
this.pumpScheduleVmBindingSource1.ResetBindings(false);
|
}
|
|
private void barEditImgDate_EditValueChanged(object sender, EventArgs e)
|
{
|
var time = Convert.ToDateTime(this.barEditImgDate.EditValue);
|
_schedule_request = _schedule_request_list.Find(x => x.ReceptionTime == time);
|
if (_schedule_request == null)
|
{
|
Reset();
|
return;
|
}
|
Schedule(_schedule_request);
|
this.repImgCmbRealTime.Items.Clear();
|
foreach (var item in _monitor_record_dict)
|
{
|
if (item.Key < time)
|
{
|
continue;
|
}
|
this.repImgCmbRealTime.Items.Add(item.Key.ToString("G"), item.Key, -1);
|
}
|
}
|
|
private void barEditImgRealTime_EditValueChanged(object sender, EventArgs e)
|
{
|
var time = Convert.ToDateTime(this.barEditImgRealTime.EditValue);
|
Verify(time);
|
}
|
|
private void Verify(DateTime time)
|
{
|
if (_schedule_request == null)
|
{
|
Reset();
|
return;
|
}
|
if (_monitor_record_dict == null || !_monitor_record_dict.ContainsKey(time))
|
{
|
Reset();
|
return;
|
}
|
var monitor_record_list = _monitor_record_dict[time];
|
ScheduleVerify(_station_schedule_vm_list, _pump_schedule_vm_list1, _pump_schedule_vm_list2, monitor_record_list);
|
}
|
|
|
private void barCekSimSchedule_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
var time = Convert.ToDateTime(this.barEditImgRealTime.EditValue);
|
Schedule(_schedule_request);
|
Verify(time);
|
}
|
|
private void barCekUseCalcDev_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
var time = Convert.ToDateTime(this.barEditImgRealTime.EditValue);
|
Schedule(_schedule_request);
|
Verify(time);
|
}
|
|
|
private void barCekCalcFlowDiff_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
var time = Convert.ToDateTime(this.barEditImgRealTime.EditValue);
|
Schedule(_schedule_request);
|
Verify(time);
|
}
|
|
|
private void barCekCalcPressureDiff_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
|
{
|
var time = Convert.ToDateTime(this.barEditImgRealTime.EditValue);
|
Schedule(_schedule_request);
|
Verify(time);
|
}
|
|
#region Expand
|
private string GetStationName(eDockingStation station)
|
{
|
if (station == eDockingStation.Ch1s)
|
{
|
return "一输水";
|
}
|
else
|
{
|
return "二输水";
|
|
}
|
}
|
|
private Dictionary<IStation.eDockingStation, Dictionary<int, Tuple<double?, double?>>> GetStationScadaDict(List<Dto.OptScheduleScadaOutput> monitor_record_list)
|
{
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
{
|
return default;
|
}
|
|
var zy_monitor_record_list = monitor_record_list.Select(x => new Model.MonitorRecord()
|
{
|
DataTime = x.DataTime,
|
DataCode = x.DataCode,
|
DataValue = x.DataValue
|
}).ToList();
|
|
|
return GetStationScadaDict(zy_monitor_record_list);
|
}
|
|
private Dictionary<int, Tuple<double?, double?, double?, double?, double?>> GetPumpScadaDict(List<Dto.OptScheduleScadaOutput> monitor_record_list)
|
{
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
{
|
return default;
|
}
|
|
var zy_monitor_record_list = monitor_record_list.Select(x => new Model.MonitorRecord()
|
{
|
DataTime = x.DataTime,
|
DataCode = x.DataCode,
|
DataValue = x.DataValue
|
}).ToList();
|
|
return GetPumpScadaDict(zy_monitor_record_list);
|
}
|
|
private Dictionary<IStation.eDockingStation, Dictionary<int, Tuple<double?, double?>>> GetStationScadaDict(List<Model.MonitorRecord> monitor_record_list)
|
{
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
{
|
return default;
|
}
|
|
var scada_dict = monitor_record_list.ToDictionary(x => x.DataCode, x => x.DataValue);
|
|
|
var jd1_flow = scada_dict[GlobalHelper.嘉定1线_瞬时流量_长江管网图];
|
var jd1_pressure = scada_dict[GlobalHelper.嘉定1线_压力_长江管网图] / 1000;
|
var jd2_flow = scada_dict[GlobalHelper.嘉定2线_瞬时流量_长江管网图];
|
var jd2_pressure = scada_dict[GlobalHelper.嘉定2线_压力_长江管网图] / 1000;
|
var jd3_flow = scada_dict[GlobalHelper.嘉定3线_瞬时流量_长江管网图];
|
var jd3_pressure = scada_dict[GlobalHelper.嘉定3线_压力_长江管网图] / 1000;
|
|
|
var dn2400_flow = scada_dict[IStation.GlobalHelper.DN2400总管_瞬时流量_长江管网图];
|
var dn2400_pressure = scada_dict[IStation.GlobalHelper.DN2400_出厂压力_长江管网图];
|
var dn2700_flow = scada_dict[IStation.GlobalHelper.DN2700总管_瞬时流量_长江管网图];
|
var dn2700_pressure = scada_dict[IStation.GlobalHelper.DN2700_出厂压力_长江管网图];
|
|
|
jd1_pressure.Mpa2M();
|
jd1_pressure.Round(3);
|
jd2_pressure.Mpa2M();
|
jd2_pressure.Round(3);
|
jd3_pressure.Mpa2M();
|
jd3_pressure.Round(3);
|
|
dn2400_pressure.Mpa2M();
|
dn2400_pressure.Round(3);
|
dn2700_pressure.Mpa2M();
|
dn2700_pressure.Round(3);
|
|
var total_flow1 = jd1_flow + jd2_flow + jd3_flow ?? 0;
|
var total_pressure1 = (jd1_pressure + jd2_pressure + jd3_pressure ?? 0) / 3;
|
|
var total_flow2 = dn2400_flow + dn2700_flow ?? 0;
|
var total_pressure2 = (dn2400_pressure + dn2700_pressure ?? 0) / 2;
|
|
total_pressure1.Round(3);
|
total_pressure2.Round(3);
|
|
var station_scada_dict = new Dictionary<IStation.eDockingStation, Dictionary<int, Tuple<double?, double?>>>();
|
station_scada_dict.Add(IStation.eDockingStation.Ch1s, new Dictionary<int, Tuple<double?, double?>>()
|
{
|
{0,new (total_flow1, total_pressure1) },
|
{1,new (jd1_flow, jd1_pressure) },
|
{2,new (jd2_flow, jd2_pressure) },
|
{3,new (jd3_flow, jd3_pressure) },
|
|
});
|
station_scada_dict.Add(IStation.eDockingStation.Ch2s, new Dictionary<int, Tuple<double?, double?>>()
|
{
|
{0,new (total_flow2, total_pressure2) },
|
{1,new (dn2400_flow, dn2400_pressure) },
|
{2,new (dn2700_flow, dn2700_pressure) },
|
|
});
|
return station_scada_dict;
|
}
|
|
private Dictionary<int, Tuple<double?, double?, double?, double?, double?>> GetPumpScadaDict(List<Model.MonitorRecord> monitor_record_list)
|
{
|
if (monitor_record_list == null || !monitor_record_list.Any())
|
{
|
return default;
|
}
|
|
var scada_dict = monitor_record_list.ToDictionary(x => x.DataCode, x => x.DataValue);
|
#region 1
|
|
var pump11_run_status = scada_dict[GlobalHelper.一输11泵_运行状态];
|
var pump12_run_status = scada_dict[GlobalHelper.一输12泵_运行状态];
|
var pump13_run_status = scada_dict[GlobalHelper.一输13泵_运行状态];
|
var pump14_run_status = scada_dict[GlobalHelper.一输14泵_运行状态];
|
var pump15_run_status = scada_dict[GlobalHelper.一输15泵_运行状态];
|
var pump16_run_status = scada_dict[GlobalHelper.一输16泵_运行状态];
|
var pump17_run_status = scada_dict[GlobalHelper.一输17泵_运行状态];
|
var pump18_run_status = scada_dict[GlobalHelper.一输18泵_运行状态];
|
|
var pump11_wl = scada_dict[GlobalHelper.一输_老前池南侧液位];
|
var pump12_wl = scada_dict[GlobalHelper.一输_老前池南侧液位];
|
var pump13_wl = scada_dict[GlobalHelper.一输_老前池南侧液位];
|
var pump14_wl = scada_dict[GlobalHelper.一输_老前池北侧液位];
|
var pump15_wl = scada_dict[GlobalHelper.一输_老前池北侧液位];
|
var pump16_wl = scada_dict[GlobalHelper.一输_新前池液位];
|
var pump17_wl = scada_dict[GlobalHelper.一输_新前池液位];
|
var pump18_wl = scada_dict[GlobalHelper.一输_新前池液位];
|
|
|
var pump11_pressure = scada_dict[GlobalHelper.一输11泵_出口压力] / 1000;
|
var pump12_pressure = scada_dict[GlobalHelper.一输12泵_出口压力] / 1000;
|
var pump13_pressure = scada_dict[GlobalHelper.一输13泵_出口压力] / 1000;
|
var pump14_pressure = scada_dict[GlobalHelper.一输14泵_出口压力] / 1000;
|
var pump15_pressure = scada_dict[GlobalHelper.一输15泵_出口压力] / 1000;
|
var pump16_pressure = scada_dict[GlobalHelper.一输16泵_出口压力] / 1000;
|
var pump17_pressure = scada_dict[GlobalHelper.一输17泵_出口压力] / 1000;
|
var pump18_pressure = scada_dict[GlobalHelper.一输18泵_出口压力] / 1000;
|
|
var pump11_rpm = scada_dict[GlobalHelper.一输11泵_转速];
|
var pump12_rpm = scada_dict[GlobalHelper.一输12泵_转速];
|
var pump13_rpm = scada_dict[GlobalHelper.一输13泵_转速];
|
var pump14_rpm = scada_dict[GlobalHelper.一输14泵_转速];
|
var pump15_rpm = pump15_run_status == 1 ? 590 : 0;
|
var pump16_rpm = pump16_run_status == 1 ? 590 : 0;
|
var pump17_rpm = scada_dict[GlobalHelper.一输17泵_转速];
|
var pump18_rpm = scada_dict[GlobalHelper.一输18泵_转速];
|
|
var pump11_power = scada_dict[GlobalHelper.一输11泵_有功功率];
|
var pump12_power = scada_dict[GlobalHelper.一输12泵_有功功率];
|
var pump13_power = scada_dict[GlobalHelper.一输13泵_有功功率];
|
var pump14_power = scada_dict[GlobalHelper.一输14泵_有功功率];
|
var pump15_power = scada_dict[GlobalHelper.一输15泵_有功功率];
|
var pump16_power = scada_dict[GlobalHelper.一输16泵_有功功率];
|
var pump17_power = scada_dict[GlobalHelper.一输17泵_有功功率];
|
var pump18_power = scada_dict[GlobalHelper.一输18泵_有功功率];
|
|
|
pump11_pressure.Mpa2M();
|
pump12_pressure.Mpa2M();
|
pump13_pressure.Mpa2M();
|
pump14_pressure.Mpa2M();
|
pump15_pressure.Mpa2M();
|
pump16_pressure.Mpa2M();
|
pump17_pressure.Mpa2M();
|
pump18_pressure.Mpa2M();
|
|
#endregion
|
|
#region 2
|
|
var pump21_run_status = scada_dict[GlobalHelper.二输21泵_运行状态];
|
var pump22_run_status = scada_dict[GlobalHelper.二输22泵_运行状态];
|
var pump23_run_status = scada_dict[GlobalHelper.二输23泵_运行状态];
|
var pump24_run_status = scada_dict[GlobalHelper.二输24泵_运行状态];
|
var pump25_run_status = scada_dict[GlobalHelper.二输25泵_运行状态];
|
var pump26_run_status = scada_dict[GlobalHelper.二输26泵_运行状态];
|
var pump27_run_status = scada_dict[GlobalHelper.二输27泵_运行状态];
|
|
|
var pump21_wl = scada_dict[GlobalHelper.二输21泵_泵井液位];
|
var pump22_wl = scada_dict[GlobalHelper.二输22泵_泵井液位];
|
var pump23_wl = scada_dict[GlobalHelper.二输23泵_泵井液位];
|
var pump24_wl = scada_dict[GlobalHelper.二输24泵_泵井液位];
|
var pump25_wl = scada_dict[GlobalHelper.二输25泵_泵井液位];
|
var pump26_wl = scada_dict[GlobalHelper.二输26泵_泵井液位];
|
var pump27_wl = scada_dict[GlobalHelper.二输27泵_泵井液位];
|
|
|
var pump21_pressure = scada_dict[GlobalHelper.二输21泵_出水压力];
|
var pump22_pressure = scada_dict[GlobalHelper.二输22泵_出水压力];
|
var pump23_pressure = scada_dict[GlobalHelper.二输23泵_出水压力];
|
var pump24_pressure = scada_dict[GlobalHelper.二输24泵_出水压力];
|
var pump25_pressure = scada_dict[GlobalHelper.二输25泵_出水压力];
|
var pump26_pressure = scada_dict[GlobalHelper.二输26泵_出水压力];
|
var pump27_pressure = scada_dict[GlobalHelper.二输27泵_出水压力];
|
|
|
var pump21_rpm = scada_dict[GlobalHelper.二输21泵_转速];
|
var pump22_rpm = scada_dict[GlobalHelper.二输22泵_转速];
|
var pump23_rpm = scada_dict[GlobalHelper.二输23泵_转速];
|
var pump24_rpm = scada_dict[GlobalHelper.二输24泵_转速];
|
var pump25_rpm = scada_dict[GlobalHelper.二输25泵_转速];
|
var pump26_rpm = scada_dict[GlobalHelper.二输26泵_转速];
|
var pump27_rpm = scada_dict[GlobalHelper.二输27泵_转速];
|
|
|
|
var pump21_flow = scada_dict[GlobalHelper.二输21泵_瞬时流量];
|
var pump22_flow = scada_dict[GlobalHelper.二输22泵_瞬时流量];
|
var pump23_flow = scada_dict[GlobalHelper.二输23泵_瞬时流量];
|
var pump24_flow = scada_dict[GlobalHelper.二输24泵_瞬时流量];
|
var pump25_flow = scada_dict[GlobalHelper.二输25泵_瞬时流量];
|
var pump26_flow = scada_dict[GlobalHelper.二输26泵_瞬时流量];
|
var pump27_flow = scada_dict[GlobalHelper.二输27泵_瞬时流量];
|
|
var pump21_power = scada_dict[GlobalHelper.二输21泵_有功功率];
|
var pump22_power = scada_dict[GlobalHelper.二输22泵_有功功率];
|
var pump23_power = scada_dict[GlobalHelper.二输23泵_有功功率];
|
var pump24_power = scada_dict[GlobalHelper.二输24泵_有功功率];
|
var pump25_power = scada_dict[GlobalHelper.二输25泵_有功功率];
|
var pump26_power = scada_dict[GlobalHelper.二输26泵_有功功率];
|
var pump27_power = scada_dict[GlobalHelper.二输27泵_有功功率];
|
|
|
if (scada_dict.ContainsKey(GlobalHelper.二输21泵_状态))
|
{
|
|
}
|
//var pump21_maintenance_status = scada_dict[GlobalHelper.二输21泵_状态];
|
//var pump22_maintenance_status = scada_dict[GlobalHelper.二输22泵_状态];
|
//var pump23_maintenance_status = scada_dict[GlobalHelper.二输23泵_状态];
|
//var pump24_maintenance_status = scada_dict[GlobalHelper.二输24泵_状态];
|
//var pump25_maintenance_status = scada_dict[GlobalHelper.二输25泵_状态];
|
//var pump26_maintenance_status = scada_dict[GlobalHelper.二输26泵_状态];
|
//var pump27_maintenance_status = scada_dict[GlobalHelper.二输27泵_状态];
|
|
|
pump21_pressure.Mpa2M();
|
pump22_pressure.Mpa2M();
|
pump23_pressure.Mpa2M();
|
pump24_pressure.Mpa2M();
|
pump25_pressure.Mpa2M();
|
pump26_pressure.Mpa2M();
|
pump27_pressure.Mpa2M();
|
#endregion
|
|
var pump_scada_dict = new Dictionary<int, Tuple<double?, double?, double?, double?, double?>>();
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag11, new(pump11_wl, pump11_rpm, null, pump11_pressure, pump11_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag12, new(pump12_wl, pump12_rpm, null, pump12_pressure, pump12_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag13, new(pump13_wl, pump13_rpm, null, pump13_pressure, pump13_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag14, new(pump14_wl, pump14_rpm, null, pump14_pressure, pump14_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag15, new(pump15_wl, pump15_rpm, null, pump15_pressure, pump15_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag16, new(pump16_wl, pump16_rpm, null, pump16_pressure, pump16_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag17, new(pump17_wl, pump17_rpm, null, pump17_pressure, pump17_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag18, new(pump18_wl, pump18_rpm, null, pump18_pressure, pump18_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag21, new(pump21_wl, pump21_rpm, pump21_flow, pump21_pressure, pump21_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag22, new(pump22_wl, pump22_rpm, pump22_flow, pump22_pressure, pump22_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag23, new(pump23_wl, pump23_rpm, pump23_flow, pump23_pressure, pump23_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag24, new(pump24_wl, pump24_rpm, pump24_flow, pump24_pressure, pump24_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag25, new(pump25_wl, pump25_rpm, pump25_flow, pump25_pressure, pump25_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag26, new(pump26_wl, pump26_rpm, pump26_flow, pump26_pressure, pump26_power));
|
pump_scada_dict.Add(IStation.GlobalHelper.Flag27, new(pump27_wl, pump27_rpm, pump27_flow, pump27_pressure, pump27_power));
|
|
return pump_scada_dict;
|
}
|
|
private void gridViewS1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
|
{
|
if (e.CellValue == null)
|
{
|
e.DisplayText = string.Empty;
|
return;
|
}
|
if (e.Column == this.colRpmDeviation)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Red;
|
e.DisplayText = $"↓{value}";
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Green;
|
e.DisplayText = $"↑{value}";
|
}
|
}
|
|
}
|
else if (e.Column == this.colFlowDeviation)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Red;
|
e.DisplayText = $"↓{value}";
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Green;
|
e.DisplayText = $"↑{value}";
|
}
|
}
|
}
|
else if (e.Column == this.colPressureDeviation)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Red;
|
e.DisplayText = $"↓{value}";
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Green;
|
e.DisplayText = $"↑{value}";
|
}
|
}
|
}
|
|
}
|
|
private void gridViewS2_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
|
{
|
if (e.CellValue == null)
|
{
|
e.DisplayText = string.Empty;
|
return;
|
}
|
if (e.Column == this.colRpmDeviation1)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Red;
|
e.DisplayText = $"↓{value}";
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Green;
|
e.DisplayText = $"↑{value}";
|
}
|
}
|
|
}
|
else if (e.Column == this.colFlowDeviation1)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Red;
|
e.DisplayText = $"↓{value}";
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Green;
|
e.DisplayText = $"↑{value}";
|
}
|
}
|
}
|
else if (e.Column == this.colPressureDeviation1)
|
{
|
var cell_value = e.CellValue.ToString() ?? string.Empty;
|
if (double.TryParse(cell_value, out double value))
|
{
|
if (value > 0)
|
{
|
e.Appearance.ForeColor = Color.Red;
|
e.DisplayText = $"↓{value}";
|
}
|
else
|
{
|
e.Appearance.ForeColor = Color.Green;
|
e.DisplayText = $"↑{value}";
|
}
|
}
|
}
|
}
|
|
#endregion
|
|
public class NonlinearRegressionHelper
|
{
|
|
// 多项式回归拟合
|
public static double[] FitPolynomial(double[] x, double[] y, int degree)
|
{
|
// 构建设计矩阵
|
Matrix<double> X = DenseMatrix.OfArray(new double[x.Length, degree + 1]);
|
for (int i = 0; i < x.Length; i++)
|
{
|
for (int j = 0; j <= degree; j++)
|
{
|
X[i, j] = Math.Pow(x[i], j);
|
}
|
}
|
|
// 构建目标向量
|
Vector<double> Y = DenseVector.OfArray(y);
|
|
// 使用最小二乘法求解
|
var qr = X.QR();
|
Vector<double> coefficients = qr.Solve(Y);
|
|
return coefficients.ToArray();
|
}
|
|
// 使用多项式模型进行预测
|
public static double PredictPolynomial(double x, double[] coefficients)
|
{
|
double prediction = 0.0;
|
for (int i = 0; i < coefficients.Length; i++)
|
{
|
prediction += coefficients[i] * Math.Pow(x, i);
|
}
|
return prediction;
|
}
|
|
// 计算 R²(决定系数)
|
public static double CalculateRSquared(double[] x, double[] y, double[] coefficients)
|
{
|
double yMean = 0.0;
|
double ssTotal = 0.0;
|
double ssResidual = 0.0;
|
|
for (int i = 0; i < y.Length; i++)
|
{
|
yMean += y[i];
|
}
|
yMean /= y.Length;
|
|
for (int i = 0; i < y.Length; i++)
|
{
|
double yPredicted = PredictPolynomial(x[i], coefficients);
|
ssTotal += Math.Pow(y[i] - yMean, 2);
|
ssResidual += Math.Pow(y[i] - yPredicted, 2);
|
}
|
|
return 1.0 - (ssResidual / ssTotal);
|
}
|
|
// 计算 MSE(均方误差)
|
public static double CalculateMSE(double[] x, double[] y, double[] coefficients)
|
{
|
double mse = 0.0;
|
for (int i = 0; i < y.Length; i++)
|
{
|
double yPredicted = PredictPolynomial(x[i], coefficients);
|
mse += Math.Pow(y[i] - yPredicted, 2);
|
}
|
return mse / y.Length;
|
}
|
|
|
}
|
|
}
|
}
|