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

数学计算

开发平台:

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. //////////////////////////////////////////////////////////////////////
  19. // 基本构造函数
  20. //////////////////////////////////////////////////////////////////////
  21. CLEquations::CLEquations()
  22. {
  23. }
  24. //////////////////////////////////////////////////////////////////////
  25. // 指定系数和常数构造函数
  26. //
  27. // 参数:
  28. // 1. const CMatrix& mtxCoef - 指定的系数矩阵
  29. // 2. const CMatrix& mtxConst - 指定的常数矩阵
  30. //////////////////////////////////////////////////////////////////////
  31. CLEquations::CLEquations(const CMatrix& mtxCoef, const CMatrix& mtxConst)
  32. {
  33. ASSERT(Init(mtxCoef, mtxConst));
  34. }
  35. //////////////////////////////////////////////////////////////////////
  36. // 析构函数
  37. //////////////////////////////////////////////////////////////////////
  38. CLEquations::~CLEquations()
  39. {
  40. }
  41. //////////////////////////////////////////////////////////////////////
  42. // 初始化函数
  43. //
  44. // 参数:
  45. // 1. const CMatrix& mtxCoef - 指定的系数矩阵
  46. // 2. const CMatrix& mtxConst - 指定的常数矩阵
  47. //
  48. // 返回值:BOOL 型,初始化是否成功
  49. //////////////////////////////////////////////////////////////////////
  50. BOOL CLEquations::Init(const CMatrix& mtxCoef, const CMatrix& mtxConst)
  51. {
  52. if (mtxCoef.GetNumRows() != mtxConst.GetNumRows())
  53. return FALSE;
  54. m_mtxCoef = mtxCoef;
  55. m_mtxConst = mtxConst;
  56. return TRUE;
  57. }
  58. //////////////////////////////////////////////////////////////////////
  59. // 获取系数矩阵
  60. //
  61. // 参数:无
  62. //
  63. // 返回值:CMatrix 型,返回系数矩阵
  64. //////////////////////////////////////////////////////////////////////
  65. inline CMatrix CLEquations::GetCoefMatrix() const
  66. {
  67. return m_mtxCoef;
  68. }
  69. //////////////////////////////////////////////////////////////////////
  70. // 获取常数矩阵
  71. //
  72. // 参数:无
  73. //
  74. // 返回值:CMatrix 型,返回常数矩阵
  75. //////////////////////////////////////////////////////////////////////
  76. inline CMatrix CLEquations::GetConstMatrix() const
  77. {
  78. return m_mtxConst;
  79. }
  80. //////////////////////////////////////////////////////////////////////
  81. // 获取方程个数
  82. //
  83. // 参数:无
  84. //
  85. // 返回值:int 型,返回方程组方程的个数
  86. //////////////////////////////////////////////////////////////////////
  87. inline int CLEquations::GetNumEquations() const
  88. {
  89. return GetCoefMatrix().GetNumRows();
  90. }
  91. //////////////////////////////////////////////////////////////////////
  92. // 获取未知数个数
  93. //
  94. // 参数:无
  95. //
  96. // 返回值:int 型,返回方程组未知数的个数
  97. //////////////////////////////////////////////////////////////////////
  98. inline int CLEquations::GetNumUnknowns() const
  99. {
  100. return GetCoefMatrix().GetNumColumns();
  101. }
  102. //////////////////////////////////////////////////////////////////////
  103. // 全选主元高斯消去法
  104. //
  105. // 参数:
  106. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组的解
  107. //
  108. // 返回值:BOOL 型,方程组求解是否成功
  109. //////////////////////////////////////////////////////////////////////
  110. BOOL CLEquations::GetRootsetGauss(CMatrix& mtxResult)
  111. int *pnJs,l,k,i,j,nIs,p,q;
  112.     double d,t;
  113. // 方程组的属性,将常数矩阵赋给解矩阵
  114. mtxResult = m_mtxConst;
  115. double *pDataCoef = m_mtxCoef.GetData();
  116. double *pDataConst = mtxResult.GetData();
  117. int n = GetNumUnknowns();
  118. // 临时缓冲区,存放列数
  119.     pnJs = new int[n];
  120. // 消元
  121.     l=1;
  122.     for (k=0;k<=n-2;k++)
  123.     { 
  124. d=0.0;
  125.         for (i=k;i<=n-1;i++)
  126. {
  127. for (j=k;j<=n-1;j++)
  128.             { 
  129. t=fabs(pDataCoef[i*n+j]);
  130. if (t>d) 
  131. d=t; 
  132. pnJs[k]=j; 
  133. nIs=i;
  134. }
  135.             }
  136. }
  137.         if (d == 0.0) 
  138. l=0;
  139.         else
  140.         { 
  141. if (pnJs[k]!=k)
  142.             {
  143. for (i=0;i<=n-1;i++)
  144.                 { 
  145. p=i*n+k; 
  146. q=i*n+pnJs[k];
  147. t=pDataCoef[p]; 
  148. pDataCoef[p]=pDataCoef[q]; 
  149. pDataCoef[q]=t;
  150.                 }
  151. }
  152.             if (nIs!=k)
  153.             { 
  154. for (j=k;j<=n-1;j++)
  155.                 { 
  156. p=k*n+j; 
  157. q=nIs*n+j;
  158.                     t=pDataCoef[p]; 
  159. pDataCoef[p]=pDataCoef[q]; 
  160. pDataCoef[q]=t;
  161.                 }
  162.                 
  163. t=pDataConst[k]; 
  164. pDataConst[k]=pDataConst[nIs]; 
  165. pDataConst[nIs]=t;
  166.             }
  167.         }
  168.         
  169. // 求解失败
  170. if (l==0)
  171.         { 
  172. delete[] pnJs;
  173.             return FALSE;
  174.         }
  175.         
  176. d=pDataCoef[k*n+k];
  177.         for (j=k+1;j<=n-1;j++)
  178.         { 
  179. p=k*n+j; 
  180. pDataCoef[p]=pDataCoef[p]/d;
  181. }
  182.         
  183. pDataConst[k]=pDataConst[k]/d;
  184.         for (i=k+1;i<=n-1;i++)
  185.         { 
  186. for (j=k+1;j<=n-1;j++)
  187.             { 
  188. p=i*n+j;
  189.                 pDataCoef[p]=pDataCoef[p]-pDataCoef[i*n+k]*pDataCoef[k*n+j];
  190.             }
  191.             
  192. pDataConst[i]=pDataConst[i]-pDataCoef[i*n+k]*pDataConst[k];
  193.         }
  194.     }
  195.     
  196. // 求解失败
  197. d=pDataCoef[(n-1)*n+n-1];
  198.     if (d == 0.0)
  199. delete[] pnJs;
  200. return FALSE;
  201. }
  202. // 求解
  203.     pDataConst[n-1]=pDataConst[n-1]/d;
  204.     for (i=n-2;i>=0;i--)
  205.     { 
  206. t=0.0;
  207.         for (j=i+1;j<=n-1;j++)
  208. t=t+pDataCoef[i*n+j]*pDataConst[j];
  209.         pDataConst[i]=pDataConst[i]-t;
  210.     }
  211.     
  212. // 调整解的位置
  213. pnJs[n-1]=n-1;
  214.     for (k=n-1;k>=0;k--)
  215.     {
  216. if (pnJs[k]!=k)
  217.         { 
  218. t=pDataConst[k]; 
  219. pDataConst[k]=pDataConst[pnJs[k]]; 
  220. pDataConst[pnJs[k]]=t;
  221. }
  222. }
  223. // 清理内存
  224.     delete[] pnJs;
  225.     return TRUE;
  226. }
  227. //////////////////////////////////////////////////////////////////////
  228. // 全选主元高斯-约当消去法
  229. //
  230. // 参数:
  231. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组的解
  232. //
  233. // 返回值:BOOL 型,方程组求解是否成功
  234. //////////////////////////////////////////////////////////////////////
  235. BOOL CLEquations::GetRootsetGaussJordan(CMatrix& mtxResult)
  236. int *pnJs,l,k,i,j,nIs,p,q;
  237.     double d,t;
  238. // 方程组的属性,将常数矩阵赋给解矩阵
  239. mtxResult = m_mtxConst;
  240. double *pDataCoef = m_mtxCoef.GetData();
  241. double *pDataConst = mtxResult.GetData();
  242. int n = GetNumUnknowns();
  243. int m = m_mtxConst.GetNumColumns();
  244. // 临时缓冲区,存放变换的列数
  245.     pnJs = new int[n];
  246. // 消元
  247.     l=1;
  248.     for (k=0;k<=n-1;k++)
  249.     { 
  250. d=0.0;
  251.         for (i=k;i<=n-1;i++)
  252.         {
  253. for (j=k;j<=n-1;j++)
  254.             { 
  255. t=fabs(pDataCoef[i*n+j]);
  256. if (t>d) 
  257. d=t; 
  258. pnJs[k]=j; 
  259. nIs=i;
  260. }
  261.             }
  262. }
  263.         if (d+1.0==1.0) 
  264. l=0;
  265.         else
  266.         { 
  267. if (pnJs[k]!=k)
  268.             {
  269. for (i=0;i<=n-1;i++)
  270.                 { 
  271. p=i*n+k; 
  272. q=i*n+pnJs[k];
  273. t=pDataCoef[p]; 
  274. pDataCoef[p]=pDataCoef[q]; 
  275. pDataCoef[q]=t;
  276.                 }
  277. }
  278.             if (nIs!=k)
  279.             { 
  280. for (j=k;j<=n-1;j++)
  281.                 { 
  282. p=k*n+j; 
  283. q=nIs*n+j;
  284.                     t=pDataCoef[p]; 
  285. pDataCoef[p]=pDataCoef[q]; 
  286. pDataCoef[q]=t;
  287.                 }
  288.                 
  289. for (j=0;j<=m-1;j++)
  290.                 { 
  291. p=k*m+j; 
  292. q=nIs*m+j;
  293.                     t=pDataConst[p]; 
  294. pDataConst[p]=pDataConst[q]; 
  295. pDataConst[q]=t;
  296.                 }
  297.             }
  298.         }
  299.         
  300. // 求解失败
  301. if (l==0)
  302.         { 
  303. delete[] pnJs;
  304.             return FALSE;
  305.         }
  306.         
  307. d=pDataCoef[k*n+k];
  308.         for (j=k+1;j<=n-1;j++)
  309.         { 
  310. p=k*n+j; 
  311. pDataCoef[p]=pDataCoef[p]/d;
  312. }
  313.         
  314. for (j=0;j<=m-1;j++)
  315.         { 
  316. p=k*m+j; 
  317. pDataConst[p]=pDataConst[p]/d;
  318. }
  319.         
  320. for (j=k+1;j<=n-1;j++)
  321.         {
  322. for (i=0;i<=n-1;i++)
  323.             { 
  324. p=i*n+j;
  325. if (i!=k)
  326. pDataCoef[p]=pDataCoef[p]-pDataCoef[i*n+k]*pDataCoef[k*n+j];
  327.             }
  328. }
  329.         for (j=0;j<=m-1;j++)
  330.         {
  331. for (i=0;i<=n-1;i++)
  332. p=i*m+j;
  333. if (i!=k)
  334. pDataConst[p]=pDataConst[p]-pDataCoef[i*n+k]*pDataConst[k*m+j];
  335. }
  336. }
  337.     }
  338.     
  339. // 调整
  340. for (k=n-1;k>=0;k--)
  341.     {
  342. if (pnJs[k]!=k)
  343. {
  344. for (j=0;j<=m-1;j++)
  345. p=k*m+j; 
  346. q=pnJs[k]*m+j;
  347. t=pDataConst[p]; 
  348. pDataConst[p]=pDataConst[q]; 
  349. pDataConst[q]=t;
  350. }
  351. }
  352. }
  353. // 清理内存
  354.     delete[] pnJs;
  355.     
  356. return TRUE;
  357. }
  358. //////////////////////////////////////////////////////////////////////
  359. // 复系数方程组的全选主元高斯消去法
  360. //
  361. // 参数:
  362. // 1. const CMatrix& mtxCoefImag - 系数矩阵的虚部矩阵
  363. // 2. const CMatrix& mtxConstImag - 常数矩阵的虚部矩阵
  364. // 3. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵的实部矩阵
  365. // 4. CMatrix& mtxResultImag - CMatrix引用对象,返回方程组解矩阵的虚部矩阵
  366. //
  367. // 返回值:BOOL 型,方程组求解是否成功
  368. //////////////////////////////////////////////////////////////////////
  369. BOOL CLEquations::GetRootsetGauss(const CMatrix& mtxCoefImag, const CMatrix& mtxConstImag, CMatrix& mtxResult, CMatrix& mtxResultImag)
  370. int *pnJs,l,k,i,j,nIs,u,v;
  371.     double p,q,s,d;
  372. // 方程组的属性,将常数矩阵赋给解矩阵
  373. mtxResult = m_mtxConst;
  374. mtxResultImag = mtxConstImag;
  375. double *pDataCoef = m_mtxCoef.GetData();
  376. double *pDataConst = mtxResult.GetData();
  377. double *pDataCoefImag = mtxCoefImag.GetData();
  378. double *pDataConstImag = mtxResultImag.GetData();
  379. int n = GetNumUnknowns();
  380. int m = m_mtxConst.GetNumColumns();
  381. // 临时缓冲区,存放变换的列数
  382.     pnJs = new int[n];
  383.     
  384. // 消元
  385. for (k=0;k<=n-2;k++)
  386.     { 
  387. d=0.0;
  388.         for (i=k;i<=n-1;i++)
  389.         {
  390. for (j=k;j<=n-1;j++)
  391. u=i*n+j;
  392. p=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u];
  393. if (p>d) 
  394. {
  395. d=p;
  396. pnJs[k]=j;
  397. nIs=i;
  398. }
  399. }
  400.         }
  401.         
  402. // 求解失败
  403. if (d == 0.0)
  404. {
  405. delete[] pnJs;
  406. return FALSE;
  407.         }
  408.         
  409. if (nIs!=k)
  410.         { 
  411. for (j=k;j<=n-1;j++)
  412.             { 
  413. u=k*n+j; 
  414. v=nIs*n+j;
  415.                 p=pDataCoef[u]; 
  416. pDataCoef[u]=pDataCoef[v]; 
  417. pDataCoef[v]=p;
  418.                 p=pDataCoefImag[u]; 
  419. pDataCoefImag[u]=pDataCoefImag[v]; 
  420. pDataCoefImag[v]=p;
  421.             }
  422.             
  423. p=pDataConst[k]; 
  424. pDataConst[k]=pDataConst[nIs]; 
  425. pDataConst[nIs]=p;
  426.             p=pDataConstImag[k]; 
  427. pDataConstImag[k]=pDataConstImag[nIs]; 
  428. pDataConstImag[nIs]=p;
  429.         }
  430.         
  431. if (pnJs[k]!=k)
  432.         {
  433. for (i=0;i<=n-1;i++)
  434.             { 
  435. u=i*n+k; 
  436. v=i*n+pnJs[k];
  437. p=pDataCoef[u]; 
  438. pDataCoef[u]=pDataCoef[v]; 
  439. pDataCoef[v]=p;
  440. p=pDataCoefImag[u]; 
  441. pDataCoefImag[u]=pDataCoefImag[v]; 
  442. pDataCoefImag[v]=p;
  443.             }
  444. }
  445.         v=k*n+k;
  446.         for (j=k+1;j<=n-1;j++)
  447.         { 
  448. u=k*n+j;
  449.             p=pDataCoef[u]*pDataCoef[v]; 
  450. q=-pDataCoefImag[u]*pDataCoefImag[v];
  451.             s=(pDataCoef[v]-pDataCoefImag[v])*(pDataCoef[u]+pDataCoefImag[u]);
  452.             pDataCoef[u]=(p-q)/d; 
  453. pDataCoefImag[u]=(s-p-q)/d;
  454.         }
  455.         
  456. p=pDataConst[k]*pDataCoef[v]; 
  457. q=-pDataConstImag[k]*pDataCoefImag[v];
  458.         s=(pDataCoef[v]-pDataCoefImag[v])*(pDataConst[k]+pDataConstImag[k]);
  459.         pDataConst[k]=(p-q)/d; 
  460. pDataConstImag[k]=(s-p-q)/d;
  461.         for (i=k+1;i<=n-1;i++)
  462.         { 
  463. u=i*n+k;
  464.             for (j=k+1;j<=n-1;j++)
  465.             { 
  466. v=k*n+j; 
  467. l=i*n+j;
  468.                 p=pDataCoef[u]*pDataCoef[v]; 
  469. q=pDataCoefImag[u]*pDataCoefImag[v];
  470.                 s=(pDataCoef[u]+pDataCoefImag[u])*(pDataCoef[v]+pDataCoefImag[v]);
  471.                 pDataCoef[l]=pDataCoef[l]-p+q;
  472.                 pDataCoefImag[l]=pDataCoefImag[l]-s+p+q;
  473.             }
  474.             
  475. p=pDataCoef[u]*pDataConst[k]; 
  476. q=pDataCoefImag[u]*pDataConstImag[k];
  477.             s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[k]+pDataConstImag[k]);
  478.             pDataConst[i]=pDataConst[i]-p+q; 
  479. pDataConstImag[i]=pDataConstImag[i]-s+p+q;
  480.         }
  481.     }
  482.     
  483. u=(n-1)*n+n-1;
  484.     d=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u];
  485. // 求解失败
  486.     if (d == 0.0)
  487. {
  488. delete[] pnJs;
  489. return FALSE;
  490.     }
  491. // 求解
  492.     p=pDataCoef[u]*pDataConst[n-1]; q=-pDataCoefImag[u]*pDataConstImag[n-1];
  493.     s=(pDataCoef[u]-pDataCoefImag[u])*(pDataConst[n-1]+pDataConstImag[n-1]);
  494.     pDataConst[n-1]=(p-q)/d; pDataConstImag[n-1]=(s-p-q)/d;
  495.     for (i=n-2;i>=0;i--)
  496.     {
  497. for (j=i+1;j<=n-1;j++)
  498. u=i*n+j;
  499. p=pDataCoef[u]*pDataConst[j]; 
  500. q=pDataCoefImag[u]*pDataConstImag[j];
  501. s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[j]+pDataConstImag[j]);
  502. pDataConst[i]=pDataConst[i]-p+q;
  503. pDataConstImag[i]=pDataConstImag[i]-s+p+q;
  504. }
  505.     }
  506. // 调整位置
  507.     pnJs[n-1]=n-1;
  508.     for (k=n-1;k>=0;k--)
  509.     {
  510. if (pnJs[k]!=k)
  511.         { 
  512. p=pDataConst[k]; 
  513. pDataConst[k]=pDataConst[pnJs[k]]; 
  514. pDataConst[pnJs[k]]=p;
  515. p=pDataConstImag[k]; 
  516. pDataConstImag[k]=pDataConstImag[pnJs[k]]; 
  517. pDataConstImag[pnJs[k]]=p;
  518.         }
  519. }
  520. // 清理内存
  521. delete[] pnJs;
  522. return TRUE;
  523. }
  524. //////////////////////////////////////////////////////////////////////
  525. // 复系数方程组的全选主元高斯-约当消去法
  526. //
  527. // 参数:
  528. // 1. const CMatrix& mtxCoefImag - 系数矩阵的虚部矩阵
  529. // 2. const CMatrix& mtxConstImag - 常数矩阵的虚部矩阵
  530. // 3. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵的实部矩阵
  531. // 4. CMatrix& mtxResultImag - CMatrix引用对象,返回方程组解矩阵的虚部矩阵
  532. //
  533. // 返回值:BOOL 型,方程组求解是否成功
  534. //////////////////////////////////////////////////////////////////////
  535. BOOL CLEquations::GetRootsetGaussJordan(const CMatrix& mtxCoefImag, const CMatrix& mtxConstImag, CMatrix& mtxResult, CMatrix& mtxResultImag)
  536. {
  537. int *pnJs,l,k,i,j,nIs,u,v;
  538.     double p,q,s,d;
  539. // 方程组的属性,将常数矩阵赋给解矩阵
  540. mtxResult = m_mtxConst;
  541. mtxResultImag = mtxConstImag;
  542. double *pDataCoef = m_mtxCoef.GetData();
  543. double *pDataConst = mtxResult.GetData();
  544. double *pDataCoefImag = mtxCoefImag.GetData();
  545. double *pDataConstImag = mtxResultImag.GetData();
  546. int n = GetNumUnknowns();
  547. int m = m_mtxConst.GetNumColumns();
  548. // 临时缓冲区,存放变换的列数
  549.     pnJs = new int[n];
  550. // 消元
  551.     for (k=0;k<=n-1;k++)
  552.     { 
  553. d=0.0;
  554.         for (i=k;i<=n-1;i++)
  555.         {
  556. for (j=k;j<=n-1;j++)
  557. u=i*n+j;
  558. p=pDataCoef[u]*pDataCoef[u]+pDataCoefImag[u]*pDataCoefImag[u];
  559. if (p>d) 
  560. {
  561. d=p;
  562. pnJs[k]=j;
  563. nIs=i;
  564. }
  565. }
  566.         }
  567.         
  568. // 求解失败
  569. if (d == 0.0)
  570.         {
  571. delete[] pnJs;
  572.             return FALSE;
  573.         }
  574.         
  575. if (nIs!=k)
  576.         { 
  577. for (j=k;j<=n-1;j++)
  578.             { 
  579. u=k*n+j; 
  580. v=nIs*n+j;
  581.                 p=pDataCoef[u]; 
  582. pDataCoef[u]=pDataCoef[v]; 
  583. pDataCoef[v]=p;
  584.                 p=pDataCoefImag[u]; 
  585. pDataCoefImag[u]=pDataCoefImag[v]; 
  586. pDataCoefImag[v]=p;
  587.             }
  588.             
  589. for (j=0;j<=m-1;j++)
  590.             { 
  591. u=k*m+j; 
  592. v=nIs*m+j;
  593.                 p=pDataConst[u]; 
  594. pDataConst[u]=pDataConst[v]; 
  595. pDataConst[v]=p;
  596.                 p=pDataConstImag[u]; 
  597. pDataConstImag[u]=pDataConstImag[v]; 
  598. pDataConstImag[v]=p;
  599.             }
  600.         }
  601.         
  602. if (pnJs[k]!=k)
  603.         {
  604. for (i=0;i<=n-1;i++)
  605.             { 
  606. u=i*n+k; 
  607. v=i*n+pnJs[k];
  608. p=pDataCoef[u]; 
  609. pDataCoef[u]=pDataCoef[v]; 
  610. pDataCoef[v]=p;
  611. p=pDataCoefImag[u]; 
  612. pDataCoefImag[u]=pDataCoefImag[v]; 
  613. pDataCoefImag[v]=p;
  614.             }
  615. }
  616.         v=k*n+k;
  617.         for (j=k+1;j<=n-1;j++)
  618.         { 
  619. u=k*n+j;
  620.             p=pDataCoef[u]*pDataCoef[v]; 
  621. q=-pDataCoefImag[u]*pDataCoefImag[v];
  622.             s=(pDataCoef[v]-pDataCoefImag[v])*(pDataCoef[u]+pDataCoefImag[u]);
  623.             pDataCoef[u]=(p-q)/d; 
  624. pDataCoefImag[u]=(s-p-q)/d;
  625.         }
  626.         
  627. for (j=0;j<=m-1;j++)
  628.         { 
  629. u=k*m+j;
  630.             p=pDataConst[u]*pDataCoef[v]; 
  631. q=-pDataConstImag[u]*pDataCoefImag[v];
  632.             s=(pDataCoef[v]-pDataCoefImag[v])*(pDataConst[u]+pDataConstImag[u]);
  633.             pDataConst[u]=(p-q)/d; 
  634. pDataConstImag[u]=(s-p-q)/d;
  635.         }
  636.         
  637. for (i=0;i<=n-1;i++)
  638.         {
  639. if (i!=k)
  640.             { 
  641. u=i*n+k;
  642. for (j=k+1;j<=n-1;j++)
  643.                 { 
  644. v=k*n+j; 
  645. l=i*n+j;
  646. p=pDataCoef[u]*pDataCoef[v]; 
  647. q=pDataCoefImag[u]*pDataCoefImag[v];
  648. s=(pDataCoef[u]+pDataCoefImag[u])*(pDataCoef[v]+pDataCoefImag[v]);
  649. pDataCoef[l]=pDataCoef[l]-p+q;
  650. pDataCoefImag[l]=pDataCoefImag[l]-s+p+q;
  651.                 }
  652.             
  653. for (j=0;j<=m-1;j++)
  654. l=i*m+j; 
  655. v=k*m+j;
  656. p=pDataCoef[u]*pDataConst[v]; q=pDataCoefImag[u]*pDataConstImag[v];
  657. s=(pDataCoef[u]+pDataCoefImag[u])*(pDataConst[v]+pDataConstImag[v]);
  658. pDataConst[l]=pDataConst[l]-p+q; 
  659. pDataConstImag[l]=pDataConstImag[l]-s+p+q;
  660. }
  661.             }
  662. }
  663.     }
  664. // 求解调整
  665. for (k=n-1;k>=0;k--)
  666.     {
  667. if (pnJs[k]!=k)
  668. {
  669. for (j=0;j<=m-1;j++)
  670. u=k*m+j;
  671. v=pnJs[k]*m+j;
  672. p=pDataConst[u]; 
  673. pDataConst[u]=pDataConst[v]; 
  674. pDataConst[v]=p;
  675. p=pDataConstImag[u]; 
  676. pDataConstImag[u]=pDataConstImag[v]; 
  677. pDataConstImag[v]=p;
  678. }
  679. }
  680. }
  681. // 清理内存
  682. delete[] pnJs;
  683. return TRUE;
  684. }
  685. //////////////////////////////////////////////////////////////////////
  686. // 求解三对角线方程组的追赶法
  687. //
  688. // 参数:
  689. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  690. //
  691. // 返回值:BOOL 型,方程组求解是否成功
  692. //////////////////////////////////////////////////////////////////////
  693. BOOL CLEquations::GetRootsetTriDiagonal(CMatrix& mtxResult)
  694. int k,j;
  695.     double s;
  696.     
  697. // 将常数矩阵赋给解矩阵
  698. mtxResult = m_mtxConst;
  699. double *pDataConst = mtxResult.GetData();
  700. int n = GetNumUnknowns();
  701. ASSERT(m_mtxCoef.GetNumRows() == n);
  702. // 为系数矩阵对角线数组分配内存
  703. double* pDiagData = new double[3*n-2];
  704. // 构造系数矩阵对角线元素数组
  705. k = j = 0;
  706. if (k == 0)
  707. {
  708. pDiagData[j++] = m_mtxCoef.GetElement(k, k);
  709. pDiagData[j++] = m_mtxCoef.GetElement(k, k+1);
  710. }
  711.     for (k=1; k<n-1; ++k)
  712. {
  713. pDiagData[j++] = m_mtxCoef.GetElement(k, k-1);
  714. pDiagData[j++] = m_mtxCoef.GetElement(k, k);
  715. pDiagData[j++] = m_mtxCoef.GetElement(k, k+1);
  716. }
  717. if (k == n-1)
  718. {
  719. pDiagData[j++] = m_mtxCoef.GetElement(k, k-1);
  720. pDiagData[j++] = m_mtxCoef.GetElement(k, k);
  721. }
  722. // 求解
  723. for (k=0;k<=n-2;k++)
  724.     { 
  725. j=3*k; 
  726. s=pDiagData[j];
  727. // 求解失败
  728.         if (fabs(s)+1.0==1.0)
  729. {
  730. delete[] pDiagData;
  731. return FALSE;
  732. }
  733.         pDiagData[j+1]=pDiagData[j+1]/s;
  734.         pDataConst[k]=pDataConst[k]/s;
  735.         pDiagData[j+3]=pDiagData[j+3]-pDiagData[j+2]*pDiagData[j+1];
  736.         pDataConst[k+1]=pDataConst[k+1]-pDiagData[j+2]*pDataConst[k];
  737.     }
  738.     
  739. s=pDiagData[3*n-3];
  740.     if (s == 0.0)
  741. {
  742. delete[] pDiagData;
  743. return FALSE;
  744. }
  745.     
  746. // 调整
  747. pDataConst[n-1]=pDataConst[n-1]/s;
  748.     for (k=n-2;k>=0;k--)
  749. pDataConst[k]=pDataConst[k]-pDiagData[3*k+1]*pDataConst[k+1];
  750.     
  751. // 释放内存
  752. delete[] pDiagData;
  753. return TRUE;
  754. }
  755. //////////////////////////////////////////////////////////////////////
  756. // 一般带型方程组的求解
  757. //
  758. // 参数:
  759. // 1. int nBandWidth - 带宽
  760. // 2. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  761. //
  762. // 返回值:BOOL 型,方程组求解是否成功
  763. //////////////////////////////////////////////////////////////////////
  764. BOOL CLEquations::GetRootsetBand(int nBandWidth, CMatrix& mtxResult)
  765. int ls,k,i,j,is,u,v;
  766.     double p,t;
  767.     
  768. // 带宽必须为奇数
  769. if ((nBandWidth-1)%2 != 0)
  770. return FALSE;
  771. // 将常数矩阵赋给解矩阵
  772. mtxResult = m_mtxConst;
  773. double *pDataConst = mtxResult.GetData();
  774. // 方程组属性
  775. int m = m_mtxConst.GetNumColumns();
  776. int n = GetNumUnknowns();
  777. ASSERT(m_mtxCoef.GetNumRows() == n);
  778. // 带宽数组:带型矩阵的有效数据
  779. double* pBandData = new double[nBandWidth*n];
  780. // 半带宽
  781.     ls = (nBandWidth-1)/2;
  782. // 构造带宽数组
  783.     for (i=0; i<n; ++i)
  784. {
  785. j = 0;
  786. for (k=max(0, i-ls); k<max(0, i-ls)+nBandWidth; ++k)
  787. {
  788. if (k < n)
  789. pBandData[i*nBandWidth+j++] = m_mtxCoef.GetElement(i, k);
  790. else
  791. pBandData[i*nBandWidth+j++] = 0;
  792. }
  793. }
  794. // 求解
  795.     for (k=0;k<=n-2;k++)
  796.     { 
  797. p=0.0;
  798.         for (i=k;i<=ls;i++)
  799.         { 
  800. t=fabs(pBandData[i*nBandWidth]);
  801.             if (t>p) 
  802. {
  803. p=t; 
  804. is=i;
  805. }
  806.         }
  807.         
  808. if (p == 0.0)
  809. {
  810. delete[] pBandData;
  811. return FALSE;
  812. }
  813.         for (j=0;j<=m-1;j++)
  814.         { 
  815. u=k*m+j; 
  816. v=is*m+j;
  817.             t=pDataConst[u]; 
  818. pDataConst[u]=pDataConst[v]; 
  819. pDataConst[v]=t;
  820.         }
  821.         
  822. for (j=0;j<=nBandWidth-1;j++)
  823.         { 
  824. u=k*nBandWidth+j; 
  825. v=is*nBandWidth+j;
  826.             t=pBandData[u]; 
  827. pBandData[u]=pBandData[v]; 
  828. pBandData[v]=t;
  829.         }
  830.         
  831. for (j=0;j<=m-1;j++)
  832.         { 
  833. u=k*m+j; 
  834. pDataConst[u]=pDataConst[u]/pBandData[k*nBandWidth];
  835. }
  836.         
  837. for (j=1;j<=nBandWidth-1;j++)
  838.         { 
  839. u=k*nBandWidth+j; 
  840. pBandData[u]=pBandData[u]/pBandData[k*nBandWidth];
  841. }
  842.         
  843. for (i=k+1;i<=ls;i++)
  844.         { 
  845. t=pBandData[i*nBandWidth];
  846.             for (j=0;j<=m-1;j++)
  847.             { 
  848. u=i*m+j; 
  849. v=k*m+j;
  850.                 pDataConst[u]=pDataConst[u]-t*pDataConst[v];
  851.             }
  852.             
  853. for (j=1;j<=nBandWidth-1;j++)
  854.             { 
  855. u=i*nBandWidth+j; 
  856. v=k*nBandWidth+j;
  857.                 pBandData[u-1]=pBandData[u]-t*pBandData[v];
  858.             }
  859.             
  860. u=i*nBandWidth+nBandWidth-1; pBandData[u]=0.0;
  861.         }
  862.         
  863. if (ls!=(n-1)) 
  864. ls=ls+1;
  865.     }
  866.     
  867. p=pBandData[(n-1)*nBandWidth];
  868.     if (p == 0.0)
  869. {
  870. delete[] pBandData;
  871. return FALSE;
  872. }
  873.     for (j=0;j<=m-1;j++)
  874.     { 
  875. u=(n-1)*m+j; 
  876. pDataConst[u]=pDataConst[u]/p;
  877. }
  878.     
  879. ls=1;
  880.     for (i=n-2;i>=0;i--)
  881.     { 
  882. for (k=0;k<=m-1;k++)
  883.         { 
  884. u=i*m+k;
  885.             for (j=1;j<=ls;j++)
  886.             { 
  887. v=i*nBandWidth+j; 
  888. is=(i+j)*m+k;
  889.                 pDataConst[u]=pDataConst[u]-pBandData[v]*pDataConst[is];
  890.             }
  891.         }
  892.         
  893. if (ls!=(nBandWidth-1)) 
  894. ls=ls+1;
  895.     }
  896.     
  897. // 释放内存
  898. delete[] pBandData;
  899. return TRUE;
  900. }
  901. //////////////////////////////////////////////////////////////////////
  902. // 求解对称方程组的分解法
  903. //
  904. // 参数:
  905. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  906. //
  907. // 返回值:BOOL 型,方程组求解是否成功
  908. //////////////////////////////////////////////////////////////////////
  909. BOOL CLEquations::GetRootsetDjn(CMatrix& mtxResult)
  910. int i,j,l,k,u,v,w,k1,k2,k3;
  911.     double p;
  912. // 方程组属性,将常数矩阵赋给解矩阵
  913. CMatrix mtxCoef = m_mtxCoef;
  914. mtxResult = m_mtxConst;
  915. int n = mtxCoef.GetNumColumns();
  916. int m = mtxResult.GetNumColumns();
  917. double* pDataCoef = mtxCoef.GetData();
  918. double* pDataConst = mtxResult.GetData();
  919. // 非对称系数矩阵,不能用本方法求解
  920.     if (pDataCoef[0] == 0.0)
  921. return FALSE;
  922.     for (i=1; i<=n-1; i++)
  923.     { 
  924. u=i*n; 
  925. pDataCoef[u]=pDataCoef[u]/pDataCoef[0];
  926. }
  927.     
  928. for (i=1; i<=n-2; i++)
  929.     { 
  930. u=i*n+i;
  931.         for (j=1; j<=i; j++)
  932.         { 
  933. v=i*n+j-1; 
  934. l=(j-1)*n+j-1;
  935.             pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]*pDataCoef[l];
  936.         }
  937.         
  938. p=pDataCoef[u];
  939.         if (p == 0.0)
  940. return FALSE;
  941.         for (k=i+1; k<=n-1; k++)
  942.         { 
  943. u=k*n+i;
  944.             for (j=1; j<=i; j++)
  945.             { 
  946. v=k*n+j-1; 
  947. l=i*n+j-1; 
  948. w=(j-1)*n+j-1;
  949. pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[l]*pDataCoef[w];
  950.             }
  951.             
  952. pDataCoef[u]=pDataCoef[u]/p;
  953.         }
  954.     }
  955.     
  956. u=n*n-1;
  957.     for (j=1; j<=n-1; j++)
  958.     { 
  959. v=(n-1)*n+j-1; 
  960. w=(j-1)*n+j-1;
  961.         pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v]*pDataCoef[w];
  962.     }
  963.     
  964. p=pDataCoef[u];
  965.     if (p == 0.0)
  966. return FALSE;
  967.     for (j=0; j<=m-1; j++)
  968. {
  969.     for (i=1; i<=n-1; i++)
  970. u=i*m+j;
  971. for (k=1; k<=i; k++)
  972. v=i*n+k-1; 
  973. w=(k-1)*m+j;
  974. pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[w];
  975. }
  976. }
  977. }
  978.     for (i=1; i<=n-1; i++)
  979.     { 
  980. u=(i-1)*n+i-1;
  981.         for (j=i; j<=n-1; j++)
  982.         { 
  983. v=(i-1)*n+j; 
  984. w=j*n+i-1;
  985.             pDataCoef[v]=pDataCoef[u]*pDataCoef[w];
  986.         }
  987.     }
  988.     
  989. for (j=0; j<=m-1; j++)
  990.     { 
  991. u=(n-1)*m+j;
  992.         pDataConst[u]=pDataConst[u]/p;
  993.         for (k=1; k<=n-1; k++)
  994.         { 
  995. k1=n-k; 
  996. k3=k1-1; 
  997. u=k3*m+j;
  998.             for (k2=k1; k2<=n-1; k2++)
  999.             { 
  1000. v=k3*n+k2; 
  1001. w=k2*m+j;
  1002.                 pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[w];
  1003.             }
  1004.             
  1005. pDataConst[u]=pDataConst[u]/pDataCoef[k3*n+k3];
  1006.         }
  1007.     }
  1008.     
  1009. return TRUE;
  1010. }
  1011. //////////////////////////////////////////////////////////////////////
  1012. // 求解对称正定方程组的平方根法
  1013. //
  1014. // 参数:
  1015. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1016. //
  1017. // 返回值:BOOL 型,方程组求解是否成功
  1018. //////////////////////////////////////////////////////////////////////
  1019. BOOL CLEquations::GetRootsetCholesky(CMatrix& mtxResult)
  1020. int i,j,k,u,v;
  1021.     
  1022. // 方程组属性,将常数矩阵赋给解矩阵
  1023. CMatrix mtxCoef = m_mtxCoef;
  1024. mtxResult = m_mtxConst;
  1025. int n = mtxCoef.GetNumColumns();
  1026. int m = mtxResult.GetNumColumns();
  1027. double* pDataCoef = mtxCoef.GetData();
  1028. double* pDataConst = mtxResult.GetData();
  1029.     
  1030. // 非对称正定系数矩阵,不能用本方法求解
  1031. if (pDataCoef[0] <= 0.0)
  1032. return FALSE;
  1033. pDataCoef[0]=sqrt(pDataCoef[0]);
  1034.     for (j=1; j<=n-1; j++) 
  1035. pDataCoef[j]=pDataCoef[j]/pDataCoef[0];
  1036.     
  1037. for (i=1; i<=n-1; i++)
  1038.     { 
  1039. u=i*n+i;
  1040.         for (j=1; j<=i; j++)
  1041.         { 
  1042. v=(j-1)*n+i;
  1043.             pDataCoef[u]=pDataCoef[u]-pDataCoef[v]*pDataCoef[v];
  1044.         }
  1045.         
  1046. if (pDataCoef[u] <= 0.0)
  1047. return FALSE;
  1048.         pDataCoef[u]=sqrt(pDataCoef[u]);
  1049.         if (i!=(n-1))
  1050.         { 
  1051. for (j=i+1; j<=n-1; j++)
  1052.             { 
  1053. v=i*n+j;
  1054.                 for (k=1; k<=i; k++)
  1055. pDataCoef[v]=pDataCoef[v]-pDataCoef[(k-1)*n+i]*pDataCoef[(k-1)*n+j];
  1056.                 pDataCoef[v]=pDataCoef[v]/pDataCoef[u];
  1057.             }
  1058.         }
  1059.     }
  1060.     
  1061. for (j=0; j<=m-1; j++)
  1062.     { 
  1063. pDataConst[j]=pDataConst[j]/pDataCoef[0];
  1064.         for (i=1; i<=n-1; i++)
  1065.         { 
  1066. u=i*n+i; 
  1067. v=i*m+j;
  1068.             for (k=1; k<=i; k++)
  1069. pDataConst[v]=pDataConst[v]-pDataCoef[(k-1)*n+i]*pDataConst[(k-1)*m+j];
  1070.             pDataConst[v]=pDataConst[v]/pDataCoef[u];
  1071.         }
  1072.     }
  1073.     
  1074. for (j=0; j<=m-1; j++)
  1075.     { 
  1076. u=(n-1)*m+j;
  1077.         pDataConst[u]=pDataConst[u]/pDataCoef[n*n-1];
  1078.         for (k=n-1; k>=1; k--)
  1079.         { 
  1080. u=(k-1)*m+j;
  1081.             for (i=k; i<=n-1; i++)
  1082.             { 
  1083. v=(k-1)*n+i;
  1084.                 pDataConst[u]=pDataConst[u]-pDataCoef[v]*pDataConst[i*m+j];
  1085.             }
  1086.             
  1087. v=(k-1)*n+k-1;
  1088.             pDataConst[u]=pDataConst[u]/pDataCoef[v];
  1089.         }
  1090.     }
  1091.     
  1092. return TRUE;
  1093. }
  1094. //////////////////////////////////////////////////////////////////////
  1095. // 求解大型稀疏方程组的全选主元高斯-约去消去法
  1096. //
  1097. // 参数:
  1098. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1099. //
  1100. // 返回值:BOOL 型,方程组求解是否成功
  1101. //////////////////////////////////////////////////////////////////////
  1102. BOOL CLEquations::GetRootsetGgje(CMatrix& mtxResult)
  1103. int *pnJs,i,j,k,nIs,u,v;
  1104.     double d,t;
  1105.     
  1106. // 方程组属性,将常数矩阵赋给解矩阵
  1107. CMatrix mtxCoef = m_mtxCoef;
  1108. mtxResult = m_mtxConst;
  1109. int n = mtxCoef.GetNumColumns();
  1110. double* pDataCoef = mtxCoef.GetData();
  1111. double* pDataConst = mtxResult.GetData();
  1112. // 临时缓冲区,存放变换的列数
  1113. pnJs = new int[n];
  1114. // 消元
  1115.     for (k=0; k<=n-1; k++)
  1116.     { 
  1117. d=0.0;
  1118.         for (i=k; i<=n-1; i++)
  1119. {
  1120. for (j=k; j<=n-1; j++)
  1121. t=fabs(pDataCoef[i*n+j]);
  1122. if (t>d) 
  1123. {
  1124. d=t; 
  1125. pnJs[k]=j; 
  1126. nIs=i;
  1127. }
  1128. }
  1129. }
  1130.         if (d == 0.0)
  1131. {
  1132. delete[] pnJs;
  1133. return FALSE;
  1134. }
  1135.         if (nIs!=k)
  1136.         { 
  1137. for (j=k; j<=n-1; j++)
  1138.             { 
  1139. u=k*n+j; 
  1140. v=nIs*n+j;
  1141.                 t=pDataCoef[u]; 
  1142. pDataCoef[u]=pDataCoef[v]; 
  1143. pDataCoef[v]=t;
  1144.             }
  1145.             
  1146. t=pDataConst[k]; 
  1147. pDataConst[k]=pDataConst[nIs]; 
  1148. pDataConst[nIs]=t;
  1149.         }
  1150.         
  1151. if (pnJs[k]!=k)
  1152.         {
  1153. for (i=0; i<=n-1; i++)
  1154.             { 
  1155. u=i*n+k; 
  1156. v=i*n+pnJs[k];
  1157. t=pDataCoef[u]; 
  1158. pDataCoef[u]=pDataCoef[v]; 
  1159. pDataCoef[v]=t;
  1160.             }
  1161. }
  1162.         t=pDataCoef[k*n+k];
  1163.         for (j=k+1; j<=n-1; j++)
  1164.         { 
  1165. u=k*n+j;
  1166.             if (pDataCoef[u]!=0.0) 
  1167. pDataCoef[u]=pDataCoef[u]/t;
  1168.         }
  1169.         
  1170. pDataConst[k]=pDataConst[k]/t;
  1171.         for (j=k+1; j<=n-1; j++)
  1172.         { 
  1173. u=k*n+j;
  1174.             if (pDataCoef[u]!=0.0)
  1175.             { 
  1176. for (i=0; i<=n-1; i++)
  1177.                 { 
  1178. v=i*n+k;
  1179.                     if ((i!=k)&&(pDataCoef[v]!=0.0))
  1180.                     { 
  1181. nIs=i*n+j;
  1182.                         pDataCoef[nIs]=pDataCoef[nIs]-pDataCoef[v]*pDataCoef[u];
  1183.                     }
  1184.                 }
  1185.             }
  1186.         }
  1187.         
  1188. for (i=0; i<=n-1; i++)
  1189.         { 
  1190. u=i*n+k;
  1191.             if ((i!=k)&&(pDataCoef[u]!=0.0))
  1192. pDataConst[i]=pDataConst[i]-pDataCoef[u]*pDataConst[k];
  1193.         }
  1194.     }
  1195.     
  1196. // 调整
  1197. for (k=n-1; k>=0; k--)
  1198.     {
  1199. if (k!=pnJs[k])
  1200.         { 
  1201. t=pDataConst[k]; 
  1202. pDataConst[k]=pDataConst[pnJs[k]]; 
  1203. pDataConst[pnJs[k]]=t;
  1204. }
  1205. }
  1206. // 释放内存
  1207.     delete[] pnJs;
  1208.     
  1209. return TRUE;
  1210. }
  1211. //////////////////////////////////////////////////////////////////////
  1212. // 求解托伯利兹方程组的列文逊方法
  1213. //
  1214. // 参数:
  1215. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1216. //
  1217. // 返回值:BOOL 型,方程组求解是否成功
  1218. //////////////////////////////////////////////////////////////////////
  1219. BOOL CLEquations::GetRootsetTlvs(CMatrix& mtxResult)
  1220. int i,j,k;
  1221.     double a,beta,q,c,h,*y,*s;
  1222. // 未知数个数
  1223.     int n = m_mtxCoef.GetNumColumns();
  1224. // 初始化解解向量
  1225. mtxResult.Init(n, 1);
  1226. double* x = mtxResult.GetData();
  1227. // 常数数组
  1228. double* pDataConst = m_mtxConst.GetData();
  1229. // 建立T数组
  1230. double* t = new double[n];
  1231. // 构造T数组
  1232.     for (i=0; i<n; ++i)
  1233. t[i] = m_mtxCoef.GetElement(0, i);
  1234. // 临时数组
  1235. s = new double[n];
  1236.     y = new double[n];
  1237. // 非托伯利兹方程组,不能用本方法求解
  1238.     a=t[0];
  1239.     if (a == 0.0)
  1240.     { 
  1241. delete[] s;
  1242. delete[] y;
  1243. delete[] t;
  1244. return FALSE;
  1245. }
  1246. // 列文逊方法求解
  1247.     y[0]=1.0; 
  1248. x[0]=pDataConst[0]/a;
  1249.     for (k=1; k<=n-1; k++)
  1250.     { 
  1251. beta=0.0; 
  1252. q=0.0;
  1253.         for (j=0; j<=k-1; j++)
  1254.         { 
  1255. beta=beta+y[j]*t[j+1];
  1256.             q=q+x[j]*t[k-j];
  1257.         }
  1258.         
  1259. if (a == 0.0)
  1260. delete[] s;
  1261. delete[] y;
  1262. delete[] t;
  1263. return FALSE;
  1264. }
  1265.         c=-beta/a; 
  1266. s[0]=c*y[k-1]; 
  1267. y[k]=y[k-1];
  1268.         if (k!=1)
  1269.         {
  1270. for (i=1; i<=k-1; i++)
  1271. s[i]=y[i-1]+c*y[k-i-1];
  1272. }
  1273.         a=a+c*beta;
  1274. if (a == 0.0)
  1275. delete[] s;
  1276. delete[] y;
  1277. delete[] t;
  1278. return FALSE;
  1279. }
  1280.         h=(pDataConst[k]-q)/a;
  1281.         for (i=0; i<=k-1; i++)
  1282.         { 
  1283. x[i]=x[i]+h*s[i]; 
  1284. y[i]=s[i];
  1285. }
  1286.         
  1287. x[k]=h*y[k];
  1288.     }
  1289.     
  1290. // 释放内存
  1291. delete[] s;
  1292. delete[] y;
  1293. delete[] t;
  1294.     return TRUE;
  1295. }
  1296. //////////////////////////////////////////////////////////////////////
  1297. // 高斯-赛德尔迭代法
  1298. //
  1299. // 参数:
  1300. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1301. // 2. double eps - 控制精度,默认值为0.000001
  1302. //
  1303. // 返回值:BOOL 型,方程组求解是否成功
  1304. //////////////////////////////////////////////////////////////////////
  1305. BOOL CLEquations::GetRootsetGaussSeidel(CMatrix& mtxResult, double eps /*= 0.000001*/)
  1306. int i,j,u,v;
  1307.     double p,t,s,q;
  1308. // 未知数个数
  1309.     int n = m_mtxCoef.GetNumColumns();
  1310. // 初始化解向量
  1311. mtxResult.Init(n, 1);
  1312. double* x = mtxResult.GetData();
  1313. // 系数与常数
  1314. double* pDataCoef = m_mtxCoef.GetData();
  1315. double* pDataConst = m_mtxConst.GetData();
  1316.     
  1317. // 求解
  1318. for (i=0; i<=n-1; i++)
  1319.     { 
  1320. u=i*n+i; 
  1321. p=0.0; 
  1322. x[i]=0.0;
  1323.         for (j=0; j<=n-1; j++)
  1324.         {
  1325. if (i!=j)
  1326.             { 
  1327. v=i*n+j; 
  1328. p=p+fabs(pDataCoef[v]);
  1329. }
  1330. }
  1331.         if (p>=fabs(pDataCoef[u]))
  1332. return FALSE;
  1333.     }
  1334. // 精度控制
  1335.     p=eps+1.0;
  1336.     while (p>=eps)
  1337.     { 
  1338. p=0.0;
  1339.         for (i=0; i<=n-1; i++)
  1340.         { 
  1341. t=x[i]; 
  1342. s=0.0;
  1343.             for (j=0; j<=n-1; j++)
  1344. if (j!=i) 
  1345. s=s+pDataCoef[i*n+j]*x[j];
  1346.             x[i]=(pDataConst[i]-s)/pDataCoef[i*n+i];
  1347.             q=fabs(x[i]-t)/(1.0+fabs(x[i]));
  1348.             if (q>p) 
  1349. p=q;
  1350.         }
  1351.     }
  1352.     
  1353. return TRUE;
  1354. }
  1355. //////////////////////////////////////////////////////////////////////
  1356. // 求解对称正定方程组的共轭梯度法
  1357. //
  1358. // 参数:
  1359. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1360. // 2. double eps - 控制精度,默认值为0.000001
  1361. //
  1362. // 返回值:BOOL 型,方程组求解是否成功
  1363. //////////////////////////////////////////////////////////////////////
  1364. void CLEquations::GetRootsetGrad(CMatrix& mtxResult, double eps /*= 0.000001*/)
  1365. int i,k;
  1366.     double *p,*r,*s,*q,alpha,beta,d,e;
  1367. // 未知数个数
  1368.     int n = GetNumUnknowns();
  1369. // 初始化解向量
  1370. mtxResult.Init(n, 1);
  1371. double* x = mtxResult.GetData();
  1372. // 构造临时矩阵
  1373. CMatrix mtxP(n, 1);
  1374.     p = mtxP.GetData();
  1375. double* pDataCoef = m_mtxCoef.GetData();
  1376. double* pDataConst = m_mtxConst.GetData();
  1377.     r = new double[n];
  1378.     for (i=0; i<=n-1; i++)
  1379.     { 
  1380. x[i]=0.0; 
  1381. p[i]=pDataConst[i]; 
  1382. r[i]=pDataConst[i]; 
  1383. }
  1384.     
  1385. i=0;
  1386.     while (i<=n-1)
  1387.     { 
  1388. CMatrix mtxS = m_mtxCoef * mtxP;
  1389.     s = mtxS.GetData();
  1390.         
  1391. d=0.0; 
  1392. e=0.0;
  1393.         for (k=0; k<=n-1; k++)
  1394.         { 
  1395. d=d+p[k]*pDataConst[k]; 
  1396. e=e+p[k]*s[k]; 
  1397. }
  1398.         
  1399. alpha=d/e;
  1400.         for (k=0; k<=n-1; k++)
  1401. x[k]=x[k]+alpha*p[k];
  1402.         
  1403. CMatrix mtxQ = m_mtxCoef * mtxResult;
  1404.     q = mtxQ.GetData();
  1405.         
  1406. d=0.0;
  1407.         for (k=0; k<=n-1; k++)
  1408.         { 
  1409. r[k]=pDataConst[k]-q[k]; 
  1410. d=d+r[k]*s[k]; 
  1411. }
  1412.         
  1413. beta=d/e; d=0.0;
  1414.         for (k=0; k<=n-1; k++) 
  1415. d=d+r[k]*r[k];
  1416.         
  1417. // 满足精度,求解结束
  1418. d=sqrt(d);
  1419.         if (d<eps)
  1420. break;
  1421.         for (k=0; k<=n-1; k++)
  1422. p[k]=r[k]-beta*p[k];
  1423.         
  1424. i=i+1;
  1425.     }
  1426. delete[] r;
  1427. }
  1428. //////////////////////////////////////////////////////////////////////
  1429. // 求解线性最小二乘问题的豪斯荷尔德变换法
  1430. //
  1431. // 参数:
  1432. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1433. // 2. CMatrix& mtxQ - CMatrix引用对象,返回豪斯荷尔德变换的Q矩阵
  1434. // 3. CMatrix& mtxR - CMatrix引用对象,返回豪斯荷尔德变换的R矩阵
  1435. //
  1436. // 返回值:BOOL 型,方程组求解是否成功
  1437. //////////////////////////////////////////////////////////////////////
  1438. BOOL CLEquations::GetRootsetMqr(CMatrix& mtxResult, CMatrix& mtxQ, CMatrix& mtxR)
  1439. int i,j;
  1440.     double d;
  1441. // 方程组的方程数和未知数个数
  1442.     int m = m_mtxCoef.GetNumRows();
  1443.     int n = m_mtxCoef.GetNumColumns();
  1444. // 奇异方程组
  1445. if (m < n)
  1446. return FALSE;
  1447. // 将解向量初始化为常数向量
  1448. mtxResult = m_mtxConst;
  1449. double* pDataConst = mtxResult.GetData();
  1450. // 构造临时矩阵,用于QR分解
  1451. mtxR = m_mtxCoef;
  1452. double* pDataCoef = mtxR.GetData();
  1453. // QR分解
  1454.     if (! mtxR.SplitQR(mtxQ))
  1455. return FALSE;
  1456. // 临时缓冲区
  1457. double* c = new double[n];
  1458. double* q = mtxQ.GetData();
  1459. // 求解
  1460.     for (i=0; i<=n-1; i++)
  1461.     { 
  1462. d=0.0;
  1463.         for (j=0; j<=m-1; j++)
  1464. d=d+q[j*m+i]*pDataConst[j];
  1465.     
  1466. c[i]=d;
  1467.     }
  1468.     
  1469. pDataConst[n-1]=c[n-1]/pDataCoef[n*n-1];
  1470.     for (i=n-2; i>=0; i--)
  1471.     { 
  1472. d=0.0;
  1473.         for (j=i+1; j<=n-1; j++)
  1474. d=d+pDataCoef[i*n+j]*pDataConst[j];
  1475.         
  1476. pDataConst[i]=(c[i]-d)/pDataCoef[i*n+i];
  1477.     }
  1478.     
  1479. // 释放内存
  1480. delete[] c;
  1481. return TRUE;
  1482. }
  1483. //////////////////////////////////////////////////////////////////////
  1484. // 求解线性最小二乘问题的广义逆法
  1485. //
  1486. // 参数:
  1487. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1488. // 2. CMatrix& mtxAP - CMatrix引用对象,返回系数矩阵的广义逆矩阵
  1489. // 3. CMatrix& mtxU - CMatrix引用对象,返回U矩阵
  1490. // 4. CMatrix& mtxV - CMatrix引用对象,返回V矩阵
  1491. // 5. double eps - 控制精度,默认值为0.000001
  1492. //
  1493. // 返回值:BOOL 型,方程组求解是否成功
  1494. //////////////////////////////////////////////////////////////////////
  1495. BOOL CLEquations::GetRootsetGinv(CMatrix& mtxResult, CMatrix& mtxAP, CMatrix& mtxU, CMatrix& mtxV, double eps /*= 0.000001*/)
  1496. int i,j;
  1497.     
  1498. // 方程个数和未知数个数
  1499.     int m = m_mtxCoef.GetNumRows();
  1500.     int n = m_mtxCoef.GetNumColumns();
  1501. // 初始化解向量
  1502. mtxResult.Init(n, 1);
  1503. double* pDataConst = m_mtxConst.GetData();
  1504. double* x = mtxResult.GetData();
  1505. // 临时矩阵
  1506. CMatrix mtxA = m_mtxCoef;
  1507. // 求广义逆矩阵
  1508.     if (! mtxA.GInvertUV(mtxAP, mtxU, mtxV, eps))
  1509. return FALSE;
  1510. double* pAPData = mtxAP.GetData();
  1511. // 求解
  1512.     for (i=0; i<=n-1; i++)
  1513.     { 
  1514. x[i]=0.0;
  1515.         for (j=0; j<=m-1; j++)
  1516. x[i]=x[i]+pAPData[i*m+j]*pDataConst[j];
  1517.     }
  1518.     
  1519. return TRUE;
  1520. }
  1521. //////////////////////////////////////////////////////////////////////
  1522. // 病态方程组的求解
  1523. //
  1524. // 参数:
  1525. // 1. CMatrix& mtxResult - CMatrix引用对象,返回方程组解矩阵
  1526. // 2. int nMaxIt - 叠加次数,默认值为60
  1527. // 3. double eps - 控制精度,默认值为0.000001
  1528. //
  1529. // 返回值:BOOL 型,方程组求解是否成功
  1530. //////////////////////////////////////////////////////////////////////
  1531. BOOL CLEquations::GetRootsetMorbid(CMatrix& mtxResult, int nMaxIt /*= 60*/, double eps /*= 0.000001*/)
  1532. int i, k;
  1533.     double q, qq;
  1534.     
  1535. // 方程的阶数
  1536.     int n = GetNumUnknowns();
  1537. // 设定迭代次数, 缺省为60
  1538. i = nMaxIt;
  1539.     
  1540. // 用全选主元高斯消元法求解
  1541. CLEquations leqs(m_mtxCoef, m_mtxConst);
  1542. if (! leqs.GetRootsetGauss(mtxResult))
  1543. return FALSE;
  1544. double* x = mtxResult.GetData();
  1545.     
  1546. q=1.0+eps;
  1547.     while (q>=eps)
  1548.     { 
  1549. // 迭代次数已达最大值,仍为求得结果,求解失败
  1550. if (i==0)
  1551. return FALSE;
  1552.         
  1553. // 迭代次数减1
  1554. i=i-1;
  1555. // 矩阵运算
  1556. CMatrix mtxE = m_mtxCoef*mtxResult;
  1557. CMatrix mtxR = m_mtxConst - mtxE;
  1558. // 用全选主元高斯消元法求解
  1559. CLEquations leqs(m_mtxCoef, mtxR);
  1560. CMatrix mtxRR;
  1561. if (! leqs.GetRootsetGauss(mtxRR))
  1562. return FALSE;
  1563. double* r = mtxRR.GetData();
  1564.         
  1565. q=0.0;
  1566.         for ( k=0; k<=n-1; k++)
  1567.         { 
  1568. qq=fabs(r[k])/(1.0+fabs(x[k]+r[k]));
  1569.             if (qq>q) 
  1570. q=qq;
  1571.         }
  1572.         
  1573. for ( k=0; k<=n-1; k++) 
  1574. x[k]=x[k]+r[k];
  1575.     }
  1576.     
  1577. // 求解成功
  1578. return TRUE;
  1579. }