LEquations.cpp
上传用户:weigute
上传日期:2007-03-02
资源大小:1287k
文件大小:29k
源码类别:

数学计算

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // LEquations.cpp
  3. //
  4. // 求解线性方程组的类 CLEquations 的实现代码
  5. //
  6. // 周长发编制, 2002/8
  7. //////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "LEquations.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CLEquations::CLEquations()
  19. {
  20. }
  21. CLEquations::CLEquations(const CMatrix& mtxCoef, const CMatrix& mtxConst)
  22. {
  23. ASSERT(Init(mtxCoef, mtxConst));
  24. }
  25. CLEquations::~CLEquations()
  26. {
  27. }
  28. BOOL CLEquations::Init(const CMatrix& mtxCoef, const CMatrix& mtxConst)
  29. {
  30. if (mtxCoef.GetNumRows() != mtxConst.GetNumRows())
  31. return FALSE;
  32. m_mtxCoef = mtxCoef;
  33. m_mtxConst = mtxConst;
  34. return TRUE;
  35. }
  36. // 全选主元高斯消去法
  37. BOOL CLEquations::GetRootsetGauss(CMatrix& mtxResult)
  38. int *pnJs,l,k,i,j,nIs,p,q;
  39.     double d,t;
  40. mtxResult = m_mtxConst;
  41. double *pDataCoef = m_mtxCoef.GetData();
  42. double *pDataConst = mtxResult.GetData();
  43. int n = GetNumUnknowns();
  44.     pnJs = new int[n];
  45.     l=1;
  46.     for (k=0;k<=n-2;k++)
  47.     { 
  48. d=0.0;
  49.         for (i=k;i<=n-1;i++)
  50. {
  51. for (j=k;j<=n-1;j++)
  52.             { 
  53. t=fabs(pDataCoef[i*n+j]);
  54. if (t>d) 
  55. d=t; 
  56. pnJs[k]=j; 
  57. nIs=i;
  58. }
  59.             }
  60. }
  61.         if (d == 0.0) 
  62. l=0;
  63.         else
  64.         { 
  65. if (pnJs[k]!=k)
  66.             {
  67. for (i=0;i<=n-1;i++)
  68.                 { 
  69. p=i*n+k; 
  70. q=i*n+pnJs[k];
  71. t=pDataCoef[p]; 
  72. pDataCoef[p]=pDataCoef[q]; 
  73. pDataCoef[q]=t;
  74.                 }
  75. }
  76.             if (nIs!=k)
  77.             { 
  78. for (j=k;j<=n-1;j++)
  79.                 { 
  80. p=k*n+j; 
  81. q=nIs*n+j;
  82.                     t=pDataCoef[p]; 
  83. pDataCoef[p]=pDataCoef[q]; 
  84. pDataCoef[q]=t;
  85.                 }
  86.                 
  87. t=pDataConst[k]; 
  88. pDataConst[k]=pDataConst[nIs]; 
  89. pDataConst[nIs]=t;
  90.             }
  91.         }
  92.         
  93. if (l==0)
  94.         { 
  95. delete[] pnJs;
  96.             return FALSE;
  97.         }
  98.         
  99. d=pDataCoef[k*n+k];
  100.         for (j=k+1;j<=n-1;j++)
  101.         { 
  102. p=k*n+j; 
  103. pDataCoef[p]=pDataCoef[p]/d;
  104. }
  105.         
  106. pDataConst[k]=pDataConst[k]/d;
  107.         for (i=k+1;i<=n-1;i++)
  108.         { 
  109. for (j=k+1;j<=n-1;j++)
  110.             { 
  111. p=i*n+j;
  112.                 pDataCoef[p]=pDataCoef[p]-pDataCoef[i*n+k]*pDataCoef[k*n+j];
  113.             }
  114.             
  115. pDataConst[i]=pDataConst[i]-pDataCoef[i*n+k]*pDataConst[k];
  116.         }
  117.     }
  118.     
  119. d=pDataCoef[(n-1)*n+n-1];
  120.     if (d == 0.0)
  121. delete[] pnJs;
  122. return FALSE;
  123. }
  124.     pDataConst[n-1]=pDataConst[n-1]/d;
  125.     for (i=n-2;i>=0;i--)
  126.     { 
  127. t=0.0;
  128.         for (j=i+1;j<=n-1;j++)
  129. t=t+pDataCoef[i*n+j]*pDataConst[j];
  130.         pDataConst[i]=pDataConst[i]-t;
  131.     }
  132.     
  133. pnJs[n-1]=n-1;
  134.     for (k=n-1;k>=0;k--)
  135.     {
  136. if (pnJs[k]!=k)
  137.         { 
  138. t=pDataConst[k]; 
  139. pDataConst[k]=pDataConst[pnJs[k]]; 
  140. pDataConst[pnJs[k]]=t;
  141. }
  142. }
  143.     delete[] pnJs;
  144.     return TRUE;
  145. }
  146. // 全选主元高斯-约当消去法
  147. BOOL CLEquations::GetRootsetGaussJordan(CMatrix& mtxResult)
  148. int *pnJs,l,k,i,j,nIs,p,q;
  149.     double d,t;
  150. mtxResult = m_mtxConst;
  151. double *pDataCoef = m_mtxCoef.GetData();
  152. double *pDataConst = mtxResult.GetData();
  153. int n = GetNumUnknowns();
  154. int m = m_mtxConst.GetNumColumns();
  155.     pnJs = new int[n];
  156.     l=1;
  157.     for (k=0;k<=n-1;k++)
  158.     { 
  159. d=0.0;
  160.         for (i=k;i<=n-1;i++)
  161.         {
  162. for (j=k;j<=n-1;j++)
  163.             { 
  164. t=fabs(pDataCoef[i*n+j]);
  165. if (t>d) 
  166. d=t; 
  167. pnJs[k]=j; 
  168. nIs=i;
  169. }
  170.             }
  171. }
  172.         if (d+1.0==1.0) 
  173. l=0;
  174.         else
  175.         { 
  176. if (pnJs[k]!=k)
  177.             {
  178. for (i=0;i<=n-1;i++)
  179.                 { 
  180. p=i*n+k; 
  181. q=i*n+pnJs[k];
  182. t=pDataCoef[p]; 
  183. pDataCoef[p]=pDataCoef[q]; 
  184. pDataCoef[q]=t;
  185.                 }
  186. }
  187.             if (nIs!=k)
  188.             { 
  189. for (j=k;j<=n-1;j++)
  190.                 { 
  191. p=k*n+j; 
  192. q=nIs*n+j;
  193.                     t=pDataCoef[p]; 
  194. pDataCoef[p]=pDataCoef[q]; 
  195. pDataCoef[q]=t;
  196.                 }
  197.                 
  198. for (j=0;j<=m-1;j++)
  199.                 { 
  200. p=k*m+j; 
  201. q=nIs*m+j;
  202.                     t=pDataConst[p]; 
  203. pDataConst[p]=pDataConst[q]; 
  204. pDataConst[q]=t;
  205.                 }
  206.             }
  207.         }
  208.         
  209. if (l==0)
  210.         { 
  211. delete[] pnJs;
  212.             return FALSE;
  213.         }
  214.         
  215. d=pDataCoef[k*n+k];
  216.         for (j=k+1;j<=n-1;j++)
  217.         { 
  218. p=k*n+j; 
  219. pDataCoef[p]=pDataCoef[p]/d;
  220. }
  221.         
  222. for (j=0;j<=m-1;j++)
  223.         { 
  224. p=k*m+j; 
  225. pDataConst[p]=pDataConst[p]/d;
  226. }
  227.         
  228. for (j=k+1;j<=n-1;j++)
  229.         {
  230. for (i=0;i<=n-1;i++)
  231.             { 
  232. p=i*n+j;
  233. if (i!=k)
  234. pDataCoef[p]=pDataCoef[p]-pDataCoef[i*n+k]*pDataCoef[k*n+j];
  235.             }
  236. }
  237.         for (j=0;j<=m-1;j++)
  238.         {
  239. for (i=0;i<=n-1;i++)
  240. p=i*m+j;
  241. if (i!=k)
  242. pDataConst[p]=pDataConst[p]-pDataCoef[i*n+k]*pDataConst[k*m+j];
  243. }
  244. }
  245.     }
  246.     
  247. for (k=n-1;k>=0;k--)
  248.     {
  249. if (pnJs[k]!=k)
  250. {
  251. for (j=0;j<=m-1;j++)
  252. p=k*m+j; 
  253. q=pnJs[k]*m+j;
  254. t=pDataConst[p]; 
  255. pDataConst[p]=pDataConst[q]; 
  256. pDataConst[q]=t;
  257. }
  258. }
  259. }
  260.     delete[] pnJs;
  261.     
  262. return TRUE;
  263. }
  264. // 复系数方程组的全选主元高斯消去法
  265. BOOL CLEquations::GetRootsetGauss(CMatrix mtxCoefImag, CMatrix mtxConstImag, CMatrix& mtxResult, CMatrix& mtxResultImag)
  266. int *pnJs,l,k,i,j,nIs,u,v;
  267.     double p,q,s,d;
  268. mtxResult = m_mtxConst;
  269. mtxResultImag = mtxConstImag;
  270. double *pDataCoef = m_mtxCoef.GetData();
  271. double *pDataConst = mtxResult.GetData();
  272. double *pDataCoefImag = mtxCoefImag.GetData();
  273. double *pDataConstImag = mtxResultImag.GetData();
  274. int n = GetNumUnknowns();
  275. int m = m_mtxConst.GetNumColumns();
  276.     pnJs = new int[n];
  277.     
  278. for (k=0;k<=n-2;k++)
  279.     { 
  280. d=0.0;
  281.         for (i=k;i<=n-1;i++)
  282.         {
  283. for (j=k;j<=n-1;j++)
  284. u=i*n+j;
  285. p=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u];
  286. if (p>d) 
  287. {
  288. d=p;
  289. pnJs[k]=j;
  290. nIs=i;
  291. }
  292. }
  293.         }
  294.         
  295. if (d == 0.0)
  296. {
  297. delete[] pnJs;
  298. return FALSE;
  299.         }
  300.         
  301. if (nIs!=k)
  302.         { 
  303. for (j=k;j<=n-1;j++)
  304.             { 
  305. u=k*n+j; 
  306. v=nIs*n+j;
  307.                 p=pDataCoef[u]; 
  308. pDataCoef[u]=pDataCoef[v]; 
  309. pDataCoef[v]=p;
  310.                 p=pDataCoefImag[u]; 
  311. pDataCoefImag[u]=pDataCoefImag[v]; 
  312. pDataCoefImag[v]=p;
  313.             }
  314.             
  315. p=pDataConst[k]; 
  316. pDataConst[k]=pDataConst[nIs]; 
  317. pDataConst[nIs]=p;
  318.             p=pDataConstImag[k]; 
  319. pDataConstImag[k]=pDataConstImag[nIs]; 
  320. pDataConstImag[nIs]=p;
  321.         }
  322.         
  323. if (pnJs[k]!=k)
  324.         {
  325. for (i=0;i<=n-1;i++)
  326.             { 
  327. u=i*n+k; 
  328. v=i*n+pnJs[k];
  329. p=pDataCoef[u]; 
  330. pDataCoef[u]=pDataCoef[v]; 
  331. pDataCoef[v]=p;
  332. p=pDataCoefImag[u]; 
  333. pDataCoefImag[u]=pDataCoefImag[v]; 
  334. pDataCoefImag[v]=p;
  335.             }
  336. }
  337.         v=k*n+k;
  338.         for (j=k+1;j<=n-1;j++)
  339.         { 
  340. u=k*n+j;
  341.             p=pDataCoef[u]*pDataCoef[v]; 
  342. q=-pDataCoefImag[u]*pDataCoefImag[v];
  343.             s=(pDataCoef[v]-pDataCoefImag[v])*(pDataCoef[u]+pDataCoefImag[u]);
  344.             pDataCoef[u]=(p-q)/d; 
  345. pDataCoefImag[u]=(s-p-q)/d;
  346.         }
  347.         
  348. p=pDataConst[k]*pDataCoef[v]; 
  349. q=-pDataConstImag[k]*pDataCoefImag[v];
  350.         s=(pDataCoef[v]-pDataCoefImag[v])*(pDataConst[k]+pDataConstImag[k]);
  351.         pDataConst[k]=(p-q)/d; 
  352. pDataConstImag[k]=(s-p-q)/d;
  353.         for (i=k+1;i<=n-1;i++)
  354.         { 
  355. u=i*n+k;
  356.             for (j=k+1;j<=n-1;j++)
  357.             { 
  358. v=k*n+j; 
  359. l=i*n+j;
  360.                 p=pDataCoef[u]*pDataCoef[v]; 
  361. q=pDataCoefImag[u]*pDataCoefImag[v];
  362.                 s=(pDataCoef[u]+pDataCoefImag[u])*(pDataCoef[v]+pDataCoefImag[v]);
  363.                 pDataCoef[l]=pDataCoef[l]-p+q;
  364.                 pDataCoefImag[l]=pDataCoefImag[l]-s+p+q;
  365.             }
  366.             
  367. p=pDataCoef[u]*pDataConst[k]; 
  368. q=pDataCoefImag[u]*pDataConstImag[k];
  369.             s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[k]+pDataConstImag[k]);
  370.             pDataConst[i]=pDataConst[i]-p+q; 
  371. pDataConstImag[i]=pDataConstImag[i]-s+p+q;
  372.         }
  373.     }
  374.     
  375. u=(n-1)*n+n-1;
  376.     d=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u];
  377.     if (d == 0.0)
  378. {
  379. delete[] pnJs;
  380. return FALSE;
  381.     }
  382.     p=pDataCoef[u]*pDataConst[n-1]; q=-pDataCoefImag[u]*pDataConstImag[n-1];
  383.     s=(pDataCoef[u]-pDataCoefImag[u])*(pDataConst[n-1]+pDataConstImag[n-1]);
  384.     pDataConst[n-1]=(p-q)/d; pDataConstImag[n-1]=(s-p-q)/d;
  385.     for (i=n-2;i>=0;i--)
  386.     {
  387. for (j=i+1;j<=n-1;j++)
  388. u=i*n+j;
  389. p=pDataCoef[u]*pDataConst[j]; 
  390. q=pDataCoefImag[u]*pDataConstImag[j];
  391. s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[j]+pDataConstImag[j]);
  392. pDataConst[i]=pDataConst[i]-p+q;
  393. pDataConstImag[i]=pDataConstImag[i]-s+p+q;
  394. }
  395.     }
  396.     pnJs[n-1]=n-1;
  397.     for (k=n-1;k>=0;k--)
  398.     {
  399. if (pnJs[k]!=k)
  400.         { 
  401. p=pDataConst[k]; 
  402. pDataConst[k]=pDataConst[pnJs[k]]; 
  403. pDataConst[pnJs[k]]=p;
  404. p=pDataConstImag[k]; 
  405. pDataConstImag[k]=pDataConstImag[pnJs[k]]; 
  406. pDataConstImag[pnJs[k]]=p;
  407.         }
  408. }
  409. delete[] pnJs;
  410. return TRUE;
  411. }
  412. // 复系数方程组的全选主元高斯-约当消去法
  413. BOOL CLEquations::GetRootsetGaussJordan(CMatrix mtxCoefImag, CMatrix mtxConstImag, CMatrix& mtxResult, CMatrix& mtxResultImag)
  414. {
  415. int *pnJs,l,k,i,j,nIs,u,v;
  416.     double p,q,s,d;
  417. mtxResult = m_mtxConst;
  418. mtxResultImag = mtxConstImag;
  419. double *pDataCoef = m_mtxCoef.GetData();
  420. double *pDataConst = mtxResult.GetData();
  421. double *pDataCoefImag = mtxCoefImag.GetData();
  422. double *pDataConstImag = mtxResultImag.GetData();
  423. int n = GetNumUnknowns();
  424. int m = m_mtxConst.GetNumColumns();
  425.     pnJs = new int[n];
  426.     for (k=0;k<=n-1;k++)
  427.     { 
  428. d=0.0;
  429.         for (i=k;i<=n-1;i++)
  430.         {
  431. for (j=k;j<=n-1;j++)
  432. u=i*n+j;
  433. p=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u];
  434. if (p>d) 
  435. {
  436. d=p;
  437. pnJs[k]=j;
  438. nIs=i;
  439. }
  440. }
  441.         }
  442.         
  443. if (d == 0.0)
  444.         {
  445. delete[] pnJs;
  446.             return FALSE;
  447.         }
  448.         
  449. if (nIs!=k)
  450.         { 
  451. for (j=k;j<=n-1;j++)
  452.             { 
  453. u=k*n+j; 
  454. v=nIs*n+j;
  455.                 p=pDataCoef[u]; 
  456. pDataCoef[u]=pDataCoef[v]; 
  457. pDataCoef[v]=p;
  458.                 p=pDataCoefImag[u]; 
  459. pDataCoefImag[u]=pDataCoefImag[v]; 
  460. pDataCoefImag[v]=p;
  461.             }
  462.             
  463. for (j=0;j<=m-1;j++)
  464.             { 
  465. u=k*m+j; 
  466. v=nIs*m+j;
  467.                 p=pDataConst[u]; 
  468. pDataConst[u]=pDataConst[v]; 
  469. pDataConst[v]=p;
  470.                 p=pDataConstImag[u]; 
  471. pDataConstImag[u]=pDataConstImag[v]; 
  472. pDataConstImag[v]=p;
  473.             }
  474.         }
  475.         
  476. if (pnJs[k]!=k)
  477.         {
  478. for (i=0;i<=n-1;i++)
  479.             { 
  480. u=i*n+k; 
  481. v=i*n+pnJs[k];
  482. p=pDataCoef[u]; 
  483. pDataCoef[u]=pDataCoef[v]; 
  484. pDataCoef[v]=p;
  485. p=pDataCoefImag[u]; 
  486. pDataCoefImag[u]=pDataCoefImag[v]; 
  487. pDataCoefImag[v]=p;
  488.             }
  489. }
  490.         v=k*n+k;
  491.         for (j=k+1;j<=n-1;j++)
  492.         { 
  493. u=k*n+j;
  494.             p=pDataCoef[u]*pDataCoef[v]; 
  495. q=-pDataCoefImag[u]*pDataCoefImag[v];
  496.             s=(pDataCoef[v]-pDataCoefImag[v])*(pDataCoef[u]+pDataCoefImag[u]);
  497.             pDataCoef[u]=(p-q)/d; 
  498. pDataCoefImag[u]=(s-p-q)/d;
  499.         }
  500.         
  501. for (j=0;j<=m-1;j++)
  502.         { 
  503. u=k*m+j;
  504.             p=pDataConst[u]*pDataCoef[v]; 
  505. q=-pDataConstImag[u]*pDataCoefImag[v];
  506.             s=(pDataCoef[v]-pDataCoefImag[v])*(pDataConst[u]+pDataConstImag[u]);
  507.             pDataConst[u]=(p-q)/d; 
  508. pDataConstImag[u]=(s-p-q)/d;
  509.         }
  510.         
  511. for (i=0;i<=n-1;i++)
  512.         {
  513. if (i!=k)
  514.             { 
  515. u=i*n+k;
  516. for (j=k+1;j<=n-1;j++)
  517.                 { 
  518. v=k*n+j; 
  519. l=i*n+j;
  520. p=pDataCoef[u]*pDataCoef[v]; 
  521. q=pDataCoefImag[u]*pDataCoefImag[v];
  522. s=(pDataCoef[u]+pDataCoefImag[u])*(pDataCoef[v]+pDataCoefImag[v]);
  523. pDataCoef[l]=pDataCoef[l]-p+q;
  524. pDataCoefImag[l]=pDataCoefImag[l]-s+p+q;
  525.                 }
  526.             
  527. for (j=0;j<=m-1;j++)
  528. l=i*m+j; 
  529. v=k*m+j;
  530. p=pDataCoef[u]*pDataConst[v]; q=pDataCoefImag[u]*pDataConstImag[v];
  531. s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[v]+pDataConstImag[v]);
  532. pDataConst[l]=pDataConst[l]-p+q; 
  533. pDataConstImag[l]=pDataConstImag[l]-s+p+q;
  534. }
  535.             }
  536. }
  537.     }
  538. for (k=n-1;k>=0;k--)
  539.     {
  540. if (pnJs[k]!=k)
  541. {
  542. for (j=0;j<=m-1;j++)
  543. u=k*m+j;
  544. v=pnJs[k]*m+j;
  545. p=pDataConst[u]; 
  546. pDataConst[u]=pDataConst[v]; 
  547. pDataConst[v]=p;
  548. p=pDataConstImag[u]; 
  549. pDataConstImag[u]=pDataConstImag[v]; 
  550. pDataConstImag[v]=p;
  551. }
  552. }
  553. }
  554. delete[] pnJs;
  555. return TRUE;
  556. }
  557. // 求解三对角线方程组的追赶法
  558. BOOL CLEquations::GetRootsetTriDiagonal(CMatrix& mtxResult)
  559. int k,j;
  560.     double s;
  561.     
  562. mtxResult = m_mtxConst;
  563. double *pDataConst = mtxResult.GetData();
  564. int n = GetNumUnknowns();
  565. ASSERT(m_mtxCoef.GetNumRows() == n);
  566. double* pDiagData = new double[3*n-2];
  567. k = j = 0;
  568. if (k == 0)
  569. {
  570. pDiagData[j++] = m_mtxCoef.GetElement(k, k);
  571. pDiagData[j++] = m_mtxCoef.GetElement(k, k+1);
  572. }
  573.     for (k=1; k<n-1; ++k)
  574. {
  575. pDiagData[j++] = m_mtxCoef.GetElement(k, k-1);
  576. pDiagData[j++] = m_mtxCoef.GetElement(k, k);
  577. pDiagData[j++] = m_mtxCoef.GetElement(k, k+1);
  578. }
  579. if (k == n-1)
  580. {
  581. pDiagData[j++] = m_mtxCoef.GetElement(k, k-1);
  582. pDiagData[j++] = m_mtxCoef.GetElement(k, k);
  583. }
  584. for (k=0;k<=n-2;k++)
  585.     { 
  586. j=3*k; 
  587. s=pDiagData[j];
  588.         if (fabs(s)+1.0==1.0)
  589. {
  590. delete[] pDiagData;
  591. return FALSE;
  592. }
  593.         pDiagData[j+1]=pDiagData[j+1]/s;
  594.         pDataConst[k]=pDataConst[k]/s;
  595.         pDiagData[j+3]=pDiagData[j+3]-pDiagData[j+2]*pDiagData[j+1];
  596.         pDataConst[k+1]=pDataConst[k+1]-pDiagData[j+2]*pDataConst[k];
  597.     }
  598.     
  599. s=pDiagData[3*n-3];
  600.     if (s == 0.0)
  601. {
  602. delete[] pDiagData;
  603. return FALSE;
  604. }
  605.     
  606. pDataConst[n-1]=pDataConst[n-1]/s;
  607.     for (k=n-2;k>=0;k--)
  608. pDataConst[k]=pDataConst[k]-pDiagData[3*k+1]*pDataConst[k+1];
  609.     
  610. delete[] pDiagData;
  611. return TRUE;
  612. }
  613. // 一般带型方程组的求解
  614. BOOL CLEquations::GetRootsetBand(int nBandWidth, CMatrix& mtxResult)
  615. int ls,k,i,j,is,u,v;
  616.     double p,t;
  617.     
  618. if ((nBandWidth-1)%2 != 0)
  619. return FALSE;
  620. mtxResult = m_mtxConst;
  621. double *pDataConst = mtxResult.GetData();
  622. int m = m_mtxConst.GetNumColumns();
  623. int n = GetNumUnknowns();
  624. ASSERT(m_mtxCoef.GetNumRows() == n);
  625. double* pBandData = new double[nBandWidth*n];
  626. // 半带宽
  627.     ls = (nBandWidth-1)/2;
  628. // 构造带宽数组
  629.     for (i=0; i<n; ++i)
  630. {
  631. j = 0;
  632. for (k=max(0, i-ls); k<max(0, i-ls)+nBandWidth; ++k)
  633. {
  634. if (k < n)
  635. pBandData[i*nBandWidth+j++] = m_mtxCoef.GetElement(i, k);
  636. else
  637. pBandData[i*nBandWidth+j++] = 0;
  638. }
  639. }
  640.     for (k=0;k<=n-2;k++)
  641.     { 
  642. p=0.0;
  643.         for (i=k;i<=ls;i++)
  644.         { 
  645. t=fabs(pBandData[i*nBandWidth]);
  646.             if (t>p) 
  647. {
  648. p=t; 
  649. is=i;
  650. }
  651.         }
  652.         
  653. if (p == 0.0)
  654. {
  655. delete[] pBandData;
  656. return FALSE;
  657. }
  658.         for (j=0;j<=m-1;j++)
  659.         { 
  660. u=k*m+j; 
  661. v=is*m+j;
  662.             t=pDataConst[u]; 
  663. pDataConst[u]=pDataConst[v]; 
  664. pDataConst[v]=t;
  665.         }
  666.         
  667. for (j=0;j<=nBandWidth-1;j++)
  668.         { 
  669. u=k*nBandWidth+j; 
  670. v=is*nBandWidth+j;
  671.             t=pBandData[u]; 
  672. pBandData[u]=pBandData[v]; 
  673. pBandData[v]=t;
  674.         }
  675.         
  676. for (j=0;j<=m-1;j++)
  677.         { 
  678. u=k*m+j; 
  679. pDataConst[u]=pDataConst[u]/pBandData[k*nBandWidth];
  680. }
  681.         
  682. for (j=1;j<=nBandWidth-1;j++)
  683.         { 
  684. u=k*nBandWidth+j; 
  685. pBandData[u]=pBandData[u]/pBandData[k*nBandWidth];
  686. }
  687.         
  688. for (i=k+1;i<=ls;i++)
  689.         { 
  690. t=pBandData[i*nBandWidth];
  691.             for (j=0;j<=m-1;j++)
  692.             { 
  693. u=i*m+j; 
  694. v=k*m+j;
  695.                 pDataConst[u]=pDataConst[u]-t*pDataConst[v];
  696.             }
  697.             
  698. for (j=1;j<=nBandWidth-1;j++)
  699.             { 
  700. u=i*nBandWidth+j; 
  701. v=k*nBandWidth+j;
  702.                 pBandData[u-1]=pBandData[u]-t*pBandData[v];
  703.             }
  704.             
  705. u=i*nBandWidth+nBandWidth-1; pBandData[u]=0.0;
  706.         }
  707.         
  708. if (ls!=(n-1)) 
  709. ls=ls+1;
  710.     }
  711.     
  712. p=pBandData[(n-1)*nBandWidth];
  713.     if (p == 0.0)
  714. {
  715. delete[] pBandData;
  716. return FALSE;
  717. }
  718.     for (j=0;j<=m-1;j++)
  719.     { 
  720. u=(n-1)*m+j; 
  721. pDataConst[u]=pDataConst[u]/p;
  722. }
  723.     
  724. ls=1;
  725.     for (i=n-2;i>=0;i--)
  726.     { 
  727. for (k=0;k<=m-1;k++)
  728.         { 
  729. u=i*m+k;
  730.             for (j=1;j<=ls;j++)
  731.             { 
  732. v=i*nBandWidth+j; 
  733. is=(i+j)*m+k;
  734.                 pDataConst[u]=pDataConst[u]-pBandData[v]*pDataConst[is];
  735.             }
  736.         }
  737.         
  738. if (ls!=(nBandWidth-1)) 
  739. ls=ls+1;
  740.     }
  741.     
  742. delete[] pBandData;
  743. return TRUE;
  744. }
  745. // 求解对称方程组的分解法
  746. BOOL CLEquations::GetRootsetDjn(CMatrix& mtxResult)
  747. int i,j,l,k,u,v,w,k1,k2,k3;
  748.     double p;
  749. CMatrix mtxCoef = m_mtxCoef;
  750. mtxResult = m_mtxConst;
  751. int n = mtxCoef.GetNumColumns();
  752. int m = mtxResult.GetNumColumns();
  753. double* pDataCoef = mtxCoef.GetData();
  754. double* pDataConst = mtxResult.GetData();
  755.     if (pDataCoef[0] == 0.0)
  756. return FALSE;
  757.     for (i=1; i<=n-1; i++)
  758.     { 
  759. u=i*n; 
  760. pDataCoef[u]=pDataCoef[u]/pDataCoef[0];
  761. }
  762.     
  763. for (i=1; i<=n-2; i++)
  764.     { 
  765. u=i*n+i;
  766.         for (j=1; j<=i; j++)
  767.         { 
  768. v=i*n+j-1; 
  769. l=(j-1)*n+j-1;
  770.             pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]*pDataCoef[l];
  771.         }
  772.         
  773. p=pDataCoef[u];
  774.         if (p == 0.0)
  775. return FALSE;
  776.         for (k=i+1; k<=n-1; k++)
  777.         { 
  778. u=k*n+i;
  779.             for (j=1; j<=i; j++)
  780.             { 
  781. v=k*n+j-1; 
  782. l=i*n+j-1; 
  783. w=(j-1)*n+j-1;
  784. pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[l]*pDataCoef[w];
  785.             }
  786.             
  787. pDataCoef[u]=pDataCoef[u]/p;
  788.         }
  789.     }
  790.     
  791. u=n*n-1;
  792.     for (j=1; j<=n-1; j++)
  793.     { 
  794. v=(n-1)*n+j-1; 
  795. w=(j-1)*n+j-1;
  796.         pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]*pDataCoef[w];
  797.     }
  798.     
  799. p=pDataCoef[u];
  800.     if (p == 0.0)
  801. return FALSE;
  802.     for (j=0; j<=m-1; j++)
  803. {
  804.     for (i=1; i<=n-1; i++)
  805. u=i*m+j;
  806. for (k=1; k<=i; k++)
  807. v=i*n+k-1; 
  808. w=(k-1)*m+j;
  809. pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[w];
  810. }
  811. }
  812. }
  813.     for (i=1; i<=n-1; i++)
  814.     { 
  815. u=(i-1)*n+i-1;
  816.         for (j=i; j<=n-1; j++)
  817.         { 
  818. v=(i-1)*n+j; 
  819. w=j*n+i-1;
  820.             pDataCoef[v]=pDataCoef[u]*pDataCoef[w];
  821.         }
  822.     }
  823.     
  824. for (j=0; j<=m-1; j++)
  825.     { 
  826. u=(n-1)*m+j;
  827.         pDataConst[u]=pDataConst[u]/p;
  828.         for (k=1; k<=n-1; k++)
  829.         { 
  830. k1=n-k; 
  831. k3=k1-1; 
  832. u=k3*m+j;
  833.             for (k2=k1; k2<=n-1; k2++)
  834.             { 
  835. v=k3*n+k2; 
  836. w=k2*m+j;
  837.                 pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[w];
  838.             }
  839.             
  840. pDataConst[u]=pDataConst[u]/pDataCoef[k3*n+k3];
  841.         }
  842.     }
  843.     
  844. return TRUE;
  845. }
  846. // 求解对称正定方程组的平方根法
  847. BOOL CLEquations::GetRootsetCholesky(CMatrix& mtxResult)
  848. int i,j,k,u,v;
  849.     
  850. CMatrix mtxCoef = m_mtxCoef;
  851. mtxResult = m_mtxConst;
  852. int n = mtxCoef.GetNumColumns();
  853. int m = mtxResult.GetNumColumns();
  854. double* pDataCoef = mtxCoef.GetData();
  855. double* pDataConst = mtxResult.GetData();
  856.     
  857. if (pDataCoef[0] <= 0.0)
  858. return FALSE;
  859. pDataCoef[0]=sqrt(pDataCoef[0]);
  860.     for (j=1; j<=n-1; j++) 
  861. pDataCoef[j]=pDataCoef[j]/pDataCoef[0];
  862.     
  863. for (i=1; i<=n-1; i++)
  864.     { 
  865. u=i*n+i;
  866.         for (j=1; j<=i; j++)
  867.         { 
  868. v=(j-1)*n+i;
  869.             pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v];
  870.         }
  871.         
  872. if (pDataCoef[u] <= 0.0)
  873. return FALSE;
  874.         pDataCoef[u]=sqrt(pDataCoef[u]);
  875.         if (i!=(n-1))
  876.         { 
  877. for (j=i+1; j<=n-1; j++)
  878.             { 
  879. v=i*n+j;
  880.                 for (k=1; k<=i; k++)
  881. pDataCoef[v]=pDataCoef[v]-pDataCoef[(k-1)*n+i]*pDataCoef[(k-1)*n+j];
  882.                 pDataCoef[v]=pDataCoef[v]/pDataCoef[u];
  883.             }
  884.         }
  885.     }
  886.     
  887. for (j=0; j<=m-1; j++)
  888.     { 
  889. pDataConst[j]=pDataConst[j]/pDataCoef[0];
  890.         for (i=1; i<=n-1; i++)
  891.         { 
  892. u=i*n+i; 
  893. v=i*m+j;
  894.             for (k=1; k<=i; k++)
  895. pDataConst[v]=pDataConst[v]-pDataCoef[(k-1)*n+i]*pDataConst[(k-1)*m+j];
  896.             pDataConst[v]=pDataConst[v]/pDataCoef[u];
  897.         }
  898.     }
  899.     
  900. for (j=0; j<=m-1; j++)
  901.     { 
  902. u=(n-1)*m+j;
  903.         pDataConst[u]=pDataConst[u]/pDataCoef[n*n-1];
  904.         for (k=n-1; k>=1; k--)
  905.         { 
  906. u=(k-1)*m+j;
  907.             for (i=k; i<=n-1; i++)
  908.             { 
  909. v=(k-1)*n+i;
  910.                 pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[i*m+j];
  911.             }
  912.             
  913. v=(k-1)*n+k-1;
  914.             pDataConst[u]=pDataConst[u]/pDataCoef[v];
  915.         }
  916.     }
  917.     
  918. return TRUE;
  919. }
  920. // 求解大型稀疏方程组的全选主元高斯-约去消去法
  921. BOOL CLEquations::GetRootsetGgje(CMatrix& mtxResult)
  922. int *pnJs,i,j,k,nIs,u,v;
  923.     double d,t;
  924.     
  925. CMatrix mtxCoef = m_mtxCoef;
  926. mtxResult = m_mtxConst;
  927. int n = mtxCoef.GetNumColumns();
  928. double* pDataCoef = mtxCoef.GetData();
  929. double* pDataConst = mtxResult.GetData();
  930. pnJs = new int[n];
  931.     for (k=0; k<=n-1; k++)
  932.     { 
  933. d=0.0;
  934.         for (i=k; i<=n-1; i++)
  935. {
  936. for (j=k; j<=n-1; j++)
  937. t=fabs(pDataCoef[i*n+j]);
  938. if (t>d) 
  939. {
  940. d=t; 
  941. pnJs[k]=j; 
  942. nIs=i;
  943. }
  944. }
  945. }
  946.         if (d == 0.0)
  947. {
  948. delete[] pnJs;
  949. return FALSE;
  950. }
  951.         if (nIs!=k)
  952.         { 
  953. for (j=k; j<=n-1; j++)
  954.             { 
  955. u=k*n+j; 
  956. v=nIs*n+j;
  957.                 t=pDataCoef[u]; 
  958. pDataCoef[u]=pDataCoef[v]; 
  959. pDataCoef[v]=t;
  960.             }
  961.             
  962. t=pDataConst[k]; 
  963. pDataConst[k]=pDataConst[nIs]; 
  964. pDataConst[nIs]=t;
  965.         }
  966.         
  967. if (pnJs[k]!=k)
  968.         {
  969. for (i=0; i<=n-1; i++)
  970.             { 
  971. u=i*n+k; 
  972. v=i*n+pnJs[k];
  973. t=pDataCoef[u]; 
  974. pDataCoef[u]=pDataCoef[v]; 
  975. pDataCoef[v]=t;
  976.             }
  977. }
  978.         t=pDataCoef[k*n+k];
  979.         for (j=k+1; j<=n-1; j++)
  980.         { 
  981. u=k*n+j;
  982.             if (pDataCoef[u]!=0.0) 
  983. pDataCoef[u]=pDataCoef[u]/t;
  984.         }
  985.         
  986. pDataConst[k]=pDataConst[k]/t;
  987.         for (j=k+1; j<=n-1; j++)
  988.         { 
  989. u=k*n+j;
  990.             if (pDataCoef[u]!=0.0)
  991.             { 
  992. for (i=0; i<=n-1; i++)
  993.                 { 
  994. v=i*n+k;
  995.                     if ((i!=k)&&(pDataCoef[v]!=0.0))
  996.                     { 
  997. nIs=i*n+j;
  998.                         pDataCoef[nIs]=pDataCoef[nIs]-pDataCoef[v]*pDataCoef[u];
  999.                     }
  1000.                 }
  1001.             }
  1002.         }
  1003.         
  1004. for (i=0; i<=n-1; i++)
  1005.         { 
  1006. u=i*n+k;
  1007.             if ((i!=k)&&(pDataCoef[u]!=0.0))
  1008. pDataConst[i]=pDataConst[i]-pDataCoef[u]*pDataConst[k];
  1009.         }
  1010.     }
  1011.     
  1012. for (k=n-1; k>=0; k--)
  1013.     {
  1014. if (k!=pnJs[k])
  1015.         { 
  1016. t=pDataConst[k]; 
  1017. pDataConst[k]=pDataConst[pnJs[k]]; 
  1018. pDataConst[pnJs[k]]=t;
  1019. }
  1020. }
  1021.     delete[] pnJs;
  1022.     
  1023. return TRUE;
  1024. }
  1025. // 求解托伯利兹方程组的列文逊方法
  1026. BOOL CLEquations::GetRootsetTlvs(CMatrix& mtxResult)
  1027. int i,j,k;
  1028.     double a,beta,q,c,h,*y,*s;
  1029.     int n = m_mtxCoef.GetNumColumns();
  1030. mtxResult.Init(n, 1);
  1031. double* x = mtxResult.GetData();
  1032. double* pDataConst = m_mtxConst.GetData();
  1033. double* t = new double[n];
  1034. // 构造T数组
  1035.     for (i=0; i<n; ++i)
  1036. t[i] = m_mtxCoef.GetElement(0, i);
  1037. s = new double[n];
  1038.     y = new double[n];
  1039.     a=t[0];
  1040.     if (a == 0.0)
  1041.     { 
  1042. delete[] s;
  1043. delete[] y;
  1044. delete[] t;
  1045. return FALSE;
  1046. }
  1047.     y[0]=1.0; 
  1048. x[0]=pDataConst[0]/a;
  1049.     for (k=1; k<=n-1; k++)
  1050.     { 
  1051. beta=0.0; 
  1052. q=0.0;
  1053.         for (j=0; j<=k-1; j++)
  1054.         { 
  1055. beta=beta+y[j]*t[j+1];
  1056.             q=q+x[j]*t[k-j];
  1057.         }
  1058.         
  1059. if (a == 0.0)
  1060. delete[] s;
  1061. delete[] y;
  1062. delete[] t;
  1063. return FALSE;
  1064. }
  1065.         c=-beta/a; 
  1066. s[0]=c*y[k-1]; 
  1067. y[k]=y[k-1];
  1068.         if (k!=1)
  1069.         {
  1070. for (i=1; i<=k-1; i++)
  1071. s[i]=y[i-1]+c*y[k-i-1];
  1072. }
  1073.         a=a+c*beta;
  1074. if (a == 0.0)
  1075. delete[] s;
  1076. delete[] y;
  1077. delete[] t;
  1078. return FALSE;
  1079. }
  1080.         h=(pDataConst[k]-q)/a;
  1081.         for (i=0; i<=k-1; i++)
  1082.         { 
  1083. x[i]=x[i]+h*s[i]; 
  1084. y[i]=s[i];
  1085. }
  1086.         
  1087. x[k]=h*y[k];
  1088.     }
  1089.     
  1090. delete[] s;
  1091. delete[] y;
  1092. delete[] t;
  1093.     return TRUE;
  1094. }
  1095. // 高斯-赛德尔迭代法
  1096. BOOL CLEquations::GetRootsetGaussSeidel(CMatrix& mtxResult, double eps /*= 0.000001*/)
  1097. int i,j,u,v;
  1098.     double p,t,s,q;
  1099.     int n = m_mtxCoef.GetNumColumns();
  1100. mtxResult.Init(n, 1);
  1101. double* x = mtxResult.GetData();
  1102. double* pDataCoef = m_mtxCoef.GetData();
  1103. double* pDataConst = m_mtxConst.GetData();
  1104.     
  1105. for (i=0; i<=n-1; i++)
  1106.     { 
  1107. u=i*n+i; 
  1108. p=0.0; 
  1109. x[i]=0.0;
  1110.         for (j=0; j<=n-1; j++)
  1111.         {
  1112. if (i!=j)
  1113.             { 
  1114. v=i*n+j; 
  1115. p=p+fabs(pDataCoef[v]);
  1116. }
  1117. }
  1118.         if (p>=fabs(pDataCoef[u]))
  1119. return FALSE;
  1120.     }
  1121.     p=eps+1.0;
  1122.     while (p>=eps)
  1123.     { 
  1124. p=0.0;
  1125.         for (i=0; i<=n-1; i++)
  1126.         { 
  1127. t=x[i]; 
  1128. s=0.0;
  1129.             for (j=0; j<=n-1; j++)
  1130. if (j!=i) 
  1131. s=s+pDataCoef[i*n+j]*x[j];
  1132.             x[i]=(pDataConst[i]-s)/pDataCoef[i*n+i];
  1133.             q=fabs(x[i]-t)/(1.0+fabs(x[i]));
  1134.             if (q>p) 
  1135. p=q;
  1136.         }
  1137.     }
  1138.     
  1139. return TRUE;
  1140. }
  1141. // 求解对称正定方程组的共轭梯度法
  1142. void CLEquations::GetRootsetGrad(CMatrix& mtxResult, double eps /*= 0.000001*/)
  1143. int i,k;
  1144.     double *p,*r,*s,*q,alpha,beta,d,e;
  1145.     int n = GetNumUnknowns();
  1146. mtxResult.Init(n, 1);
  1147. double* x = mtxResult.GetData();
  1148. CMatrix mtxP(n, 1);
  1149.     p = mtxP.GetData();
  1150. double* pDataCoef = m_mtxCoef.GetData();
  1151. double* pDataConst = m_mtxConst.GetData();
  1152.     r = new double[n];
  1153.     for (i=0; i<=n-1; i++)
  1154.     { 
  1155. x[i]=0.0; 
  1156. p[i]=pDataConst[i]; 
  1157. r[i]=pDataConst[i]; 
  1158. }
  1159.     
  1160. i=0;
  1161.     while (i<=n-1)
  1162.     { 
  1163. CMatrix mtxS = m_mtxCoef * mtxP;
  1164.     s = mtxS.GetData();
  1165.         
  1166. d=0.0; 
  1167. e=0.0;
  1168.         for (k=0; k<=n-1; k++)
  1169.         { 
  1170. d=d+p[k]*pDataConst[k]; 
  1171. e=e+p[k]*s[k]; 
  1172. }
  1173.         
  1174. alpha=d/e;
  1175.         for (k=0; k<=n-1; k++)
  1176. x[k]=x[k]+alpha*p[k];
  1177.         
  1178. CMatrix mtxQ = m_mtxCoef * mtxResult;
  1179.     q = mtxQ.GetData();
  1180.         
  1181. d=0.0;
  1182.         for (k=0; k<=n-1; k++)
  1183.         { 
  1184. r[k]=pDataConst[k]-q[k]; 
  1185. d=d+r[k]*s[k]; 
  1186. }
  1187.         
  1188. beta=d/e; d=0.0;
  1189.         for (k=0; k<=n-1; k++) 
  1190. d=d+r[k]*r[k];
  1191.         
  1192. d=sqrt(d);
  1193.         if (d<eps)
  1194. break;
  1195.         for (k=0; k<=n-1; k++)
  1196. p[k]=r[k]-beta*p[k];
  1197.         
  1198. i=i+1;
  1199.     }
  1200. delete[] r;
  1201. }
  1202. // 求解线性最小二乘问题的豪斯荷尔德变换法
  1203. BOOL CLEquations::GetRootsetMqr(CMatrix& mtxResult, CMatrix& mtxQ, CMatrix& mtxR)
  1204. int i,j;
  1205.     double d;
  1206.     int m = m_mtxCoef.GetNumRows();
  1207.     int n = m_mtxCoef.GetNumColumns();
  1208. if (m < n)
  1209. return FALSE;
  1210. mtxResult = m_mtxConst;
  1211. double* pDataConst = mtxResult.GetData();
  1212. mtxR = m_mtxCoef;
  1213. double* pDataCoef = mtxR.GetData();
  1214.     if (! mtxR.SplitQR(mtxQ))
  1215. return FALSE;
  1216. double* c = new double[n];
  1217. double* q = mtxQ.GetData();
  1218.     for (i=0; i<=n-1; i++)
  1219.     { 
  1220. d=0.0;
  1221.         for (j=0; j<=m-1; j++)
  1222. d=d+q[j*m+i]*pDataConst[j];
  1223.     
  1224. c[i]=d;
  1225.     }
  1226.     
  1227. pDataConst[n-1]=c[n-1]/pDataCoef[n*n-1];
  1228.     for (i=n-2; i>=0; i--)
  1229.     { 
  1230. d=0.0;
  1231.         for (j=i+1; j<=n-1; j++)
  1232. d=d+pDataCoef[i*n+j]*pDataConst[j];
  1233.         
  1234. pDataConst[i]=(c[i]-d)/pDataCoef[i*n+i];
  1235.     }
  1236.     
  1237. delete[] c;
  1238. return TRUE;
  1239. }
  1240. // 求解线性最小二乘问题的广义逆法
  1241. BOOL CLEquations::GetRootsetGinv(CMatrix& mtxResult, CMatrix& mtxAP, CMatrix& mtxU, CMatrix& mtxV, double eps /*= 0.000001*/)
  1242. int i,j;
  1243.     
  1244.     int m = m_mtxCoef.GetNumRows();
  1245.     int n = m_mtxCoef.GetNumColumns();
  1246. mtxResult.Init(n, 1);
  1247. double* pDataConst = m_mtxConst.GetData();
  1248. double* x = mtxResult.GetData();
  1249. CMatrix mtxA = m_mtxCoef;
  1250.     if (! mtxA.GInvertUV(mtxAP, mtxU, mtxV, eps))
  1251. return FALSE;
  1252. double* pAPData = mtxAP.GetData();
  1253.     for (i=0; i<=n-1; i++)
  1254.     { 
  1255. x[i]=0.0;
  1256.         for (j=0; j<=m-1; j++)
  1257. x[i]=x[i]+pAPData[i*m+j]*pDataConst[j];
  1258.     }
  1259.     
  1260. return TRUE;
  1261. }
  1262. // 病态方程组的求解
  1263. BOOL CLEquations::GetRootsetMorbid(CMatrix& mtxResult, int nMaxIt /*= 60*/, double eps /*= 0.000001*/)
  1264. int i, k;
  1265.     double q, qq;
  1266.     
  1267. // 方程的阶数
  1268.     int n = GetNumUnknowns();
  1269. // 设定迭代次数, 缺省为60
  1270. i = nMaxIt;
  1271.     
  1272. // 用全选主元高斯消元法求解
  1273. CLEquations leqs(m_mtxCoef, m_mtxConst);
  1274. if (! leqs.GetRootsetGauss(mtxResult))
  1275. return FALSE;
  1276. double* x = mtxResult.GetData();
  1277.     
  1278. q=1.0+eps;
  1279.     while (q>=eps)
  1280.     { 
  1281. // 迭代次数已达最大值,仍为求得结果,求解失败
  1282. if (i==0)
  1283. return FALSE;
  1284.         
  1285. // 迭代次数减1
  1286. i=i-1;
  1287. // 矩阵运算
  1288. CMatrix mtxE = m_mtxCoef*mtxResult;
  1289. CMatrix mtxR = m_mtxConst - mtxE;
  1290. // 用全选主元高斯消元法求解
  1291. CLEquations leqs(m_mtxCoef, mtxR);
  1292. CMatrix mtxRR;
  1293. if (! leqs.GetRootsetGauss(mtxRR))
  1294. return FALSE;
  1295. double* r = mtxRR.GetData();
  1296.         
  1297. q=0.0;
  1298.         for ( k=0; k<=n-1; k++)
  1299.         { 
  1300. qq=fabs(r[k])/(1.0+fabs(x[k]+r[k]));
  1301.             if (qq>q) 
  1302. q=qq;
  1303.         }
  1304.         
  1305. for ( k=0; k<=n-1; k++) 
  1306. x[k]=x[k]+r[k];
  1307.     }
  1308.     
  1309. // 求解成功
  1310. return TRUE;
  1311. }