Ejemplo n.º 1
0
        /**
         * ������Է�������С���˽�Ĺ����淨
         *
         * ����ʱ��1. �븲�Ǽ��㷽����˺���f(x)ֵ����ƫ����ֵ���麯��
         *              double Func(double[] x, double[] y)
         *        2. �븲�Ǽ����ſɱȾ��������麯��
         *              double FuncMJ(double[] x, double[] y)
         *
         * @param m - ���̵ĸ���
         * @param n - δ֪���ĸ���
         * @param x - һά���飬����Ϊn�����һ���ֵx0, x1, ��, xn-1��Ҫ��ȫΪ0��
         * 			����ʱ��ŷ��������С���˽⣬��m=nʱ�����Ƿ����Է�����Ľ�
         * @param eps1 - ��С���˽�ľ��ȿ��ƾ���
         * @param eps2 - ����ֵ�ֽ�ľ��ȿ��ƾ���
         * @return bool �ͣ�����Ƿ�ɹ�
         */
        public bool GetRootsetGinv(int m, int n, double[] x, double eps1, double eps2)
        {
            int i,j,k,l,kk,jt;
            double alpha,z=0,h2,y1,y2,y3,y0,h1;
            double[] p,d,dx;

            double[] y = new double[10];
            double[] b = new double[10];

            // ���Ʋ���
            int ka = Math.Max(m, n)+1;
            double[] w = new double[ka];

            // �趨��������Ϊ60���������
            l=60;
            alpha=1.0;
            while (l>0)
            {
                Matrix mtxP = new Matrix(m, n);
                Matrix mtxD = new Matrix(m, 1);
                p = mtxP.GetData();
                d = mtxD.GetData();

                Func(x,d);
                FuncMJ(x,p);

                // �������Է�����
                LEquations leqs = new LEquations(mtxP, mtxD);
                // ��ʱ����
                Matrix mtxAP = new Matrix();
                Matrix mtxU = new Matrix();
                Matrix mtxV = new Matrix();
                // �����
                Matrix mtxDX = new Matrix();
                // ���ڹ��������С���˽�
                if (! leqs.GetRootsetGinv(mtxDX, mtxAP, mtxU, mtxV, eps2))
                {
                    return false;
                }

                dx = mtxDX.GetData();

                j=0;
                jt=1;
                h2=0.0;
                while (jt==1)
                {
                    jt=0;
                    if (j<=2)
                        z=alpha+0.01*j;
                    else
                        z=h2;

                    for (i=0; i<=n-1; i++)
                        w[i]=x[i]-z*dx[i];

                    Func(w,d);

                    y1=0.0;
                    for (i=0; i<=m-1; i++)
                        y1=y1+d[i]*d[i];
                    for (i=0; i<=n-1; i++)
                        w[i]=x[i]-(z+0.00001)*dx[i];

                    Func(w,d);

                    y2=0.0;
                    for (i=0; i<=m-1; i++)
                        y2=y2+d[i]*d[i];

                    y0=(y2-y1)/0.00001;

                    if (Math.Abs(y0)>1.0e-10)
                    {
                        h1=y0; h2=z;
                        if (j==0)
                        {
                            y[0]=h1;
                            b[0]=h2;
                        }
                        else
                        {
                            y[j]=h1;
                            kk=0;
                            k=0;
                            while ((kk==0)&&(k<=j-1))
                            {
                                y3=h2-b[k];
                                if (Math.Abs(y3)+1.0==1.0)
                                    kk=1;
                                else
                                    h2=(h1-y[k])/y3;

                                k=k+1;
                            }

                            b[j]=h2;
                            if (kk!=0)
                                b[j]=1.0e+35;

                            h2=0.0;
                            for (k=j-1; k>=0; k--)
                                h2=-y[k]/(b[k+1]+h2);

                            h2=h2+b[0];
                        }

                        j=j+1;
                        if (j<=7)
                            jt=1;
                        else
                            z=h2;
                    }
                }

                alpha=z;
                y1=0.0;
                y2=0.0;
                for (i=0; i<=n-1; i++)
                {
                    dx[i]=-alpha*dx[i];
                    x[i]=x[i]+dx[i];
                    y1=y1+Math.Abs(dx[i]);
                    y2=y2+Math.Abs(x[i]);
                }

                // ���ɹ�
                if (y1<eps1*y2)
                {
                    return true;
                }

                l=l-1;
            }

            // ���ʧ��
            return false;
        }
Ejemplo n.º 2
0
        /**
         *
         * @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;
        }
Ejemplo n.º 3
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];

            // �������
            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);
        }