/// <summary> /// Based on the commissioning graph, the power and speed coefficients of each draft between the ballast and the scanlt are obtained. /// </summary> /// <param name="shipParticular">Ship Basic Data</param> /// <param name="seaTrialPowerToSpeedAtBallast">Power Speed Conversion factor(ballast)</param> /// <param name="seaTrialPowerToSpeedAtScant">Power Speed Conversion factor(scant)</param> /// <returns>각 10cm 별 power speed 계수 배열</returns> public static List <double[]> PowerToSpeedTable(SHIP_PARTICULAR shipParticular, dynamic ballastValues, dynamic scantlingValues) { double seatrialdraftScantling = (scantlingValues.DRAFT_FORE + scantlingValues.DRAFT_AFT) * 0.5; //Draft (Scantling) Fore , Draft (Scantling) Aft double seaTrialdraftBallast = (ballastValues.DRAFT_FORE + ballastValues.DRAFT_AFT) * 0.5; //Draft (Ballast) Fore, Draft (Ballast) Aft List <double[]> draftTable = new List <double[]> { }; double startDraft = Math.Truncate((seaTrialdraftBallast - 7) * 10); // ref draft -2 부터 시작 (-2는 여유분) int numerOfDraft = (int)((Math.Truncate((seatrialdraftScantling + 7) * 10)) - (Math.Truncate((seaTrialdraftBallast - 7) * 10))); // 스캔틀링까지 소수점 한자리 까지 검색, 기준 draft보다 -2 +2 만큼 큼 int numberOfPwer = (int)(shipParticular.ME_POWER_MCR / 200); //ME_POWER_MCr double[] powerTable = new double[numberOfPwer]; // 확인 완 200 씩 파워 간격을 띄움 --> 커브피팅 알고리즘으로 x 축 배열 double[] speedTable = new double[numberOfPwer]; // 확인 완 파워 간격 만큼 스피드를 계산 --> 커브피팅 알고리즘으로 y 축 배열s for (int i = 0; i < numerOfDraft; i++) // 드라프트 간격 0.1 만큼 해상도의 커프피팅 테이블을 만듦 { for (int j = 0; j < numberOfPwer; j++) { powerTable[j] = (j + 1) * 200; speedTable[j] = ((scantlingValues.B_POWER_TO_SPEED * Math.Pow(powerTable[j], scantlingValues.A_POWER_TO_SPEED) - ballastValues.B_POWER_TO_SPEED * Math.Pow(powerTable[j], ballastValues.A_POWER_TO_SPEED)) / // Seatrial PowerToSpeed(Scant') (seatrialdraftScantling - seaTrialdraftBallast) * ((i + startDraft) * 0.1 - seaTrialdraftBallast) + (ballastValues.B_POWER_TO_SPEED * Math.Pow(powerTable[j], ballastValues.A_POWER_TO_SPEED))); // Seatrial PowerToSpeed(Ballast') } var curve = CurveFitting.powerRegression(powerTable, speedTable); draftTable.Add(curve); } return(draftTable); }
/// <summary> /// 시운전 그래프를 기준으로 ballast와 scanlt 사이의 각 draft 별 power, speed 계수를 구하여 Json으로 리턴 /// </summary> /// <param name="shipParticular">선박제원정보</param> /// <param name="seaTrialPowerToSpeedAtBallast">Power Speed 변환계수(ballast)</param> /// <param name="seaTrialPowerToSpeedAtScant">Power Speed 변환계수(scant)</param> /// <returns>각 10cm 별 power speed 계수를 Json 형식으로 변환</returns> public JObject speedPowerTableJson(SHIP_PARTICULAR_DETAIL shipParticularDetail, SHIP_PARTICULAR_DETAIL standardData) { JObject result = new JObject(); double seatrialdraftScantling = (standardData.DRAFT_FORE_SCANTLING + standardData.DRAFT_AFT_SCANTLING) * 0.5; //Draft (Scantling) Fore , Draft (Scantling) Aft double seaTrialdraftBallast = (standardData.DRAFT_FORE_BALLAST + standardData.DRAFT_AFT_BALLAST) * 0.5; //Draft (Ballast) Fore, Draft (Ballast) Aft List <double[]> draftTable = new List <double[]> { }; double startDraft = Math.Truncate((seaTrialdraftBallast - 3) * 10); // ref draft -2 부터 시작 (-2는 여유분) int numerOfDraft = (int)((Math.Truncate((seatrialdraftScantling + 3) * 10)) - (Math.Truncate((seaTrialdraftBallast - 3) * 10))); // 스캔틀링까지 소수점 한자리 까지 검색, 기준 draft보다 -2 +2 만큼 큼 int numberOfPwer = (int)(shipParticularDetail.ME_POWER_MCR / 200); //ME_POWER_MCr double[] powerTable = new double[numberOfPwer]; // 확인 완 200 씩 파워 간격을 띄움 --> 커브피팅 알고리즘으로 x 축 배열 double[] speedTable = new double[numberOfPwer]; // 확인 완 파워 간격 만큼 스피드를 계산 --> 커브피팅 알고리즘으로 y 축 배열 var curveFitting = new CurveFitting(); for (int i = 0; i < numerOfDraft; i++) // 드라프트 간격 0.1 만큼 해상도의 커프피팅 테이블을 만듦 { for (int j = 0; j < numberOfPwer; j++) { powerTable[j] = (j + 1) * 200; speedTable[j] = ((standardData.B_SPEED_TO_POWER_SCANTLING * Math.Pow(powerTable[j], standardData.A_SPEED_TO_POWER_SCANTLING) - standardData.B_SPEED_TO_POWER_BALLAST * Math.Pow(powerTable[j], standardData.A_SPEED_TO_POWER_BALLAST)) / // Seatrial PowerToSpeed(Scant') (seatrialdraftScantling - seaTrialdraftBallast) * ((i + startDraft) * 0.1 - seaTrialdraftBallast) + (standardData.B_SPEED_TO_POWER_BALLAST * Math.Pow(powerTable[j], standardData.A_SPEED_TO_POWER_BALLAST))); // Seatrial PowerToSpeed(Ballast') } var curve = curveFitting.powerRegression(speedTable, powerTable); result.Add(((startDraft + i) / 10).ToString(), new JArray(curve[1], curve[2])); } return(result); }
private void DrawFittedCurve() { var curveFitting = new CurveFitting(dataSource, fittingModel); points.Clear(); points.AddRange(curveFitting.GetPoints.Select(p => new OxyPlot.DataPoint(p.X, p.Y)).ToList()); }
public double[] IttcWindCoeff(string shipType) //상대 풍향 풍속 --> 절대 풍향 풍속으로 변환하는 메소드 { var curvefitting = new CurveFitting(); double[] bulkDegree = new double[] { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180 }; double[] bulkCoeff = new double[] { -0.86962, -0.767089, -0.63038, -0.459494, -0.33038, -0.216456, -0.136709, -0.0759494, -0.0531646, 0, 0.0683544, 0.163291, 0.273418, 0.349367, 0.451899, 0.543038, 0.592405, 0.634177, 0.618987 }; double[] result; switch (shipType) { case "BULK_CARRIER": result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7); break; case "CONTAINER": result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7); break; case "CHEMICAL_CARRIER": result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7); break; default: result = curvefitting.polynominalRegression(bulkDegree, bulkCoeff, 7); break; } return(result); }
public static bool DataCompilation() { var functionResult = true; var ballastSpeedToPower = CurveFitting.powerRegression(ballastSpeedList.ToArray(), ballastPowerList.ToArray()); var ballastPowerToSpeed = CurveFitting.powerRegression(ballastPowerList.ToArray(), ballastSpeedList.ToArray()); var scantlingSpeedToPower = CurveFitting.powerRegression(scantlingSpeedList.ToArray(), scantlingPowerList.ToArray()); var scantlingPowerToSpeed = CurveFitting.powerRegression(scantlingPowerList.ToArray(), scantlingSpeedList.ToArray()); ballastValues.DRAFT_FORE = draft.BALLAST_DRAFT_FORE; ballastValues.DRAFT_AFT = draft.BALLAST_DRAFT_AFT; ballastValues.A_POWER_TO_SPEED = ballastPowerToSpeed[2]; ballastValues.B_POWER_TO_SPEED = ballastPowerToSpeed[1]; ballastValues.A_SPEED_TO_POWER = ballastSpeedToPower[2]; ballastValues.B_SPEED_TO_POWER = ballastSpeedToPower[1]; scantlingValues.DRAFT_FORE = draft.SCANTLING_DRAFT_FORE; scantlingValues.DRAFT_AFT = draft.SCANTLING_DRAFT_AFT; scantlingValues.A_POWER_TO_SPEED = scantlingPowerToSpeed[2]; scantlingValues.B_POWER_TO_SPEED = scantlingPowerToSpeed[1]; scantlingValues.A_SPEED_TO_POWER = scantlingSpeedToPower[2]; scantlingValues.B_SPEED_TO_POWER = scantlingSpeedToPower[1]; if (ballastValues == null || scantlingValues == null) { functionResult = false; } return(functionResult); }