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

数学计算

开发平台:

Visual C++

  1. // MatrixCalculatorDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MatrixCalculator.h"
  5. #include "MatrixCalculatorDlg.h"
  6. #include "Matrix.h"
  7. #include "Complex.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CAboutDlg dialog used for App About
  15. class CAboutDlg : public CDialog
  16. {
  17. public:
  18. CAboutDlg();
  19. // Dialog Data
  20. //{{AFX_DATA(CAboutDlg)
  21. enum { IDD = IDD_ABOUTBOX };
  22. //}}AFX_DATA
  23. // ClassWizard generated virtual function overrides
  24. //{{AFX_VIRTUAL(CAboutDlg)
  25. protected:
  26. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  27. //}}AFX_VIRTUAL
  28. // Implementation
  29. protected:
  30. //{{AFX_MSG(CAboutDlg)
  31. //}}AFX_MSG
  32. DECLARE_MESSAGE_MAP()
  33. };
  34. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  35. {
  36. //{{AFX_DATA_INIT(CAboutDlg)
  37. //}}AFX_DATA_INIT
  38. }
  39. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41. CDialog::DoDataExchange(pDX);
  42. //{{AFX_DATA_MAP(CAboutDlg)
  43. //}}AFX_DATA_MAP
  44. }
  45. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  46. //{{AFX_MSG_MAP(CAboutDlg)
  47. // No message handlers
  48. //}}AFX_MSG_MAP
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CMatrixCalculatorDlg dialog
  52. CMatrixCalculatorDlg::CMatrixCalculatorDlg(CWnd* pParent /*=NULL*/)
  53. : CDialog(CMatrixCalculatorDlg::IDD, pParent)
  54. {
  55. //{{AFX_DATA_INIT(CMatrixCalculatorDlg)
  56. m_strMatrix1 = _T("");
  57. m_strMatrix2 = _T("");
  58. //}}AFX_DATA_INIT
  59. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  60. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  61. }
  62. void CMatrixCalculatorDlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CMatrixCalculatorDlg)
  66. DDX_Text(pDX, IDC_EDIT1, m_strMatrix1);
  67. DDX_Text(pDX, IDC_EDIT2, m_strMatrix2);
  68. //}}AFX_DATA_MAP
  69. }
  70. BEGIN_MESSAGE_MAP(CMatrixCalculatorDlg, CDialog)
  71. //{{AFX_MSG_MAP(CMatrixCalculatorDlg)
  72. ON_WM_SYSCOMMAND()
  73. ON_WM_PAINT()
  74. ON_WM_QUERYDRAGICON()
  75. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  76. ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
  77. ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
  78. ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
  79. ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
  80. ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
  81. ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
  82. ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
  83. ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
  84. ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
  85. ON_BN_CLICKED(IDC_BUTTON11, OnButton11)
  86. ON_BN_CLICKED(IDC_BUTTON12, OnButton12)
  87. ON_BN_CLICKED(IDC_BUTTON13, OnButton13)
  88. ON_BN_CLICKED(IDC_BUTTON14, OnButton14)
  89. ON_BN_CLICKED(IDC_BUTTON15, OnButton15)
  90. ON_BN_CLICKED(IDC_BUTTON16, OnButton16)
  91. ON_BN_CLICKED(IDC_BUTTON17, OnButton17)
  92. ON_BN_CLICKED(IDC_BUTTON18, OnButton18)
  93. ON_BN_CLICKED(IDC_BUTTON19, OnButton19)
  94. ON_BN_CLICKED(IDC_BUTTON20, OnButton20)
  95. ON_BN_CLICKED(IDC_BUTTON21, OnButton21)
  96. //}}AFX_MSG_MAP
  97. END_MESSAGE_MAP()
  98. /////////////////////////////////////////////////////////////////////////////
  99. // CMatrixCalculatorDlg message handlers
  100. BOOL CMatrixCalculatorDlg::OnInitDialog()
  101. {
  102. CDialog::OnInitDialog();
  103. // Add "About..." menu item to system menu.
  104. // IDM_ABOUTBOX must be in the system command range.
  105. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  106. ASSERT(IDM_ABOUTBOX < 0xF000);
  107. CMenu* pSysMenu = GetSystemMenu(FALSE);
  108. if (pSysMenu != NULL)
  109. {
  110. CString strAboutMenu;
  111. strAboutMenu.LoadString(IDS_ABOUTBOX);
  112. if (!strAboutMenu.IsEmpty())
  113. {
  114. pSysMenu->AppendMenu(MF_SEPARATOR);
  115. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  116. }
  117. }
  118. // Set the icon for this dialog.  The framework does this automatically
  119. //  when the application's main window is not a dialog
  120. SetIcon(m_hIcon, TRUE); // Set big icon
  121. SetIcon(m_hIcon, FALSE); // Set small icon
  122. // TODO: Add extra initialization here
  123. return TRUE;  // return TRUE  unless you set the focus to a control
  124. }
  125. void CMatrixCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
  126. {
  127. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  128. {
  129. CAboutDlg dlgAbout;
  130. dlgAbout.DoModal();
  131. }
  132. else
  133. {
  134. CDialog::OnSysCommand(nID, lParam);
  135. }
  136. }
  137. // If you add a minimize button to your dialog, you will need the code below
  138. //  to draw the icon.  For MFC applications using the document/view model,
  139. //  this is automatically done for you by the framework.
  140. void CMatrixCalculatorDlg::OnPaint() 
  141. {
  142. if (IsIconic())
  143. {
  144. CPaintDC dc(this); // device context for painting
  145. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  146. // Center icon in client rectangle
  147. int cxIcon = GetSystemMetrics(SM_CXICON);
  148. int cyIcon = GetSystemMetrics(SM_CYICON);
  149. CRect rect;
  150. GetClientRect(&rect);
  151. int x = (rect.Width() - cxIcon + 1) / 2;
  152. int y = (rect.Height() - cyIcon + 1) / 2;
  153. // Draw the icon
  154. dc.DrawIcon(x, y, m_hIcon);
  155. }
  156. else
  157. {
  158. CDialog::OnPaint();
  159. }
  160. }
  161. // The system calls this to obtain the cursor to display while the user drags
  162. //  the minimized window.
  163. HCURSOR CMatrixCalculatorDlg::OnQueryDragIcon()
  164. {
  165. return (HCURSOR) m_hIcon;
  166. }
  167. // 加法
  168. void CMatrixCalculatorDlg::OnButton1() 
  169. {
  170. // 构造矩阵
  171. CMatrix mtxA, mtxB, mtxC;
  172. // 获取数据
  173. UpdateData();
  174. mtxA.FromString(m_strMatrix1);
  175. mtxB.FromString(m_strMatrix2);
  176. // 矩阵加法
  177. mtxC = mtxA + mtxB;
  178. // 显示数据
  179. m_strMatrix3 = mtxC.ToString(" ");
  180. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  181. }
  182. // 减法
  183. void CMatrixCalculatorDlg::OnButton2() 
  184. {
  185. // 构造矩阵
  186. CMatrix mtxA, mtxB, mtxC;
  187. // 获取数据
  188. UpdateData();
  189. mtxA.FromString(m_strMatrix1);
  190. mtxB.FromString(m_strMatrix2);
  191. // 矩阵减法
  192. mtxC = mtxA - mtxB;
  193. // 显示数据
  194. m_strMatrix3 = mtxC.ToString(" ");
  195. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  196. }
  197. // 转置
  198. void CMatrixCalculatorDlg::OnButton3() 
  199. {
  200. // 构造矩阵
  201. CMatrix mtxA, mtxC;
  202. // 获取数据
  203. UpdateData();
  204. mtxA.FromString(m_strMatrix1);
  205. // 矩阵转置
  206. mtxC = mtxA.Transpose();
  207. // 显示数据
  208. m_strMatrix3 = mtxC.ToString(" ");
  209. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  210. }
  211. /*
  212.  1  3 -2  0  4
  213. -2 -1  5 -7  2
  214.  0  8  4  1 -5
  215.  3 -3  2 -4  1
  216. 4  5 -1
  217. 2 -2  6
  218. 7  8  1
  219. 0  3 -5
  220. 9  8 -6
  221. */
  222. // 乘法
  223. void CMatrixCalculatorDlg::OnButton4() 
  224. {
  225. // 构造矩阵
  226. CMatrix mtxA, mtxB, mtxC;
  227. // 获取数据
  228. UpdateData();
  229. mtxA.FromString(m_strMatrix1);
  230. mtxB.FromString(m_strMatrix2);
  231. // 矩阵乘法
  232. mtxC = mtxA * mtxB;
  233. // 显示数据
  234. m_strMatrix3 = mtxC.ToString(" ");
  235. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  236. }
  237. /*
  238. 0.2368,0.2471,0.2568,1.2671
  239. 1.1161,0.1254,0.1397,0.1490
  240. 0.1582,1.1675,0.1768,0.1871
  241. 0.1968,0.2071,1.2168,0.2271
  242. */
  243. // 实矩阵求逆的全选主元高斯-约当法
  244. void CMatrixCalculatorDlg::OnButton5() 
  245. {
  246. // 构造矩阵
  247. CMatrix mtxA;
  248. // 获取数据
  249. UpdateData();
  250. mtxA.FromString(m_strMatrix1, ",");
  251. // 实矩阵求逆的全选主元高斯-约当法
  252. if (mtxA.InvertGaussJordan())
  253. m_strMatrix3 = mtxA.ToString(" ");
  254. else
  255. m_strMatrix3 = "求解失败";
  256. // 显示数据
  257. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  258. }
  259. /*
  260. 0.2368,0.2471,0.2568,1.2671
  261. 1.1161,0.1254,0.1397,0.1490
  262. 0.1582,1.1675,0.1768,0.1871
  263. 0.1968,0.2071,1.2168,0.2271
  264. 0.1345,0.1678,0.1875,1.1161
  265. 1.2671,0.2017,0.7024,0.2721
  266. -0.2836,-1.1967,0.3558,-0.2078
  267. 0.3576,-1.2345,2.1185,0.4773
  268. */
  269. // 复矩阵求逆的全选主元高斯-约当法
  270. void CMatrixCalculatorDlg::OnButton6() 
  271. {
  272. // 构造矩阵
  273. CMatrix mtxA, mtxB;
  274. // 获取数据
  275. UpdateData();
  276. mtxA.FromString(m_strMatrix1, ",");
  277. mtxB.FromString(m_strMatrix2, ",");
  278. // 复矩阵求逆的全选主元高斯-约当法
  279. if (mtxA.InvertGaussJordan(mtxB))
  280. {
  281. m_strMatrix3  = "实部矩阵的逆矩阵为:n" + mtxA.ToString(" ");
  282. m_strMatrix3 += "nn虚部矩阵的逆矩阵为:n"+mtxB.ToString(" ");
  283. }
  284. else
  285. m_strMatrix3 = "求解失败";
  286. // 显示数据
  287. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  288. }
  289. /*
  290. 5.0,7.0,6.0,5.0
  291. 7.0,10.0,8.0,7.0
  292. 6.0,8.0,10.0,9.0
  293. 5.0,7.0,9.0,10.0
  294. */
  295. // 对称正定矩阵的求逆
  296. void CMatrixCalculatorDlg::OnButton7() 
  297. {
  298. // 构造矩阵
  299. CMatrix mtxA;
  300. // 获取数据
  301. UpdateData();
  302. mtxA.FromString(m_strMatrix1, ",");
  303. // 对称正定矩阵的求逆
  304. if (mtxA.InvertSsgj())
  305. m_strMatrix3 = mtxA.ToString(" ");
  306. else
  307. m_strMatrix3 = "求解失败";
  308. // 显示数据
  309. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  310. }
  311. /*
  312. 10, 5, 4, 3, 2, 1
  313. -1,10, 5, 4, 3, 2
  314. -2,-1,10, 5, 4, 3
  315. -3,-2,-1,10, 5, 4
  316. -4,-3,-2,-1,10, 5
  317. -5,-4,-3,-2,-1,10
  318. */
  319. // 托伯利兹矩阵求逆的埃兰特方法
  320. void CMatrixCalculatorDlg::OnButton8() 
  321. {
  322. // 构造矩阵
  323. CMatrix mtxA;
  324. // 获取数据
  325. UpdateData();
  326. mtxA.FromString(m_strMatrix1, ",");
  327. // 托伯利兹矩阵求逆的埃兰特方法
  328. if (mtxA.InvertTrench())
  329. m_strMatrix3 = mtxA.ToString(" ");
  330. else
  331. m_strMatrix3 = "求解失败";
  332. // 显示数据
  333. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  334. }
  335. /*
  336. 1.0,2.0,3.0,4.0
  337. 5.0,6.0,7.0,8.0
  338. 9.0,10.0,11.0,12.0
  339. 13.0,14.0,15.0,16.0
  340. 3.0,-3.0,-2.0,4.0
  341. 5.0,-5.0,1.0,8.0
  342. 11.0,8.0,5.0,-7.0
  343. 5.0,-1.0,-3.0,-1.0
  344. */
  345. // 求行列式值的全选主元高斯消去法
  346. void CMatrixCalculatorDlg::OnButton9() 
  347. {
  348. // 构造矩阵
  349. CMatrix mtxA;
  350. // 获取数据
  351. UpdateData();
  352. mtxA.FromString(m_strMatrix1, ",");
  353. // 求行列式值的全选主元高斯消去法
  354. double dblValue = mtxA.DetGauss();
  355. m_strMatrix3.Format("%f", dblValue);
  356. // 显示数据
  357. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  358. }
  359. /*
  360. 1.0,2.0,3.0,4.0
  361. 5.0,6.0,7.0,8.0
  362. 9.0,10.0,11.0,12.0
  363. 13.0,14.0,15.0,16.0
  364. 17.0,18.0,19.0,20.0
  365. */
  366. // 求矩阵秩的全选主元高斯消去法
  367. void CMatrixCalculatorDlg::OnButton10() 
  368. {
  369. // 构造矩阵
  370. CMatrix mtxA;
  371. // 获取数据
  372. UpdateData();
  373. mtxA.FromString(m_strMatrix1, ",");
  374. // 求矩阵秩的全选主元高斯消去法
  375. int nValue = mtxA.RankGauss();
  376. m_strMatrix3.Format("%d", nValue);
  377. // 显示数据
  378. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  379. }
  380. /*
  381. 5.0,7.0,6.0,5.0
  382. 7.0,10.0,8.0,7.0
  383. 6.0,8.0,10.0,9.0
  384. 5.0,7.0,9.0,10.0
  385. */
  386. // 对称正定矩阵的乔里斯基分解与行列式的求值
  387. void CMatrixCalculatorDlg::OnButton11() 
  388. {
  389. // 构造矩阵
  390. CMatrix mtxA;
  391. // 获取数据
  392. UpdateData();
  393. mtxA.FromString(m_strMatrix1, ",");
  394. // 对称正定矩阵的乔里斯基分解与行列式的求值
  395. double dblValue;
  396. if (mtxA.DetCholesky(&dblValue))
  397. {
  398. m_strMatrix3.Format("行列式值 = %frnrn分解后的下三角矩阵为rn", dblValue);
  399. m_strMatrix3 += mtxA.ToString(" ");
  400. }
  401. else
  402. m_strMatrix3 = "求解失败";
  403. // 显示数据
  404. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  405. }
  406. /*
  407. 2.0,4.0,4.0,2.0
  408. 3.0,3.0,12.0,6.0
  409. 2.0,4.0,-1.0,2.0
  410. 4.0,2.0,1.0,1.0
  411. */
  412. // 矩阵的三角分解
  413. void CMatrixCalculatorDlg::OnButton12() 
  414. {
  415. // 构造矩阵
  416. CMatrix mtxA, mtxL, mtxU;
  417. // 获取数据
  418. UpdateData();
  419. mtxA.FromString(m_strMatrix1, ",");
  420. // 矩阵的三角分解
  421. if (mtxA.SplitLU(mtxL, mtxU))
  422. {
  423. m_strMatrix3.Format("分解后的L矩阵为rn%srnrn分解后的U矩阵为rn%s", 
  424. mtxL.ToString(), mtxU.ToString());
  425. }
  426. else
  427. m_strMatrix3 = "求解失败";
  428. // 显示数据
  429. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  430. }
  431. /*
  432. 1.0,1.0,-1.0
  433. 2.0,1.0,0.0
  434. 1.0,-1.0,0.0
  435. -1.0,2.0,1.0
  436. */
  437. // 一般实矩阵的QR分解
  438. void CMatrixCalculatorDlg::OnButton13() 
  439. {
  440. // 构造矩阵
  441. CMatrix mtxA, mtxQ;
  442. // 获取数据
  443. UpdateData();
  444. mtxA.FromString(m_strMatrix1, ",");
  445. // 一般实矩阵的QR分解
  446. if (mtxA.SplitQR(mtxQ))
  447. {
  448. m_strMatrix3.Format("分解后的Q矩阵为rn%srnrn分解后的R矩阵为rn%s", 
  449. mtxQ.ToString(), mtxA.ToString());
  450. }
  451. else
  452. m_strMatrix3 = "求解失败";
  453. // 显示数据
  454. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  455. }
  456. /*
  457. 1.0,1.0,-1.0
  458. 2.0,1.0,0.0
  459. 1.0,-1.0,0.0
  460. -1.0,2.0,1.0
  461. 1.0,1.0,-1.0,-1.0
  462. 2.0,1.0,0.0,2.0
  463. 1.0,-1.0,0.0,1.0
  464. */
  465. // 一般实矩阵的奇异值分解
  466. void CMatrixCalculatorDlg::OnButton14() 
  467. {
  468. // 构造矩阵
  469. CMatrix mtxA, mtxU, mtxV;
  470. // 获取数据
  471. UpdateData();
  472. mtxA.FromString(m_strMatrix1, ",");
  473. // 一般实矩阵的奇异值分解
  474. if (mtxA.SplitUV(mtxU, mtxV))
  475. {
  476. m_strMatrix3 = "分解后的U矩阵为n" + mtxU.ToString();
  477. m_strMatrix3 += "nn分解后的V矩阵为n" + mtxV.ToString();
  478. m_strMatrix3 += "nn分解后的A矩阵为n" + mtxA.ToString();
  479. }
  480. else
  481. m_strMatrix3 = "求解失败";
  482. // 显示数据
  483. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  484. }
  485. /*
  486. 1.0,2.0,3.0,4.0
  487. 6.0,7.0,8.0,9.0
  488. 1.0,2.0,13.0,0.0
  489. 16.0,17.0,8.0,9.0
  490. 2.0,4.0,3.0,4.0
  491. */
  492. // 求广义逆的奇异值分解法
  493. void CMatrixCalculatorDlg::OnButton15() 
  494. {
  495. // 构造矩阵
  496. CMatrix mtxA, mtxU, mtxV, mtxAP;
  497. // 获取数据
  498. UpdateData();
  499. mtxA.FromString(m_strMatrix1, ",");
  500. // 求广义逆的奇异值分解法
  501. if (mtxA.GInvertUV(mtxAP, mtxU, mtxV))
  502. {
  503. m_strMatrix3 = mtxAP.ToString();
  504. }
  505. else
  506. m_strMatrix3 = "求解失败";
  507. // 显示数据
  508. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  509. }
  510. /*
  511. 10.0,1.0,2.0,3.0,4.0
  512. 1.0,9.0,-1.0,2.0,-3.0
  513. 2.0,-1.0,7.0,3.0,-5.0
  514. 3.0,2.0,3.0,12.0,-1.0
  515. 4.0,-3.0,-5.0,-1.0,15.0
  516. */
  517. // 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法
  518. void CMatrixCalculatorDlg::OnButton16() 
  519. {
  520. // 构造矩阵
  521. CMatrix mtxA, mtxQ, mtxT;
  522. // 获取数据
  523. UpdateData();
  524. mtxA.FromString(m_strMatrix1, ",");
  525. // 分配内存
  526. double *dblB = NULL, *dblC = NULL;
  527. dblB = new double[mtxA.GetNumColumns()];
  528. dblC = new double[mtxA.GetNumColumns()];
  529. // 约化对称矩阵为对称三对角阵的豪斯荷尔德变换法
  530. if (mtxA.MakeSymTri(mtxQ, mtxT, dblB, dblC))
  531. {
  532. m_strMatrix3.Format("乘积矩阵Q为rn%srnrn三对角阵为rn%s", 
  533. mtxQ.ToString(), mtxT.ToString());
  534. }
  535. else
  536. m_strMatrix3 = "求解失败";
  537. // 清理内存
  538. delete[] dblB;
  539. delete[] dblC;
  540. // 显示数据
  541. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  542. }
  543. /*
  544. 10.0,1.0,2.0,3.0,4.0
  545. 1.0,9.0,-1.0,2.0,-3.0
  546. 2.0,-1.0,7.0,3.0,-5.0
  547. 3.0,2.0,3.0,12.0,-1.0
  548. 4.0,-3.0,-5.0,-1.0,15.0
  549. */
  550. // 实对称三对角阵的全部特征值与特征向量的计算
  551. void CMatrixCalculatorDlg::OnButton17() 
  552. {
  553. // 构造矩阵
  554. CMatrix mtxA, mtxQ, mtxT;
  555. // 获取数据
  556. UpdateData();
  557. mtxA.FromString(m_strMatrix1, ",");
  558. // 分配内存
  559. double *dblB = NULL, *dblC = NULL;
  560. dblB = new double[mtxA.GetNumColumns()];
  561. dblC = new double[mtxA.GetNumColumns()];
  562. // 实对称三对角阵的全部特征值与特征向量的计算
  563. if (mtxA.MakeSymTri(mtxQ, mtxT, dblB, dblC))
  564. {
  565. if (mtxA.SymTriEigenv(dblB, dblC, mtxQ))
  566. {
  567. int n = mtxQ.GetNumColumns();
  568. m_strMatrix3.Format("特征值为rn");
  569. CString s;
  570. for (int i=0; i<n; ++i)
  571. {
  572. s.Format("%d: %frn", i+1, dblB[i]);
  573. m_strMatrix3 += s;
  574. }
  575. m_strMatrix3 += "rn对应的特征向量为rn";
  576. for (i=0; i<n; ++i)
  577. {
  578. s.Format("%d: %srn", i+1, mtxQ.ColToString(i));
  579. m_strMatrix3 += s;
  580. }
  581. }
  582. else
  583. m_strMatrix3 = "求解失败";
  584. }
  585. else
  586. m_strMatrix3 = "求解失败";
  587. // 清理内存
  588. delete[] dblB;
  589. delete[] dblC;
  590. // 显示数据
  591. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  592. }
  593. /*
  594. 1.0,6.0,-3.0,-1.0,7.0
  595. 8.0,-15.0,18.0,5.0,4.0
  596. -2.0,11.0,9.0,15.0,20.0
  597. -13.0,2.0,21.0,30.0,-6.0
  598. 17.0,22.0,-5.0,3.0,6.0
  599. */
  600. // 约化一般实矩阵为赫申伯格矩阵的初等相似变换法
  601. void CMatrixCalculatorDlg::OnButton18() 
  602. {
  603. // 构造矩阵
  604. CMatrix mtxA;
  605. // 获取数据
  606. UpdateData();
  607. mtxA.FromString(m_strMatrix1, ",");
  608. // 约化一般实矩阵为赫申伯格矩阵的初等相似变换法
  609. mtxA.MakeHberg();
  610. m_strMatrix3 = mtxA.ToString();
  611. // 显示数据
  612. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  613. }
  614. /*
  615. 1.0,6.0,-3.0,-1.0,7.0
  616. 8.0,-15.0,18.0,5.0,4.0
  617. -2.0,11.0,9.0,15.0,20.0
  618. -13.0,2.0,21.0,30.0,-6.0
  619. 17.0,22.0,-5.0,3.0,6.0
  620. */
  621. // 求赫申伯格矩阵全部特征值的QR方法
  622. void CMatrixCalculatorDlg::OnButton19() 
  623. {
  624. // 构造矩阵
  625. CMatrix mtxA, mtxQ, mtxT;
  626. // 获取数据
  627. UpdateData();
  628. mtxA.FromString(m_strMatrix1, ",");
  629. // 建立赫申伯格矩阵
  630. mtxA.MakeHberg();
  631. m_strMatrix3.Format("约化得到的赫申伯格矩阵为rn%s", mtxA.ToString());
  632. // 分配内存
  633. double *dblU = NULL, *dblV = NULL;
  634. dblU = new double[mtxA.GetNumColumns()];
  635. dblV = new double[mtxA.GetNumColumns()];
  636. // 求赫申伯格矩阵全部特征值的QR方法
  637. if (mtxA.HBergEigenv(dblU, dblV))
  638. {
  639. m_strMatrix3 += "rnrn特征值为rn";
  640. for (int i=0; i<mtxA.GetNumColumns(); ++i)
  641. {
  642. CComplex x(dblU[i], dblV[i]);
  643. m_strMatrix3 += x.ToString() + "rn";
  644. }
  645. }
  646. else
  647. m_strMatrix3 = "求解失败";
  648. // 清理内存
  649. delete[] dblU;
  650. delete[] dblV;
  651. // 显示数据
  652. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  653. }
  654. /*
  655. 2.0,-1.0,0.0
  656. -1.0,2.0,-1.0
  657. 0.0,-1.0,2.0
  658. */
  659. // 求实对称矩阵特征值与特征向量的雅可比法
  660. void CMatrixCalculatorDlg::OnButton20() 
  661. {
  662. // 构造矩阵
  663. CMatrix mtxA, mtxV;
  664. // 获取数据
  665. UpdateData();
  666. mtxA.FromString(m_strMatrix1, ",");
  667. // 分配内存
  668. double* dblV = new double[mtxA.GetNumColumns()];
  669. // 求实对称矩阵特征值与特征向量的雅可比法
  670. if (mtxA.JacobiEigenv(dblV, mtxV, 100))
  671. {
  672. m_strMatrix3.Format("特征值为rn");
  673. CString s;
  674. for (int i=0; i<mtxA.GetNumColumns(); ++i)
  675. {
  676. s.Format("%d: %frn", i+1, dblV[i]);
  677. m_strMatrix3 += s;
  678. }
  679. m_strMatrix3 += "rn对应的特征向量为rn";
  680. for (i=0; i<mtxA.GetNumColumns(); ++i)
  681. {
  682. s.Format("%d: %srn", i+1, mtxV.ColToString(i));
  683. m_strMatrix3 += s;
  684. }
  685. }
  686. else
  687. m_strMatrix3 = "求解失败";
  688. // 清理内存
  689. delete[] dblV;
  690. // 显示数据
  691. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  692. }
  693. /*
  694. 10.0,1.0,2.0,3.0,4.0
  695. 1.0,9.0,-1.0,2.0,-3.0
  696. 2.0,-1.0,7.0,3.0,-5.0
  697. 3.0,2.0,3.0,12.0,-1.0
  698. 4.0,-3.0,-5.0,-1.0,15.0
  699. */
  700. // 求实对称矩阵特征值与特征向量的雅可比过关法
  701. void CMatrixCalculatorDlg::OnButton21() 
  702. {
  703. // 构造矩阵
  704. CMatrix mtxA, mtxV;
  705. // 获取数据
  706. UpdateData();
  707. mtxA.FromString(m_strMatrix1, ",");
  708. // 分配内存
  709. double* dblV = new double[mtxA.GetNumColumns()];
  710. // 求实对称矩阵特征值与特征向量的雅可比过关法
  711. if (mtxA.JacobiEigenv2(dblV, mtxV))
  712. {
  713. m_strMatrix3.Format("特征值为rn");
  714. CString s;
  715. for (int i=0; i<mtxA.GetNumColumns(); ++i)
  716. {
  717. s.Format("%d: %frn", i+1, dblV[i]);
  718. m_strMatrix3 += s;
  719. }
  720. m_strMatrix3 += "rn对应的特征向量为rn";
  721. for (i=0; i<mtxA.GetNumColumns(); ++i)
  722. {
  723. s.Format("%d: %srn", i+1, mtxV.ColToString(i));
  724. m_strMatrix3 += s;
  725. }
  726. }
  727. else
  728. m_strMatrix3 = "求解失败";
  729. // 清理内存
  730. delete[] dblV;
  731. // 显示数据
  732. AfxMessageBox(m_strMatrix3, MB_OK|MB_ICONINFORMATION);
  733. }