Ejemplo n.º 1
0
        /// <summary>
        /// 拟合参数
        /// </summary>
        public double [] FitParameters()
        {
            int rowA = ArrayY.Length;//行
            int colA = ParamCount;

            //coeffOfParams(m,n)
            double[][] A = Geo.Utils.MatrixUtil.Create(rowA, colA);
            //让 X 不变,如输出相同。!!!!2018.05.20,czs
            for (int i = 0; i < rowA; i++)
            {
                for (int j = 0; j < colA; j++)
                {
                    var x = ArrayX[i];
                    A[i][j] = Math.Pow(x, j);
                }
            }

            double[][] L = Geo.Utils.MatrixUtil.Create(rowA, 1);
            for (int i = 0; i < rowA; i++)
            {
                L[i][0] = ArrayY[i];
            }

            Adjust.ParamAdjuster ParamAdjuster = new Adjust.ParamAdjuster();
            var ad = ParamAdjuster.Run(new Adjust.AdjustObsMatrix(A, L));

            Parameters = ad.Estimated.OneDimArray;
            StdDev     = ad.StdDev;
            return(Parameters);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Kalman滤波计算不变参数。
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private AdjustResultMatrix GetSequentialConst(AdjustObsMatrix input)
        {
            WeightedVector appri = null;
            Matrix         B2    = input.BuildCoeefOfConstParam();

            if (LastConstResult != null)
            {
                var IsEqual = Geo.Utils.ListUtil.IsEqual(LastConstResult.ParamNames, input.SecondParamNames);
                if (IsEqual)
                {
                    appri = LastConstResult.Estimated;
                }
                else
                {
                    appri = SimpleAdjustMatrixBuilder.GetNewWeighedVectorInOrder(input.SecondParamNames, LastConstResult.Estimated);
                }
            }
            if (appri == null)//第一次,使用参数平差结果
            {
                ParamAdjuster paramAdjuster = new ParamAdjuster();
                var           paramResult   = paramAdjuster.Run(new AdjustObsMatrix(input.Observation, B2, null, input.SecondParamNames));
                appri = paramResult.Estimated;
            }

            AdjustObsMatrix obsMatrix1 = new AdjustObsMatrix(appri, input.Observation, B2, input.SecondTransfer);

            obsMatrix1.ParamNames = input.SecondParamNames;

            //var kalmanFilter = new SimpleKalmanFilter();

            var res = MatrixAdjuster.Run(obsMatrix1);

            return(res);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 恢复参数平差。
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private static AdjustResultMatrix GetSimpleParamAdjustResult(AdjustObsMatrix input)
        {
            #region 合并系数阵
            Matrix A = new Matrix(input.Coefficient.RowCount, input.Coefficient.ColCount + input.SecondCoefficient.ColCount);
            A.SetSub(input.Coefficient);
            A.SetSub(input.SecondCoefficient, 0, input.Coefficient.ColCount);
            var names = new List <string>();
            names.AddRange(input.ParamNames);
            names.AddRange(input.SecondParamNames);
            #endregion

            ParamAdjuster   paramAdjuster = new ParamAdjuster();
            AdjustObsMatrix adjustObs     = new AdjustObsMatrix(input.Observation, A, null, names);
            var             resultMatrix  = paramAdjuster.Run(adjustObs);
            return(resultMatrix);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 切比雪夫多项式拟合
        /// </summary>
        /// <param name="x"></param>
        /// <param name="xs"></param>
        /// <param name="ys"></param>
        /// <param name="order">参数数量=最高阶次+1</param>
        /// <returns></returns>
        public static double ChebyshevFit(double x, double[] xs, double[] ys, int order = 2)
        {
            int    xLen = xs.Length;
            double min  = Math.Min(xs[0], xs[xLen - 1]);
            double max  = Math.Max(xs[0], xs[xLen - 1]);

            double[][] A = MatrixUtil.Create(xLen, order);
            for (int i = 0; i < xLen; i++)
            {
                double scopeX = ToScope(xs[i], min, max);
                for (int j = 0; j < order; j++)
                {
                    A[i][j] = GetT(scopeX, j);
                }
            }

            double[] L = new double[xLen];
            for (int i = 0; i < xLen; i++)
            {
                L[i] = ys[i];
            }

            Adjust.ParamAdjuster pa = new Adjust.ParamAdjuster();
            var ad = pa.Run(new Adjust.AdjustObsMatrix(A, L));

            double[] param = ad.Estimated.OneDimArray;

            double result = 0;
            double smallX = ToScope(x, min, max);

            for (int i = 0; i < param.Length; i++)
            {
                result += param[i] * GetT(smallX, i);
            }
            return(result);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 具有约束条件的参数平差的无限权解法解算模糊度固定。
        /// </summary>
        /// <param name="totalFloat"></param>
        /// <param name="fixedAmbiguities"></param>
        /// <returns></returns>
        public WeightedVector GetResultByWeighedParamAdjust(WeightedVector totalFloat, WeightedVector fixedAmbiguities)
        {
            if (fixedAmbiguities.Count == 0)
            {
                return(totalFloat);
            }

            int totalParamCount = totalFloat.Count; //待估参数个数
            int fixedAmbiCount  = fixedAmbiguities.Count;

            //平差系数阵
            var PA = new Matrix(totalFloat.Weights);
            var LA = new Matrix((IVector)totalFloat, true)
            {
                RowNames = totalFloat.ParamNames
            };
            var A  = DiagonalMatrix.GetIdentity(totalParamCount);//A x = l
            var LB = new Matrix((IVector)fixedAmbiguities, true)
            {
                RowNames = fixedAmbiguities.ParamNames
            };
            var PB = new Matrix(fixedAmbiguities.Weights);

            Matrix B = BuildCoeefOfFixedToFloat(totalFloat, fixedAmbiguities);

            var BTBP = B.Trans * PB;

            //A 为单位阵,不需要计算
            var NA = PA;      //AT * P * A
            var UA = PA * LA; //AT * P * L

            UA.ColNames = new List <string>()
            {
                "Names"
            };
            NA.ColNames = totalFloat.ParamNames;
            UA.RowNames = totalFloat.ParamNames;
            NA.RowNames = totalFloat.ParamNames;


            var NB = BTBP * B;
            var UB = BTBP * LB;

            UB.ColNames = new List <string>()
            {
                "Names"
            };
            NB.ColNames = totalFloat.ParamNames;
            UB.RowNames = totalFloat.ParamNames;
            NB.RowNames = totalFloat.ParamNames;

            MatrixEquation neA = new MatrixEquation(NA, UA);
            MatrixEquation neB = new MatrixEquation(NB, UB);
            var            eq  = neA + neB;

            var result = eq.GetEstimated();

            //整体矩阵验证, 2018.10.20, czs, in hmx, 已经验证与整体平差一致,但是如果权太大如1e40,则可能出现舍入误差,而失真!!
            if (false)
            {
                Matrix AB = new Matrix(A.RowCount + B.RowCount, A.ColCount);
                AB.SetSub(A);
                AB.SetSub(B, A.ColCount);

                Matrix PAB = new Matrix(PA.RowCount + PB.RowCount);
                PAB.SetSub(PA);
                PAB.SetSub(PB, PA.RowCount, PA.ColCount);

                Vector LAB = new Vector(totalFloat);
                LAB.AddRange(fixedAmbiguities);

                ParamAdjuster paramAdjuster = new ParamAdjuster();
                var           result2       = paramAdjuster.Run(new AdjustObsMatrix(new WeightedVector(LAB, PAB.Inversion), AB));
            }
            return(result);
        }