间接平差程序实现

 首先要包含我上一篇中的那个矩阵库。


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

namespace CMath
{
    /// <summary>
    /// 线性方程,即Bx+V=0
    /// </summary>
    public class Indirect
    {
        public Matrix B
        {
            get;
            set;
        }
        public Matrix l
        {
            get;
            set;
        }
        public Matrix P
        {
            get;
            set;
        }
        /// <summary>
        /// x的维数
        /// </summary>
        public int N
        {
            get
            {
                return B.Rows;
            }
        }
        /// <summary>
        /// 初始化方程
        /// </summary>
        /// <param name="B">系数矩阵</param>
        /// <param name="l">观测值</param>
        /// <param name="P">权阵,若为null,则初始化一个E</param>
        public Indirect(Matrix B, Matrix l, Matrix P = null)
        {
            if (B.Rows != l.Rows)
            {
                throw new Exception("B和V的行数不相等");
            }
            else
            {
                this.B = B;
                this.l = l;
                if (P == null)
                {
                    double[,] E=new double[B.Rows,B.Rows];
                    for (int i = 0; i < B.Rows; i++)
                    {
                        for (int j = 0; j < B.Rows; j++)
                        {
                            if (i == j)
                            {
                                E[i, j] = 1;
                            }
                        }
                    }
                    this.P = new Matrix(E);
                }
                else
                {
                    this.P = P;
                }
            }
        }
        #region 求解方程
        public Matrix GetN()
        {
            return this.B.Transpose() * this.P * this.B;
        }
        public Matrix GetW()
        {
            return this.B.Transpose() * this.P * this.l;
        }
        public Matrix Getx()
        {
            return this.GetN().Inverse() * this.GetW();
        }
        public Matrix GetV()
        {
            return this.B * this.Getx() - this.l;
        }
        public double GetSigma()
        {
            return Math.Sqrt((GetV().Transpose() * P * GetV())[0, 0] / (B.Rows-B.Cols));
        }
        public Matrix GetQvv()
        {
            return P.Inverse() - B * GetN().Inverse() * B.Transpose();
        }
        #endregion 
        public override string ToString()
        {
            Matrix V = this.GetV();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < this.N; i++)
            {
                for (int j = 0; j < B.Cols; j++)
                    sb.Append(B[i, j] + " ");
                for (int j = 0; j < V.Cols; j++)
                {
                    //是否要加空格
                    string flag = "";
                    if (j != V.Cols - 1) flag = "  ";
                    sb.Append(V[i, j] + flag);
                }
                //判断是否换行
                string lineflag = "";
                if (i != this.N - 1) lineflag = Environment.NewLine;
                sb.Append(lineflag);
            }
            return sb.ToString();
        }
    }
}

 

posted @ 2016-10-18 08:41  啊王会  阅读(1805)  评论(1编辑  收藏  举报