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