/// <summary> /// 生产平差器 /// </summary> /// <param name="type"></param> /// <returns></returns> public static MatrixAdjuster Create(AdjustmentType type) { MatrixAdjuster Adjustment = null; switch (type) { case AdjustmentType.参数平差: Adjustment = new ParamAdjuster(); break; case AdjustmentType.条件平差: Adjustment = new ConditionalAdjuster(); break; case AdjustmentType.具有参数的条件平差: Adjustment = new ConditionalAdjusterWithParam(); break; case AdjustmentType.具有条件的参数平差: Adjustment = new ParamAdjusterWithCondition(); break; case AdjustmentType.卡尔曼滤波: Adjustment = new SimpleKalmanFilter(); // Adjustment = new KalmanFilter(); break; case AdjustmentType.均方根滤波: Adjustment = new SquareRootInformationFilter(); break; case AdjustmentType.序贯平差: Adjustment = new SequentialAdjuster(); break; case AdjustmentType.参数加权平差: Adjustment = new WeightedParamAdjuster(); break; case AdjustmentType.递归最小二乘: Adjustment = new RecursiveAdjuster(); break; case AdjustmentType.单期递归最小二乘: Adjustment = new SingleRecursiveAdjuster(); break; default: //Adjustment = new ParamAdjuster(); break; } if (Adjustment == null) { throw new Exception("尚未实现 " + type); } return(Adjustment); }
/// <summary> /// 模糊度固定解,条件平差。 /// </summary> /// <param name="result"></param> /// <param name="fixedPppAmbi"></param> private PppResult FixPppResult(PppResult result, Dictionary <SatelliteNumber, double> fixedPppAmbi) { if (fixedPppAmbi.Count < 2) { return(result); } var floadParams = result.ResultMatrix.Estimated; var paramCount = floadParams.Count; int fixedCount = fixedPppAmbi.Count; Vector fixedVector = new Vector();//fixedCount + 1 foreach (var item in fixedPppAmbi) { fixedVector.Add(item.Value, item.Key.ToString()); } //构建控制阵 Matrix constraintMatrix = new Matrix(fixedCount, paramCount); int baseColIndex = -1;// floadParams.ParamNames.IndexOf(this.CurrentBasePrn.ToString()); for (int i = 5; i < paramCount; i++) { var sat = SatelliteNumber.Parse(floadParams.ParamNames[i]); if (sat == CurrentBasePrn) { baseColIndex = i; break; } } for (int colIndex = 5; colIndex < paramCount; colIndex++) { var sat = SatelliteNumber.Parse(floadParams.ParamNames[colIndex]); int rowIndex = fixedVector.ParamNames.IndexOf(sat.ToString());//列编号与固定值对应 if (rowIndex == -1) { continue;//没有,略过 } constraintMatrix[rowIndex, baseColIndex] = -1; constraintMatrix[rowIndex, colIndex] = 1; } //条件平差 AdjustObsMatrix obsMatrix = new AdjustObsMatrix(); obsMatrix.SetCoefficient(constraintMatrix).SetObservation(floadParams).SetFreeVector(fixedVector); ConditionalAdjuster adjuster = new ConditionalAdjuster(); var resultMatrix = adjuster.Run(obsMatrix); result.ResultMatrix.Estimated = resultMatrix.CorrectedObs; return(result); }