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

数学计算

开发平台:

Visual C++

  1. // NLequationCalculatorDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "NLequationCalculator.h"
  5. #include "NLequationCalculatorDlg.h"
  6. #include "NLequation.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. //}}AFX_DATA
  22. // ClassWizard generated virtual function overrides
  23. //{{AFX_VIRTUAL(CAboutDlg)
  24. protected:
  25. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. protected:
  29. //{{AFX_MSG(CAboutDlg)
  30. //}}AFX_MSG
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CAboutDlg)
  36. //}}AFX_DATA_INIT
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. //{{AFX_DATA_MAP(CAboutDlg)
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  45. //{{AFX_MSG_MAP(CAboutDlg)
  46. // No message handlers
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CNLequationCalculatorDlg dialog
  51. CNLequationCalculatorDlg::CNLequationCalculatorDlg(CWnd* pParent /*=NULL*/)
  52. : CDialog(CNLequationCalculatorDlg::IDD, pParent)
  53. {
  54. //{{AFX_DATA_INIT(CNLequationCalculatorDlg)
  55. // NOTE: the ClassWizard will add member initialization here
  56. //}}AFX_DATA_INIT
  57. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  58. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  59. }
  60. void CNLequationCalculatorDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62. CDialog::DoDataExchange(pDX);
  63. //{{AFX_DATA_MAP(CNLequationCalculatorDlg)
  64. // NOTE: the ClassWizard will add DDX and DDV calls here
  65. //}}AFX_DATA_MAP
  66. }
  67. BEGIN_MESSAGE_MAP(CNLequationCalculatorDlg, CDialog)
  68. //{{AFX_MSG_MAP(CNLequationCalculatorDlg)
  69. ON_WM_SYSCOMMAND()
  70. ON_WM_PAINT()
  71. ON_WM_QUERYDRAGICON()
  72. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  73. ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
  74. ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
  75. ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
  76. ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
  77. ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
  78. ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
  79. ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
  80. ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
  81. ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
  82. ON_BN_CLICKED(IDC_BUTTON11, OnButton11)
  83. ON_BN_CLICKED(IDC_BUTTON12, OnButton12)
  84. ON_BN_CLICKED(IDC_BUTTON13, OnButton13)
  85. //}}AFX_MSG_MAP
  86. END_MESSAGE_MAP()
  87. /////////////////////////////////////////////////////////////////////////////
  88. // CNLequationCalculatorDlg message handlers
  89. BOOL CNLequationCalculatorDlg::OnInitDialog()
  90. {
  91. CDialog::OnInitDialog();
  92. // Add "About..." menu item to system menu.
  93. // IDM_ABOUTBOX must be in the system command range.
  94. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  95. ASSERT(IDM_ABOUTBOX < 0xF000);
  96. CMenu* pSysMenu = GetSystemMenu(FALSE);
  97. if (pSysMenu != NULL)
  98. {
  99. CString strAboutMenu;
  100. strAboutMenu.LoadString(IDS_ABOUTBOX);
  101. if (!strAboutMenu.IsEmpty())
  102. {
  103. pSysMenu->AppendMenu(MF_SEPARATOR);
  104. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  105. }
  106. }
  107. // Set the icon for this dialog.  The framework does this automatically
  108. //  when the application's main window is not a dialog
  109. SetIcon(m_hIcon, TRUE); // Set big icon
  110. SetIcon(m_hIcon, FALSE); // Set small icon
  111. // TODO: Add extra initialization here
  112. return TRUE;  // return TRUE  unless you set the focus to a control
  113. }
  114. void CNLequationCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
  115. {
  116. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  117. {
  118. CAboutDlg dlgAbout;
  119. dlgAbout.DoModal();
  120. }
  121. else
  122. {
  123. CDialog::OnSysCommand(nID, lParam);
  124. }
  125. }
  126. // If you add a minimize button to your dialog, you will need the code below
  127. //  to draw the icon.  For MFC applications using the document/view model,
  128. //  this is automatically done for you by the framework.
  129. void CNLequationCalculatorDlg::OnPaint() 
  130. {
  131. if (IsIconic())
  132. {
  133. CPaintDC dc(this); // device context for painting
  134. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  135. // Center icon in client rectangle
  136. int cxIcon = GetSystemMetrics(SM_CXICON);
  137. int cyIcon = GetSystemMetrics(SM_CYICON);
  138. CRect rect;
  139. GetClientRect(&rect);
  140. int x = (rect.Width() - cxIcon + 1) / 2;
  141. int y = (rect.Height() - cyIcon + 1) / 2;
  142. // Draw the icon
  143. dc.DrawIcon(x, y, m_hIcon);
  144. }
  145. else
  146. {
  147. CDialog::OnPaint();
  148. }
  149. }
  150. // The system calls this to obtain the cursor to display while the user drags
  151. //  the minimized window.
  152. HCURSOR CNLequationCalculatorDlg::OnQueryDragIcon()
  153. {
  154. return (HCURSOR) m_hIcon;
  155. }
  156. // 求非线性方程实根的对分法
  157. void CNLequationCalculatorDlg::OnButton1() 
  158. {
  159. // 建立CNLequation的子类,在其中重载函数Func
  160. class CNLeq : public CNLequation
  161. {
  162. double Func(double x)
  163. {
  164. double z = (((((x-5.0)*x+3.0)*x+1.0)*x-7.0)*x+7.0)*x-20.0;
  165. return z;
  166. }
  167. };
  168. // 求解
  169. CNLeq nleq;
  170. double x[6];
  171. int n = nleq.GetRootBisect(6, x, -2, 5, 0.2);
  172. // 显示结果
  173. CString sMsg;
  174. sMsg.Format("求得如下 %d 个根:nn", n);
  175. CString ss;
  176.     for (int i=0; i<=n-1; i++)
  177. {
  178. ss.Format("x(%d) = %fn",i,x[i]);
  179. sMsg += ss;
  180. }
  181.     AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  182. }
  183. // 求非线性方程一个实根的牛顿法
  184. void CNLequationCalculatorDlg::OnButton2() 
  185. {
  186. // 建立CNLequation的子类,在其中重载函数Func
  187. class CNLeq : public CNLequation
  188. {
  189. void Func(double x, double y[])
  190. {
  191. y[0]=x*x*(x-1.0)-1.0;
  192. y[1]=3.0*x*x-2.0*x;
  193. }
  194. };
  195. // 求解
  196. CNLeq nleq;
  197. double x = 1.5;
  198. int bRet = nleq.GetRootNewton(&x);
  199. // 显示结果
  200. CString sMsg;
  201. if (bRet)
  202. sMsg.Format("求得的一个实根为:nnx = %fn", x);
  203. else
  204. sMsg = "求解失败";
  205. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  206. }
  207. // 求非线性方程一个实根的埃特金迭代法
  208. void CNLequationCalculatorDlg::OnButton3() 
  209. {
  210. // 建立CNLequation的子类,在其中重载函数Func
  211. class CNLeq : public CNLequation
  212. {
  213. double Func(double x)
  214. {
  215.     double y = 6.0-x*x;
  216. return y;
  217. }
  218. };
  219. // 求解
  220. CNLeq nleq;
  221. double x = 0.0;
  222. int bRet = nleq.GetRootAitken(&x);
  223. // 显示结果
  224. CString sMsg;
  225. if (bRet)
  226. sMsg.Format("求得的一个实根为:nnx = %fn", x);
  227. else
  228. sMsg = "求解失败";
  229. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  230. }
  231. // 求非线性方程一个实根的连分式解法
  232. void CNLequationCalculatorDlg::OnButton4() 
  233. {
  234. // 建立CNLequation的子类,在其中重载函数Func
  235. class CNLeq : public CNLequation
  236. {
  237. double Func(double x)
  238. {
  239.     double y = x*x*(x-1.0)-1.0;
  240. return y;
  241. }
  242. };
  243. // 求解
  244. CNLeq nleq;
  245. double x = 1.0;
  246. int bRet = nleq.GetRootPq(&x);
  247. // 显示结果
  248. CString sMsg;
  249. if (bRet)
  250. sMsg.Format("求得的一个实根为:nnx = %fn", x);
  251. else
  252. sMsg = "求解失败";
  253. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  254. }
  255. // 求实系数代数方程全部根的QR方法
  256. void CNLequationCalculatorDlg::OnButton5() 
  257. {
  258. // 求解
  259. CNLequation nleq;
  260. double xr[6], xi[6];
  261. double a[7] = {-30.0,10.5,-10.5,1.5,4.5,-7.5,1.5};
  262. int n = 6;
  263. int bRet = nleq.GetRootQr(n, a, xr, xi);
  264. // 显示结果
  265. CString sMsg;
  266. if (bRet)
  267. {
  268. sMsg.Format("求得的 %d 个根为:nn", n);
  269. for (int i=0; i<n; ++i)
  270. {
  271. CComplex root;
  272. root.SetReal(xr[i]);
  273. root.SetImag(xi[i]);
  274. CString ss;
  275. ss.Format("x(%d) = %sn", i, root.ToString());
  276. sMsg += ss;
  277. }
  278. }
  279. else
  280. sMsg = "求解失败";
  281. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  282. }
  283. // 求实系数代数方程全部根的牛顿下山法
  284. void CNLequationCalculatorDlg::OnButton6() 
  285. {
  286. // 求解
  287. CNLequation nleq;
  288. double xr[6], xi[6];
  289. double a[7] = {-20.0,7.0,-7.0,1.0,3.0,-5.0,1.0};
  290. int n = 6;
  291. int bRet = nleq.GetRootNewtonDownHill(n, a, xr, xi);
  292. // 显示结果
  293. CString sMsg;
  294. if (bRet)
  295. {
  296. sMsg.Format("求得的 %d 个根为:nn", n);
  297. for (int i=0; i<n; ++i)
  298. {
  299. CComplex root;
  300. root.SetReal(xr[i]);
  301. root.SetImag(xi[i]);
  302. CString ss;
  303. ss.Format("x(%d) = %sn", i, root.ToString());
  304. sMsg += ss;
  305. }
  306. }
  307. else
  308. sMsg = "求解失败";
  309. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  310. }
  311. // 求复系数代数方程全部根的牛顿下山法
  312. void CNLequationCalculatorDlg::OnButton7() 
  313. {
  314. // 求解
  315. CNLequation nleq;
  316. double xr[5], xi[5];
  317.     double ar[6]={0.1,21.33,4.9,0.0,3.0,1.0};
  318.     double ai[6]={-100.0,0.0,-19.0,-0.01,2.0,0.0};
  319. int n = 5;
  320. int bRet = nleq.GetRootNewtonDownHill(n, ar, ai, xr, xi);
  321. // 显示结果
  322. CString sMsg;
  323. if (bRet)
  324. {
  325. sMsg.Format("求得的 %d 个根为:nn", n);
  326. for (int i=0; i<n; ++i)
  327. {
  328. CComplex root;
  329. root.SetReal(xr[i]);
  330. root.SetImag(xi[i]);
  331. CString ss;
  332. ss.Format("x(%d) = %sn", i, root.ToString());
  333. sMsg += ss;
  334. }
  335. }
  336. else
  337. sMsg = "求解失败";
  338. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  339. }
  340. // 求非线性方程一个实根的蒙特卡洛法
  341. void CNLequationCalculatorDlg::OnButton8() 
  342. {
  343. // 建立CNLequation的子类,在其中重载函数Func
  344. class CNLeq : public CNLequation
  345. {
  346. double Func(double x)
  347. {
  348. double z = exp(-x*x*x)-sin(x)/cos(x)+800.0;
  349. return z;
  350. }
  351. };
  352. // 求解
  353. CNLeq nleq;
  354.     double x=0.5; 
  355. double b=1.0; 
  356. int m=10;
  357. nleq.GetRootMonteCarlo(&x, b, m);
  358. // 显示结果
  359. CString sMsg;
  360. sMsg.Format("求得的一个根为:nnx = %f", x);
  361.     AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  362. }
  363. // 求实函数或复函数方程一个复根的蒙特卡洛法
  364. void CNLequationCalculatorDlg::OnButton9() 
  365. {
  366. // 建立CNLequation的子类,在其中重载函数Func
  367. class CNLeq : public CNLequation
  368. {
  369. double Func(double x, double y)
  370. {
  371. double u=x*x-y*y-6.0*x+13.0;
  372. double v=2.0*x*y-6.0*y;
  373. double z=sqrt(u*u+v*v);
  374. return z;
  375. }
  376. };
  377. // 求解
  378. CNLeq nleq;
  379.     double x=0.5; 
  380. double y=0.5; 
  381. double b=1.0; 
  382. int m=10;
  383. nleq.GetRootMonteCarlo(&x, &y, b, m);
  384. // 构造复数
  385. CComplex root(x, y);
  386. // 显示结果
  387. CString sMsg;
  388. sMsg.Format("求得的一个根为:nnx = %s", root.ToString());
  389.     AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  390. }
  391. // 求非线性方程组一组实根的梯度法
  392. void CNLequationCalculatorDlg::OnButton10() 
  393. {
  394. // 建立CNLequation的子类,在其中重载函数Func
  395. class CNLeq : public CNLequation
  396. {
  397. double Func(double x[], double y[])
  398. {
  399. double z,f1,f2,f3,df1,df2,df3;
  400. f1=x[0]-5.0*x[1]*x[1]+7.0*x[2]*x[2]+12.0;
  401. f2=3.0*x[0]*x[1]+x[0]*x[2]-11.0*x[0];
  402. f3=2.0*x[1]*x[2]+40.0*x[0];
  403. z=f1*f1+f2*f2+f3*f3;
  404. df1=1.0; 
  405. df2=3.0*x[1]+x[2]-11.0; 
  406. df3=40.0;
  407. y[0]=2.0*(f1*df1+f2*df2+f3*df3);
  408. df1=10.0*x[1]; 
  409. df2=3.0*x[0]; 
  410. df3=2.0*x[2];
  411. y[1]=2.0*(f1*df1+f2*df2+f3*df3);
  412. df1=14.0*x[2]; 
  413. df2=x[0]; 
  414. df3=2.0*x[1];
  415. y[2]=2.0*(f1*df1+f2*df2+f3*df3);
  416. return(z);
  417. }
  418. };
  419. // 求解
  420. CNLeq nleq;
  421.     double x[3]={1.5,6.5,-5.0};
  422. int n = 3;
  423.     int nMaxIt = 600;
  424. BOOL bRet = nleq.GetRootsetGrad(n, x, nMaxIt);
  425. // 显示结果
  426. CString sMsg;
  427. if (bRet)
  428. {
  429. sMsg.Format("求得的 %d 个根为:nn", n);
  430. for (int i=0; i<n; ++i)
  431. {
  432. CString ss;
  433. ss.Format("x(%d) = %fn", i, x[i]);
  434. sMsg += ss;
  435. }
  436. }
  437. else
  438. sMsg = "求解失败";
  439. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  440. }
  441. // 求非线性方程组一组实根的拟牛顿法
  442. void CNLequationCalculatorDlg::OnButton11() 
  443. {
  444. // 建立CNLequation的子类,在其中重载函数Func
  445. class CNLeq : public CNLequation
  446. {
  447. double Func(double x[], double y[])
  448. {
  449. y[0]=x[0]*x[0]+x[1]*x[1]+x[2]*x[2]-1.0;
  450. y[1]=2.0*x[0]*x[0]+x[1]*x[1]-4.0*x[2];
  451. y[2]=3.0*x[0]*x[0]-4.0*x[1]+x[2]*x[2];
  452. return 0.0;
  453. }
  454. };
  455. // 求解
  456. CNLeq nleq;
  457.     double x[3]={1.0,1.0,1.0};
  458.     double t=0.1; 
  459. double h=0.1;
  460. int n = 3;
  461.     int nMaxIt = 100;
  462. BOOL bRet = nleq.GetRootsetNewton(n, x, t, h, nMaxIt);
  463. // 显示结果
  464. CString sMsg;
  465. if (bRet)
  466. {
  467. sMsg.Format("求得的 %d 个根为:nn", n);
  468. for (int i=0; i<n; ++i)
  469. {
  470. CString ss;
  471. ss.Format("x(%d) = %fn", i, x[i]);
  472. sMsg += ss;
  473. }
  474. }
  475. else
  476. sMsg = "求解失败";
  477. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  478. }
  479. // 求非线性方程组最小二乘解的广义逆法
  480. void CNLequationCalculatorDlg::OnButton12() 
  481. {
  482. // 建立CNLequation的子类,在其中重载函数Func
  483. class CNLeq : public CNLequation
  484. {
  485. double Func(double x[], double y[])
  486. {
  487. y[0]=x[0]*x[0]+7.0*x[0]*x[1]+3.0*x[1]*x[1]+0.5;
  488. y[1]=x[0]*x[0]-2.0*x[0]*x[1]+x[1]*x[1]-1.0;
  489. y[2]=x[0]+x[1]+1.0;
  490. return 0.0;
  491. }
  492. void FuncMJ(int n, double x[], double p[])
  493. {
  494. p[0*n+0]=2.0*x[0]+7.0*x[1];
  495. p[0*n+1]=7.0*x[0]+6.0*x[1];
  496. p[1*n+0]=2.0*x[0]-2.0*x[1];
  497. p[1*n+1]=-2.0*x[0]+2.0*x[1];
  498. p[2*n+0]=1.0;
  499. p[2*n+1]=1.0;
  500. }
  501. };
  502. // 求解
  503. CNLeq nleq;
  504.     double eps1 = 0.000001;
  505. double eps2 = 0.000001;
  506.     double x[2]={1.0,-1.0};
  507.     int m=3; 
  508. int n=2;
  509. BOOL bRet = nleq.GetRootsetGinv(m, n, x, eps1, eps2);
  510. // 显示结果
  511. CString sMsg;
  512. if (bRet)
  513. {
  514. sMsg.Format("求得的 %d 个根为:nn", n);
  515. for (int i=0; i<n; ++i)
  516. {
  517. CString ss;
  518. ss.Format("x(%d) = %fn", i, x[i]);
  519. sMsg += ss;
  520. }
  521. }
  522. else
  523. sMsg = "求解失败";
  524. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  525. }
  526. // 求非线性方程组一组实根的蒙特卡洛法
  527. void CNLequationCalculatorDlg::OnButton13() 
  528. {
  529. // 建立CNLequation的子类,在其中重载函数Func
  530. class CNLeq : public CNLequation
  531. {
  532. double Func(int n, double x[])
  533. double f,f1,f2,f3;
  534. n=n;
  535. f1=3.0*x[0]+x[1]+2.0*x[2]*x[2]-3.0;
  536. f2=-3.0*x[0]+5.0*x[1]*x[1]+2.0*x[0]*x[2]-1.0;
  537. f3=25.0*x[0]*x[1]+20.0*x[2]+12.0;
  538. f=sqrt(f1*f1+f2*f2+f3*f3);
  539. return(f);
  540. }
  541. };
  542. // 求解
  543. CNLeq nleq;
  544.     double x[3]={0.0,0.0,0.0};
  545.     double b=2.0; 
  546. int m=10; 
  547. int n=3; 
  548. double eps=0.000001;
  549. nleq.GetRootsetMonteCarlo(n, x, b, m, eps);
  550. // 显示结果
  551. CString sMsg;
  552. sMsg.Format("求得的 %d 个根为:nn", n);
  553. for (int i=0; i<n; ++i)
  554. {
  555. CString ss;
  556. ss.Format("x(%d) = %fn", i, x[i]);
  557. sMsg += ss;
  558. }
  559. AfxMessageBox(sMsg, MB_OK|MB_ICONINFORMATION);
  560. }