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

数学计算

开发平台:

Visual C++

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