GetRootsetGauss() public method

public GetRootsetGauss ( Matrix mtxResult ) : bool
mtxResult Matrix
return bool
コード例 #1
0
ファイル: LEquations.cs プロジェクト: callme119/civil
        /**
         *
         * @param mtxResult - Matrix���󣬷��ط���������
         * @param nMaxIt - ���Ӵ���
         * @param eps - ���ƾ���
         * @return bool �ͣ�����������Ƿ�ɹ�
         */
        public bool GetRootsetMorbid(Matrix mtxResult, int nMaxIt /*= 60*/, double eps)
        {
            int i, k;
            double q, qq;

            // ���̵Ľ���
            int n = GetNumUnknowns();

            // �趨��������, ȱʡΪ60
            i = nMaxIt;

            // ��ȫѡ��Ԫ��˹��Ԫ�����
            LEquations leqs = new LEquations(mtxLECoef, mtxLEConst);
            if (! leqs.GetRootsetGauss(mtxResult))
                return false;
            double[] x = mtxResult.GetData();

            q=1.0+eps;
            while (q>=eps)
            {
                // ���������Ѵ����ֵ����Ϊ��ý�������ʧ��
                if (i==0)
                    return false;

                // ����������1
                i=i-1;

                // ��������
                Matrix mtxE = mtxLECoef.Multiply(mtxResult);
                Matrix mtxR = mtxLEConst.Subtract(mtxE);

                // ��ȫѡ��Ԫ��˹��Ԫ�����
                leqs = new LEquations(mtxLECoef, mtxR);
                Matrix mtxRR = new Matrix();
                if (! leqs.GetRootsetGauss(mtxRR))
                    return false;

                double[] r = mtxRR.GetData();

                q=0.0;
                for ( k=0; k<=n-1; k++)
                {
                    qq=Math.Abs(r[k])/(1.0+Math.Abs(x[k]+r[k]));
                    if (qq>q)
                        q=qq;
                }

                for ( k=0; k<=n-1; k++)
                    x[k]=x[k]+r[k];

            }

            // ���ɹ�
            return true;
        }
コード例 #2
0
ファイル: NLEquations.cs プロジェクト: callme119/civil
        /**
         * ������Է�����һ��ʵ������ţ�ٷ�
         *
         * ����ʱ���븲�Ǽ��㷽����˺���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];

            // �������
            Matrix mtxCoef = new Matrix(n, n);
            Matrix mtxConst = new Matrix(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);
                    Matrix mtxResult = new Matrix();
                    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);
        }