/** * ��ϵ���������ȫѡ��Ԫ��˹��Լ����ȥ�� * * @param mtxCoefImag - ϵ��������鲿���� * @param mtxConstImag - ����������鲿���� * @param mtxResult - Matrix�����ط����������ʵ������ * @param mtxResultImag - Matrix�����ط�����������鲿���� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetGaussJordan(Matrix mtxCoefImag, Matrix mtxConstImag, Matrix mtxResult, Matrix mtxResultImag) { int l,k,i,j,nIs=0,u,v; double p,q,s,d; // ����������ԣ���������������� mtxResult.SetValue(mtxLEConst); mtxResultImag.SetValue(mtxConstImag); double[] pDataCoef = mtxLECoef.GetData(); double[] pDataConst = mtxResult.GetData(); double[] pDataCoefImag = mtxCoefImag.GetData(); double[] pDataConstImag = mtxResultImag.GetData(); int n = GetNumUnknowns(); int m = mtxLEConst.GetNumColumns(); // ��ʱ����������ű任������ int[] pnJs = new int[n]; // ��Ԫ for (k=0;k<=n-1;k++) { d=0.0; for (i=k;i<=n-1;i++) { for (j=k;j<=n-1;j++) { u=i*n+j; p=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u]; if (p>d) { d=p; pnJs[k]=j; nIs=i; } } } // ���ʧ�� if (d == 0.0) { return false; } if (nIs!=k) { for (j=k;j<=n-1;j++) { u=k*n+j; v=nIs*n+j; p=pDataCoef[u]; pDataCoef[u]=pDataCoef[v]; pDataCoef[v]=p; p=pDataCoefImag[u]; pDataCoefImag[u]=pDataCoefImag[v]; pDataCoefImag[v]=p; } for (j=0;j<=m-1;j++) { u=k*m+j; v=nIs*m+j; p=pDataConst[u]; pDataConst[u]=pDataConst[v]; pDataConst[v]=p; p=pDataConstImag[u]; pDataConstImag[u]=pDataConstImag[v]; pDataConstImag[v]=p; } } if (pnJs[k]!=k) { for (i=0;i<=n-1;i++) { u=i*n+k; v=i*n+pnJs[k]; p=pDataCoef[u]; pDataCoef[u]=pDataCoef[v]; pDataCoef[v]=p; p=pDataCoefImag[u]; pDataCoefImag[u]=pDataCoefImag[v]; pDataCoefImag[v]=p; } } v=k*n+k; for (j=k+1;j<=n-1;j++) { u=k*n+j; p=pDataCoef[u]*pDataCoef[v]; q=-pDataCoefImag[u]*pDataCoefImag[v]; s=(pDataCoef[v]-pDataCoefImag[v])*(pDataCoef[u]+pDataCoefImag[u]); pDataCoef[u]=(p-q)/d; pDataCoefImag[u]=(s-p-q)/d; } for (j=0;j<=m-1;j++) { u=k*m+j; p=pDataConst[u]*pDataCoef[v]; q=-pDataConstImag[u]*pDataCoefImag[v]; s=(pDataCoef[v]-pDataCoefImag[v])*(pDataConst[u]+pDataConstImag[u]); pDataConst[u]=(p-q)/d; pDataConstImag[u]=(s-p-q)/d; } for (i=0;i<=n-1;i++) { if (i!=k) { u=i*n+k; for (j=k+1;j<=n-1;j++) { v=k*n+j; l=i*n+j; p=pDataCoef[u]*pDataCoef[v]; q=pDataCoefImag[u]*pDataCoefImag[v]; s=(pDataCoef[u]+pDataCoefImag[u])*(pDataCoef[v]+pDataCoefImag[v]); pDataCoef[l]=pDataCoef[l]-p+q; pDataCoefImag[l]=pDataCoefImag[l]-s+p+q; } for (j=0;j<=m-1;j++) { l=i*m+j; v=k*m+j; p=pDataCoef[u]*pDataConst[v]; q=pDataCoefImag[u]*pDataConstImag[v]; s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[v]+pDataConstImag[v]); pDataConst[l]=pDataConst[l]-p+q; pDataConstImag[l]=pDataConstImag[l]-s+p+q; } } } } // ������ for (k=n-1;k>=0;k--) { if (pnJs[k]!=k) { for (j=0;j<=m-1;j++) { u=k*m+j; v=pnJs[k]*m+j; p=pDataConst[u]; pDataConst[u]=pDataConst[v]; pDataConst[v]=p; p=pDataConstImag[u]; pDataConstImag[u]=pDataConstImag[v]; pDataConstImag[v]=p; } } } return true; }
/** * ȫѡ��Ԫ��˹��ȥ�� * * @param mtxResult - Matrix�����ط�����Ľ� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetGauss(Matrix mtxResult) { int l,k,i,j,nIs=0,p,q; double d,t; // ����������ԣ���������������� mtxResult.SetValue(mtxLEConst); double[] pDataCoef = mtxLECoef.GetData(); double[] pDataConst = mtxResult.GetData(); int n = GetNumUnknowns(); // ��ʱ��������������� int[] pnJs = new int[n]; // ��Ԫ l=1; for (k=0;k<=n-2;k++) { d=0.0; for (i=k;i<=n-1;i++) { for (j=k;j<=n-1;j++) { t=Math.Abs(pDataCoef[i*n+j]); if (t>d) { d=t; pnJs[k]=j; nIs=i; } } } if (d == 0.0) l=0; else { if (pnJs[k]!=k) { for (i=0;i<=n-1;i++) { p=i*n+k; q=i*n+pnJs[k]; t=pDataCoef[p]; pDataCoef[p]=pDataCoef[q]; pDataCoef[q]=t; } } if (nIs!=k) { for (j=k;j<=n-1;j++) { p=k*n+j; q=nIs*n+j; t=pDataCoef[p]; pDataCoef[p]=pDataCoef[q]; pDataCoef[q]=t; } t=pDataConst[k]; pDataConst[k]=pDataConst[nIs]; pDataConst[nIs]=t; } } // ���ʧ�� if (l==0) { return false; } d=pDataCoef[k*n+k]; for (j=k+1;j<=n-1;j++) { p=k*n+j; pDataCoef[p]=pDataCoef[p]/d; } pDataConst[k]=pDataConst[k]/d; for (i=k+1;i<=n-1;i++) { for (j=k+1;j<=n-1;j++) { p=i*n+j; pDataCoef[p]=pDataCoef[p]-pDataCoef[i*n+k]*pDataCoef[k*n+j]; } pDataConst[i]=pDataConst[i]-pDataCoef[i*n+k]*pDataConst[k]; } } // ���ʧ�� d=pDataCoef[(n-1)*n+n-1]; if (d == 0.0) { return false; } // ��� pDataConst[n-1]=pDataConst[n-1]/d; for (i=n-2;i>=0;i--) { t=0.0; for (j=i+1;j<=n-1;j++) t=t+pDataCoef[i*n+j]*pDataConst[j]; pDataConst[i]=pDataConst[i]-t; } // �������λ�� pnJs[n-1]=n-1; for (k=n-1;k>=0;k--) { if (pnJs[k]!=k) { t=pDataConst[k]; pDataConst[k]=pDataConst[pnJs[k]]; pDataConst[pnJs[k]]=t; } } return true; }
/** * ȫѡ��Ԫ��˹��Լ����ȥ�� * * @param mtxResult - Matrix�����ط�����Ľ� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetGaussJordan(Matrix mtxResult) { int l,k,i,j,nIs=0,p,q; double d,t; // ����������ԣ���������������� mtxResult.SetValue(mtxLEConst); double[] pDataCoef = mtxLECoef.GetData(); double[] pDataConst = mtxResult.GetData(); int n = GetNumUnknowns(); int m = mtxLEConst.GetNumColumns(); // ��ʱ����������ű任������ int[] pnJs = new int[n]; // ��Ԫ l=1; for (k=0;k<=n-1;k++) { d=0.0; for (i=k;i<=n-1;i++) { for (j=k;j<=n-1;j++) { t=Math.Abs(pDataCoef[i*n+j]); if (t>d) { d=t; pnJs[k]=j; nIs=i; } } } if (d+1.0==1.0) l=0; else { if (pnJs[k]!=k) { for (i=0;i<=n-1;i++) { p=i*n+k; q=i*n+pnJs[k]; t=pDataCoef[p]; pDataCoef[p]=pDataCoef[q]; pDataCoef[q]=t; } } if (nIs!=k) { for (j=k;j<=n-1;j++) { p=k*n+j; q=nIs*n+j; t=pDataCoef[p]; pDataCoef[p]=pDataCoef[q]; pDataCoef[q]=t; } for (j=0;j<=m-1;j++) { p=k*m+j; q=nIs*m+j; t=pDataConst[p]; pDataConst[p]=pDataConst[q]; pDataConst[q]=t; } } } // ���ʧ�� if (l==0) { return false; } d=pDataCoef[k*n+k]; for (j=k+1;j<=n-1;j++) { p=k*n+j; pDataCoef[p]=pDataCoef[p]/d; } for (j=0;j<=m-1;j++) { p=k*m+j; pDataConst[p]=pDataConst[p]/d; } for (j=k+1;j<=n-1;j++) { for (i=0;i<=n-1;i++) { p=i*n+j; if (i!=k) pDataCoef[p]=pDataCoef[p]-pDataCoef[i*n+k]*pDataCoef[k*n+j]; } } for (j=0;j<=m-1;j++) { for (i=0;i<=n-1;i++) { p=i*m+j; if (i!=k) pDataConst[p]=pDataConst[p]-pDataCoef[i*n+k]*pDataConst[k*m+j]; } } } // ���� for (k=n-1;k>=0;k--) { if (pnJs[k]!=k) { for (j=0;j<=m-1;j++) { p=k*m+j; q=pnJs[k]*m+j; t=pDataConst[p]; pDataConst[p]=pDataConst[q]; pDataConst[q]=t; } } } return true; }
/** * ���Գ������������ƽ������ * * @param mtxResult - CMatrix���ö����ط��������� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetCholesky(Matrix mtxResult) { int i,j,k,u,v; // ���������ԣ���������������� Matrix mtxCoef = new Matrix(mtxLECoef); mtxResult.SetValue(mtxLEConst); int n = mtxCoef.GetNumColumns(); int m = mtxResult.GetNumColumns(); double[] pDataCoef = mtxCoef.GetData(); double[] pDataConst = mtxResult.GetData(); // �ǶԳ�����ϵ���������ñ�������� if (pDataCoef[0] <= 0.0) return false; pDataCoef[0]=Math.Sqrt(pDataCoef[0]); for (j=1; j<=n-1; j++) pDataCoef[j]=pDataCoef[j]/pDataCoef[0]; for (i=1; i<=n-1; i++) { u=i*n+i; for (j=1; j<=i; j++) { v=(j-1)*n+i; pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]; } if (pDataCoef[u] <= 0.0) return false; pDataCoef[u]=Math.Sqrt(pDataCoef[u]); if (i!=(n-1)) { for (j=i+1; j<=n-1; j++) { v=i*n+j; for (k=1; k<=i; k++) pDataCoef[v]=pDataCoef[v]-pDataCoef[(k-1)*n+i]*pDataCoef[(k-1)*n+j]; pDataCoef[v]=pDataCoef[v]/pDataCoef[u]; } } } for (j=0; j<=m-1; j++) { pDataConst[j]=pDataConst[j]/pDataCoef[0]; for (i=1; i<=n-1; i++) { u=i*n+i; v=i*m+j; for (k=1; k<=i; k++) pDataConst[v]=pDataConst[v]-pDataCoef[(k-1)*n+i]*pDataConst[(k-1)*m+j]; pDataConst[v]=pDataConst[v]/pDataCoef[u]; } } for (j=0; j<=m-1; j++) { u=(n-1)*m+j; pDataConst[u]=pDataConst[u]/pDataCoef[n*n-1]; for (k=n-1; k>=1; k--) { u=(k-1)*m+j; for (i=k; i<=n-1; i++) { v=(k-1)*n+i; pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[i*m+j]; } v=(k-1)*n+k-1; pDataConst[u]=pDataConst[u]/pDataCoef[v]; } } return true; }
/** * ���ԳƷ�����ķֽⷨ * * @param mtxResult - CMatrix���ö����ط��������� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetDjn(Matrix mtxResult) { int i,j,l,k,u,v,w,k1,k2,k3; double p; // ���������ԣ���������������� Matrix mtxCoef = new Matrix(mtxLECoef); mtxResult.SetValue(mtxLEConst); int n = mtxCoef.GetNumColumns(); int m = mtxResult.GetNumColumns(); double[] pDataCoef = mtxCoef.GetData(); double[] pDataConst = mtxResult.GetData(); // �ǶԳ�ϵ���������ñ�������� if (pDataCoef[0] == 0.0) return false; for (i=1; i<=n-1; i++) { u=i*n; pDataCoef[u]=pDataCoef[u]/pDataCoef[0]; } for (i=1; i<=n-2; i++) { u=i*n+i; for (j=1; j<=i; j++) { v=i*n+j-1; l=(j-1)*n+j-1; pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]*pDataCoef[l]; } p=pDataCoef[u]; if (p == 0.0) return false; for (k=i+1; k<=n-1; k++) { u=k*n+i; for (j=1; j<=i; j++) { v=k*n+j-1; l=i*n+j-1; w=(j-1)*n+j-1; pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[l]*pDataCoef[w]; } pDataCoef[u]=pDataCoef[u]/p; } } u=n*n-1; for (j=1; j<=n-1; j++) { v=(n-1)*n+j-1; w=(j-1)*n+j-1; pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]*pDataCoef[w]; } p=pDataCoef[u]; if (p == 0.0) return false; for (j=0; j<=m-1; j++) { for (i=1; i<=n-1; i++) { u=i*m+j; for (k=1; k<=i; k++) { v=i*n+k-1; w=(k-1)*m+j; pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[w]; } } } for (i=1; i<=n-1; i++) { u=(i-1)*n+i-1; for (j=i; j<=n-1; j++) { v=(i-1)*n+j; w=j*n+i-1; pDataCoef[v]=pDataCoef[u]*pDataCoef[w]; } } for (j=0; j<=m-1; j++) { u=(n-1)*m+j; pDataConst[u]=pDataConst[u]/p; for (k=1; k<=n-1; k++) { k1=n-k; k3=k1-1; u=k3*m+j; for (k2=k1; k2<=n-1; k2++) { v=k3*n+k2; w=k2*m+j; pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[w]; } pDataConst[u]=pDataConst[u]/pDataCoef[k3*n+k3]; } } return true; }
/** * ������Խ��߷�������Ϸ� * * @param mtxResult - Matrix�����ط��������� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetTriDiagonal(Matrix mtxResult) { int k,j; double s; // ��������������� mtxResult.SetValue(mtxLEConst); double[] pDataConst = mtxResult.GetData(); int n = GetNumUnknowns(); if (mtxLECoef.GetNumRows() != n) return false; // Ϊϵ������Խ�����������ڴ� double[] pDiagData = new double[3*n-2]; // ����ϵ������Խ���Ԫ������ k = j = 0; if (k == 0) { pDiagData[j++] = mtxLECoef.GetElement(k, k); pDiagData[j++] = mtxLECoef.GetElement(k, k+1); } for (k=1; k<n-1; ++k) { pDiagData[j++] = mtxLECoef.GetElement(k, k-1); pDiagData[j++] = mtxLECoef.GetElement(k, k); pDiagData[j++] = mtxLECoef.GetElement(k, k+1); } if (k == n-1) { pDiagData[j++] = mtxLECoef.GetElement(k, k-1); pDiagData[j++] = mtxLECoef.GetElement(k, k); } // ��� for (k=0;k<=n-2;k++) { j=3*k; s=pDiagData[j]; // ���ʧ�� if (Math.Abs(s)+1.0==1.0) { return false; } pDiagData[j+1]=pDiagData[j+1]/s; pDataConst[k]=pDataConst[k]/s; pDiagData[j+3]=pDiagData[j+3]-pDiagData[j+2]*pDiagData[j+1]; pDataConst[k+1]=pDataConst[k+1]-pDiagData[j+2]*pDataConst[k]; } s=pDiagData[3*n-3]; if (s == 0.0) { return false; } // ���� pDataConst[n-1]=pDataConst[n-1]/s; for (k=n-2;k>=0;k--) pDataConst[k]=pDataConst[k]-pDiagData[3*k+1]*pDataConst[k+1]; return true; }
/** * ���������С��������ĺ�˹�ɶ��±任�� * * @param mtxResult - Matrix�����ط��������� * @param mtxQ - Matrix�����غ�˹�ɶ��±任��Q���� * @param mtxR - Matrix�����غ�˹�ɶ��±任��R���� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetMqr(Matrix mtxResult, Matrix mtxQ, Matrix mtxR) { int i,j; double d; // ������ķ�������δ֪������ int m = mtxLECoef.GetNumRows(); int n = mtxLECoef.GetNumColumns(); // ���췽���� if (m < n) return false; // ����������ʼ��Ϊ�������� mtxResult.SetValue(mtxLEConst); double[] pDataConst = mtxResult.GetData(); // ������ʱ��������QR�ֽ� mtxR.SetValue(mtxLECoef); double[] pDataCoef = mtxR.GetData(); // QR�ֽ� if (! mtxR.SplitQR(mtxQ)) return false; // ��ʱ������ double[] c = new double[n]; double[] q = mtxQ.GetData(); // ��� for (i=0; i<=n-1; i++) { d=0.0; for (j=0; j<=m-1; j++) d=d+q[j*m+i]*pDataConst[j]; c[i]=d; } pDataConst[n-1]=c[n-1]/pDataCoef[n*n-1]; for (i=n-2; i>=0; i--) { d=0.0; for (j=i+1; j<=n-1; j++) d=d+pDataCoef[i*n+j]*pDataConst[j]; pDataConst[i]=(c[i]-d)/pDataCoef[i*n+i]; } return true; }
/** * ������ϡ�跽�����ȫѡ��Ԫ��˹��Լȥ��ȥ�� * * @param mtxResult - CMatrix���ö����ط��������� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetGgje(Matrix mtxResult) { int i,j,k,nIs=0,u,v; double d,t; // ���������ԣ���������������� Matrix mtxCoef = new Matrix(mtxLECoef); mtxResult.SetValue(mtxLEConst); int n = mtxCoef.GetNumColumns(); double[] pDataCoef = mtxCoef.GetData(); double[] pDataConst = mtxResult.GetData(); // ��ʱ����������ű任������ int[] pnJs = new int[n]; // ��Ԫ for (k=0; k<=n-1; k++) { d=0.0; for (i=k; i<=n-1; i++) { for (j=k; j<=n-1; j++) { t=Math.Abs(pDataCoef[i*n+j]); if (t>d) { d=t; pnJs[k]=j; nIs=i; } } } if (d == 0.0) { return false; } if (nIs!=k) { for (j=k; j<=n-1; j++) { u=k*n+j; v=nIs*n+j; t=pDataCoef[u]; pDataCoef[u]=pDataCoef[v]; pDataCoef[v]=t; } t=pDataConst[k]; pDataConst[k]=pDataConst[nIs]; pDataConst[nIs]=t; } if (pnJs[k]!=k) { for (i=0; i<=n-1; i++) { u=i*n+k; v=i*n+pnJs[k]; t=pDataCoef[u]; pDataCoef[u]=pDataCoef[v]; pDataCoef[v]=t; } } t=pDataCoef[k*n+k]; for (j=k+1; j<=n-1; j++) { u=k*n+j; if (pDataCoef[u]!=0.0) pDataCoef[u]=pDataCoef[u]/t; } pDataConst[k]=pDataConst[k]/t; for (j=k+1; j<=n-1; j++) { u=k*n+j; if (pDataCoef[u]!=0.0) { for (i=0; i<=n-1; i++) { v=i*n+k; if ((i!=k)&&(pDataCoef[v]!=0.0)) { nIs=i*n+j; pDataCoef[nIs]=pDataCoef[nIs]-pDataCoef[v]*pDataCoef[u]; } } } } for (i=0; i<=n-1; i++) { u=i*n+k; if ((i!=k)&&(pDataCoef[u]!=0.0)) pDataConst[i]=pDataConst[i]-pDataCoef[u]*pDataConst[k]; } } // ���� for (k=n-1; k>=0; k--) { if (k!=pnJs[k]) { t=pDataConst[k]; pDataConst[k]=pDataConst[pnJs[k]]; pDataConst[pnJs[k]]=t; } } return true; }
/** * һ����ͷ��������� * * @param nBandWidth - ���� * @param mtxResult - Matrix�����ط��������� * @return bool �ͣ�����������Ƿ�ɹ� */ public bool GetRootsetBand(int nBandWidth, Matrix mtxResult) { int ls,k,i,j,nis=0,u,v; double p,t; // �������Ϊ���� if ((nBandWidth-1)%2 != 0) return false; // ��������������� mtxResult.SetValue(mtxLEConst); double[] pDataConst = mtxResult.GetData(); // ���������� int m = mtxLEConst.GetNumColumns(); int n = GetNumUnknowns(); if (mtxLECoef.GetNumRows() != n) return false; // �������飺���;������Ч���� double[] pBandData = new double[nBandWidth*n]; // ����� ls = (nBandWidth-1)/2; // ����������� for (i=0; i<n; ++i) { j = 0; for (k=Math.Max(0, i-ls); k<Math.Max(0, i-ls)+nBandWidth; ++k) { if (k < n) pBandData[i*nBandWidth+j++] = mtxLECoef.GetElement(i, k); else pBandData[i*nBandWidth+j++] = 0; } } // ��� for (k=0;k<=n-2;k++) { p=0.0; for (i=k;i<=ls;i++) { t=Math.Abs(pBandData[i*nBandWidth]); if (t>p) { p=t; nis=i; } } if (p == 0.0) { return false; } for (j=0;j<=m-1;j++) { u=k*m+j; v=nis*m+j; t=pDataConst[u]; pDataConst[u]=pDataConst[v]; pDataConst[v]=t; } for (j=0;j<=nBandWidth-1;j++) { u=k*nBandWidth+j; v=nis*nBandWidth+j; t=pBandData[u]; pBandData[u]=pBandData[v]; pBandData[v]=t; } for (j=0;j<=m-1;j++) { u=k*m+j; pDataConst[u]=pDataConst[u]/pBandData[k*nBandWidth]; } for (j=1;j<=nBandWidth-1;j++) { u=k*nBandWidth+j; pBandData[u]=pBandData[u]/pBandData[k*nBandWidth]; } for (i=k+1;i<=ls;i++) { t=pBandData[i*nBandWidth]; for (j=0;j<=m-1;j++) { u=i*m+j; v=k*m+j; pDataConst[u]=pDataConst[u]-t*pDataConst[v]; } for (j=1;j<=nBandWidth-1;j++) { u=i*nBandWidth+j; v=k*nBandWidth+j; pBandData[u-1]=pBandData[u]-t*pBandData[v]; } u=i*nBandWidth+nBandWidth-1; pBandData[u]=0.0; } if (ls!=(n-1)) ls=ls+1; } p=pBandData[(n-1)*nBandWidth]; if (p == 0.0) { return false; } for (j=0;j<=m-1;j++) { u=(n-1)*m+j; pDataConst[u]=pDataConst[u]/p; } ls=1; for (i=n-2;i>=0;i--) { for (k=0;k<=m-1;k++) { u=i*m+k; for (j=1;j<=ls;j++) { v=i*nBandWidth+j; nis=(i+j)*m+k; pDataConst[u]=pDataConst[u]-pBandData[v]*pDataConst[nis]; } } if (ls!=(nBandWidth-1)) ls=ls+1; } 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); }