/** * ������Է�������С���˽�Ĺ����淨 * * ����ʱ��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; }
/** * * @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; }
/** * ������Է�����һ��ʵ������ţ�ٷ� * * ����ʱ���븲�Ǽ��㷽����˺���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); }