示例#1
0
    //////////////////////////////////////////////////////////////////////
    // 求解第n[0,1,2]个邻域面片的交点,结果存入vIntersection
    // 无解及其他情况返回false!
    //////////////////////////////////////////////////////////////////////
    protected bool Solve3NPIntersection(List <int> lstN, ref Vector3 intersection)
    {
        int npCount = mLstNeighbors.Count;

        //输入无效
        if (lstN == null || lstN.Count < 3 ||
            lstN[0] < 0 || lstN[0] >= npCount ||
            lstN[1] < 0 || lstN[1] >= npCount ||
            lstN[2] < 0 || lstN[2] >= npCount)
        {
            return(false);
        }

        //构造线性方程组
        Matrix mtxCoef  = new Matrix(3, 3);             // 系数矩阵
        Matrix mtxConst = new Matrix(3, 1);             // 常数矩阵
        Matrix mtxResult;                               // 结果(3,1)

        for (int i = 0; i < 3; i++)
        {
            Patch pat = mLstNeighbors[lstN[i]].NeighborPatch;

            Vector3 v = pat.Normal;
            mtxCoef.SetElement(i, 0, v.x);
            mtxCoef.SetElement(i, 1, v.y);
            mtxCoef.SetElement(i, 2, v.z);
            mtxConst.SetElement(i, 0, pat.Dist);
        }

        //用高斯全选主元法求解
        LEquations le = new LEquations(mtxCoef, mtxConst);

        if (!le.GetRootsetGauss(out mtxResult))
        {
            return(false);
        }

        intersection.x = (float)mtxResult.GetElement(0, 0);
        intersection.y = (float)mtxResult.GetElement(1, 0);
        intersection.z = (float)mtxResult.GetElement(2, 0);

        return(true);
    }
示例#2
0
        /**
         * 求非线性方程组一组实根的拟牛顿法
         *
         * 调用时,须覆盖计算方程左端函数f(x)值及其偏导数值的虚函数
         *          double Func(double[] x, double[] y)
         *
         * @param n - 方程的个数,也是未知数的个数
         * @param x - 一维数组,长度为n,存放一组初值x0, x1, …, xn-1,
         *            返回时存放方程组的一组实根
         * @param t - 控制h大小的变量,0<t<1
         * @param h - 增量初值
         * @param nMaxIt - 迭代次数
         * @param eps - 控制精度
         * @return bool 型,求解是否成功
         */
        public bool GetRootsetNewton(int n, double[] x, double t, double h, int nMaxIt, double eps)
        {
            int    i, j, l;
            double am, z, beta, d;

            double[] y = new double[n];

            // 构造矩阵
            MatrixOfAlgorithm mtxCoef  = new MatrixOfAlgorithm(n, n);
            MatrixOfAlgorithm mtxConst = new MatrixOfAlgorithm(n, 1);

            double[] a = mtxCoef.GetData();
            double[] b = mtxConst.GetData();

            // 迭代求解
            l  = nMaxIt;
            am = 1.0 + eps;
            while (am >= eps)
            {
                Func(x, b);

                am = 0.0;
                for (i = 0; i <= n - 1; i++)
                {
                    z = Math.Abs(b[i]);
                    if (z > am)
                    {
                        am = z;
                    }
                }

                if (am >= eps)
                {
                    l = l - 1;
                    if (l == 0)
                    {
                        return(false);
                    }

                    for (j = 0; j <= n - 1; j++)
                    {
                        z    = x[j];
                        x[j] = x[j] + h;

                        Func(x, y);

                        for (i = 0; i <= n - 1; i++)
                        {
                            a[i * n + j] = y[i];
                        }

                        x[j] = z;
                    }

                    // 调用全选主元高斯消元法
                    LEquations        leqs      = new LEquations(mtxCoef, mtxConst);
                    MatrixOfAlgorithm mtxResult = new MatrixOfAlgorithm();
                    if (!leqs.GetRootsetGauss(mtxResult))
                    {
                        return(false);
                    }

                    mtxConst.SetValue(mtxResult);
                    b = mtxConst.GetData();

                    beta = 1.0;
                    for (i = 0; i <= n - 1; i++)
                    {
                        beta = beta - b[i];
                    }

                    if (beta == 0.0)
                    {
                        return(false);
                    }

                    d = h / beta;
                    for (i = 0; i <= n - 1; i++)
                    {
                        x[i] = x[i] - d * b[i];
                    }

                    h = t * h;
                }
            }

            // 是否在有效迭代次数内达到精度
            return(nMaxIt > l);
        }