Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }