Esempio n. 1
0
        /**
         * 求实系数代数方程全部根的QR方法
         *
         * @param n - 多项式方程的次数
         * @param dblCoef - 一维数组,长度为n+1,按降幂次序依次存放n次多项式方程的
         *                  n+1个系数
         * @param xr - 一维数组,长度为n,返回n个根的实部
         * @param xi - 一维数组,长度为n,返回n个根的虚部
         * @param nMaxIt - 迭代次数
         * @param eps - 精度控制参数
         * @return bool 型,求解是否成功
         */
        public bool GetRootQr(int n, double[] dblCoef, double[] xr, double[] xi, int nMaxIt, double eps)
        {
            // 初始化矩阵
            Matrix mtxQ = new Matrix();

            mtxQ.Init(n, n);
            double[] q = mtxQ.GetData();

            // 构造赫申伯格矩阵
            for (int j = 0; j <= n - 1; j++)
            {
                q[j] = -dblCoef[n - j - 1] / dblCoef[n];
            }

            for (int j = n; j <= n * n - 1; j++)
            {
                q[j] = 0.0;
            }

            for (int i = 0; i <= n - 2; i++)
            {
                q[(i + 1) * n + i] = 1.0;
            }

            // 求赫申伯格矩阵的特征值和特征向量,即为方程的解
            if (mtxQ.ComputeEvHBerg(xr, xi, nMaxIt, eps))
            {
                return(true);
            }

            return(false);
        }