private Polynom GetPerformancePolynom(int rpm) { if (!IsVarioPump) { return(null); } if (DynamicPerformanceCurves.Any(x => x.Rpm == rpm)) { return(DynamicPerformanceCurves.First(x => x.Rpm == rpm).GetPerformancePolynom()); } var upperCurve = DynamicPerformanceCurves.First(x => x.Rpm > rpm); var lowerCurve = DynamicPerformanceCurves.Last(x => x.Rpm < rpm); var rpmDelta = upperCurve.Rpm - lowerCurve.Rpm; var rpmGap = rpm - lowerCurve.Rpm; var result = new Polynom(0, 0, 0, 0); for (int i = 0; i < 4; i++) { var coefficientDelta = upperCurve.GetPerformancePolynom().Coefficients[i] - lowerCurve.GetPerformancePolynom().Coefficients[i]; result.Coefficients[i] = lowerCurve.GetPerformancePolynom().Coefficients[i] + coefficientDelta * rpmGap / rpmDelta; } return(result); }
public double[] GetPerformanceFlowValues(int?rpm = null) { if (rpm == null) { return(PerformanceCurve.Select(x => x.FlowRate).ToArray()); } else if (DynamicPerformanceCurves.Any(x => x.Rpm == rpm)) { return(DynamicPerformanceCurves.First(x => x.Rpm == rpm).GetPerformanceFlowValues()); } else { var maxPerformanceFlowValues = DynamicPerformanceCurves.First(x => x.Rpm == DynamicPerformanceCurves.Max(y => y.Rpm)).PerformanceCurve.Select(x => x.FlowRate).ToArray(); var p = GetPerformancePolynom((int)rpm); var pLim = UpperPerformanceCurveLimit; var result = new List <double>(); var isLastPoint = true; foreach (var q in maxPerformanceFlowValues) { var h = (p.Polyval(q)); if (h >= pLim.Polyval(q)) { result.Add(q); } else if (isLastPoint) { isLastPoint = false; var crossPoints = p.GetCrossPoints(pLim); if (crossPoints.Length == 1) { result.Add(crossPoints[0]); } } } return(result.ToArray()); //var maxRpmCurve = DynamicPerformanceCurves.First(x => x.Rpm == DynamicPerformanceCurves.Max(y => y.Rpm)).PerformanceCurve; //return maxRpmCurve.Select(x => x.FlowRate).ToArray(); } }