diff --git a/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs b/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs index 96f980beb78ebbbf2f05a6c47506e205972bddb5..74f498f61de9c563e7feca58de6c78bd0baf7546 100644 --- a/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs +++ b/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs @@ -152,10 +152,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine return p1.EngineSpeed + area / d; } - // non-constant torque, M(n_eng_avg) = k * n_eng_avg + d - // area = M(n1) * (n2 - n1) + (M(n1) + M(n2))/2 * (n2 - n1) => solve for n2 + // non-constant torque, M(n) = k * n + d + // area = (M(n1) + M(n2))/2 * (n2 - n1) => solve for n2 var retVal = VectoMath.QuadraticEquationSolver(k.Value() / 2.0, d.Value(), - (k * p1.EngineSpeed * p1.EngineSpeed + 2 * p1.EngineSpeed * d).Value()); + (-k * p1.EngineSpeed * p1.EngineSpeed / 2 - p1.EngineSpeed * d - area).Value()); if (retVal.Count == 0) { Log.Info("No real solution found for requested area: P: {0}, p1: {1}, p2: {2}", area, p1, p2); } @@ -195,7 +195,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine return retVal; } - private Watt ComputeArea(PerSecond lowEngineSpeed, PerSecond highEngineSpeed) + protected internal Watt ComputeArea(PerSecond lowEngineSpeed, PerSecond highEngineSpeed) { var startSegment = FindIndex(lowEngineSpeed); var endSegment = FindIndex(highEngineSpeed); diff --git a/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs index 26b0b545f8cdd976dc52fff8bbf3bb13efc95765..ab1b139af2de374d1ef2523c14b99882c5363761 100644 --- a/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs +++ b/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs @@ -115,6 +115,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD); fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() }; AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed); + var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed); + Assert.AreEqual((0.51 * totalArea).Value(), + fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3); AssertHelper.AreRelativeEqual(194.515816596908.SI<PerSecond>(), fldCurve.N95hSpeed); AssertHelper.AreRelativeEqual(94.2463966015023.SI<PerSecond>(), fldCurve.LoSpeed); AssertHelper.AreRelativeEqual(219.084329211505.SI<PerSecond>(), fldCurve.HiSpeed); @@ -122,6 +125,31 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData AssertHelper.AreRelativeEqual(-320.SI<NewtonMeter>(), fldCurve.MaxDragTorque); } + [TestMethod] + public void TestPreferredSpeed2() + { + var fldData = new[] { + "560,1180,-149,0.6", + "600,1282,-148,0.6", + "800,1791,-149,0.6", + "1000,2300,-160,0.6", + "1200,2400,-179,0.6", + "1400,2300,-203,0.6", + "1600,2079,-235,0.49", + "1800,1857,-264,0.25", + "2000,1352,-301,0.25", + "2100,1100,-320,0.25", + }; + var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData); + var fldCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldEntries)); + fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() }; + + var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed); + Assert.AreEqual((0.51 * totalArea).Value(), + fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3); + //AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed); + } + /// <summary> /// [VECTO-78] /// </summary>