數(shù)值分析課程設(shè)計說明書_第1頁
已閱讀1頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  數(shù)值分析課程設(shè)計說明書</p><p>  班級: 計算B092 姓名: </p><p>  設(shè)計題目: 數(shù)值積分軟件 </p><p>  設(shè)計時間: 2012.2.27 至 2012.3.2 </p><p>  指導(dǎo)教

2、師: 李 慧 </p><p>  評 語: </p><p>  _________________________________________</p><p>  ___________________________________

3、______</p><p>  _________________________________________</p><p>  _________________________________________</p><p>  評閱成績:__ __評閱教師:__ ___</p><p><b>  目 錄<

4、;/b></p><p><b>  設(shè)計總說明1</b></p><p><b>  前 言2</b></p><p>  第1章 總體設(shè)計方案3</p><p>  1.1 軟件結(jié)構(gòu)設(shè)計3</p><p>  第2章 算法分析及設(shè)計4</p>

5、<p>  2.1自適應(yīng)梯形法4</p><p>  2.1.1自適應(yīng)梯形法算法分析:4</p><p>  2.1.2自適應(yīng)梯形法算法設(shè)計:4</p><p>  2.2復(fù)化辛卜生法5</p><p>  2.2.1復(fù)化辛卜生法算法分析5</p><p>  2.2.2復(fù)化辛卜生法算法設(shè)計5&

6、lt;/p><p>  2.3龍貝格算法6</p><p>  2.3.1龍貝格算法分析6</p><p>  2.3.2龍貝格算法設(shè)計6</p><p>  第3章 軟件詳細(xì)設(shè)計8</p><p>  3.1主界面設(shè)計8</p><p><b>  3.2功能設(shè)計9</

7、b></p><p>  3.2.1自適應(yīng)梯形法的實(shí)現(xiàn)9</p><p>  3.2.2復(fù)化辛卜生法的實(shí)現(xiàn)11</p><p>  3.2.3龍貝格算法的實(shí)現(xiàn)13</p><p>  3.2.4算法簡介功能設(shè)計13</p><p>  第4章 軟件測試16</p><p>  4

8、.1自適應(yīng)梯形法的測試16</p><p>  4.1.1 軟件計算16</p><p>  4.1.2 Matlab計算16</p><p>  4.2復(fù)化辛卜生法的測試17</p><p>  4.2.1 軟件計算17</p><p>  4.2.2 Matlab計算17</p><

9、p>  4.3龍貝格法的測試18</p><p>  4.3.1 軟件計算18</p><p>  4.3.2 Matlab計算18</p><p>  4.4測試結(jié)果18</p><p><b>  第5章 總結(jié)19</b></p><p>  參 考 文 獻(xiàn)20</p&

10、gt;<p><b>  附 錄21</b></p><p><b>  設(shè)計總說明</b></p><p>  數(shù)值積分是求定積分的近似值的數(shù)值方法。即用被積函數(shù)的有限個抽樣值的離散或加權(quán)平均近似值代替定積分的值。求某函數(shù)的定積分時,在多數(shù)情況下,被積函數(shù)的原函數(shù)很難用初等函數(shù)表達(dá)出來,因此能夠借助微積分學(xué)的牛頓-萊布尼茲公式計

11、算定積分的機(jī)會是不多的。另外,許多實(shí)際問題中的被積函數(shù)往往是列表函數(shù)或其他形式的非連續(xù)函數(shù),對這類函數(shù)的定積分,也不能用不定積分方法求解。由于以上原因,數(shù)值積分的理論與方法一直是計算數(shù)學(xué)研究的基本課題。對微積分學(xué)做出杰出貢獻(xiàn)的數(shù)學(xué)大師,如I.牛頓、L.歐拉、C.F.高斯等人也在數(shù)值積分這個領(lǐng)域做出了各自的貢獻(xiàn),并奠定了它的理論基礎(chǔ)。</p><p>  用數(shù)值積分的計算理論加以C++語言編寫程序來計算數(shù)值積分,不

12、僅可以更好的掌握數(shù)值積分本身,還可以提高軟件開發(fā)的能力。把所學(xué)知識用于實(shí)際生活中是非常有必要的。好的積分軟件不僅可以計算出給定函數(shù)的定積分,還能準(zhǔn)確的計算出各種積分方法的積分值。因此,數(shù)值積分軟件的開發(fā)是非常實(shí)用及有必要的。</p><p>  關(guān)鍵詞: 龍貝格算法;自適應(yīng)梯形法;復(fù)化辛卜生法;MFC </p><p><b>  前 言</b></p>

13、<p>  本課程設(shè)計是在學(xué)習(xí)了數(shù)值分析和C語言等有關(guān)課程后,通過實(shí)際的操作來熟悉數(shù)值分析和相關(guān)軟件的應(yīng)用,培養(yǎng)獨(dú)立的完成對相關(guān)課題或者項目的分析能力、設(shè)計能力和調(diào)試能力。好的數(shù)值積分軟件可以方便的為我們求解出積分值。</p><p>  課程設(shè)計,著重培養(yǎng)的是學(xué)生的自學(xué)能力,以及獨(dú)立分析互聯(lián)網(wǎng)上和圖書館里的各種資料,用來豐富自己的知識并且提高對Matlab、VC++等軟件的實(shí)際操作能力。通過這次的課

14、程設(shè)計,使我們對已經(jīng)學(xué)習(xí)過的數(shù)值分析課程的進(jìn)一步的掌握,對知識進(jìn)行最大程度的消化融匯。因此這次的課程設(shè)計對我們來說具有非常重要的作用:為以后學(xué)習(xí)工作做必要的準(zhǔn)備和實(shí)踐,提高自身對數(shù)值分析的認(rèn)識以及軟件開發(fā)的能力。</p><p>  第1章 總體設(shè)計方案</p><p><b>  軟件結(jié)構(gòu)設(shè)計</b></p><p>  圖1.1.1 軟件功

15、能結(jié)構(gòu)圖</p><p>  第2章 算法分析及設(shè)計</p><p><b>  2.1自適應(yīng)梯形法</b></p><p>  2.1.1自適應(yīng)梯形法算法分析:</p><p>  變步長梯形算法依據(jù)公式。計算時可按如下步驟:</p><p><b>  輸入精度;</b>

16、</p><p><b>  s=0;</b></p><p><b> ?、?lt;/b></p><p><b> ?、?。</b></p><p>  2.1.2自適應(yīng)梯形法算法設(shè)計:</p><p>  float AutoTrap(float (*f)

17、(float),float a,float b)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  float x,s,h=b-a;</p><p>  float t1,t2=h/2.0*(f(a)+f(b));</p>&

18、lt;p><b>  n=1;</b></p><p><b>  do</b></p><p><b>  {</b></p><p><b>  s=0.0;</b></p><p><b>  t1=t2;</b><

19、/p><p>  for(i=0;i<=n-1;i++)</p><p><b>  {</b></p><p>  x=a+i*h+h/2;</p><p><b>  s+=f(x);</b></p><p><b>  }</b></p&g

20、t;<p>  t2=(t1+s*h)/2.0;</p><p><b>  n*=2;</b></p><p><b>  h/=2.0;</b></p><p><b>  }</b></p><p>  while(fabs(t2-t1)>1e-6);

21、</p><p>  return t2;</p><p><b>  }</b></p><p><b>  2.2復(fù)化辛卜生法</b></p><p>  2.2.1復(fù)化辛卜生法算法分析</p><p>  復(fù)化辛卜生公式為,計算過程為:</p><p

22、><b>  令;</b></p><p><b>  對計算</b></p><p><b>  。</b></p><p>  2.2.2復(fù)化辛卜生法算法設(shè)計</p><p>  float Simpson(float (*f)(float),float a,floa

23、t b, int n)</p><p><b>  {</b></p><p><b>  int k;</b></p><p>  float s,s1,s2=0.0;</p><p>  float h=(b-a)/n;</p><p>  s1=f(a+h/2);<

24、;/p><p>  for(k=1;k<=n-1;k++)</p><p><b>  {</b></p><p>  s1+=f(a+k*h+h/2);</p><p>  s2+=f(a+k*h);</p><p><b>  }</b></p><

25、p>  s=h/6*(f(a)+4*s1+2*s2+f(b));</p><p><b>  return s;</b></p><p><b>  }</b></p><p><b>  2.3龍貝格算法</b></p><p>  2.3.1龍貝格算法分析</p

26、><p>  2.3.2龍貝格算法設(shè)計</p><p>  float Romberg(float a,float b,float (*f)(float),float epsilon)</p><p><b>  {</b></p><p>  int n=1,k;</p><p>  float h

27、=b-a,x,temp;</p><p>  float T1,T2,S1,S2,C1,C2,R1,R2;</p><p>  T1=(b-a)/2*((*f)(a)+(*f)(b));</p><p><b>  while(1)</b></p><p><b>  {</b></p>

28、<p><b>  temp=0;</b></p><p>  for(k=0;k<=n-1;k++)</p><p><b>  {</b></p><p>  x=a+k*h+h/2;</p><p>  temp+=(*f)(x);</p><p>

29、<b>  }</b></p><p>  T2=(T1+temp*h)/2;</p><p>  if(fabs(T2-T1)<epsilon) </p><p>  return T2;</p><p>  S2=T2+(T2-T1)/3.0;</p><p>  if(n==1){T1

30、=T2;S1=S2;h/=2;n*=2;continue;}</p><p>  C2=S2+(S2-S1)/15;</p><p>  if(n==2){C1=C2;T1=T2;S1=S2;h/=2;n*=2;continue;}</p><p>  R2=C2+(C2-C1)/63;</p><p>  if(n==4){R1=R2;C1

31、=C2;T1=T2;S1=S2;h/=2;n*=2;continue;}</p><p>  if(fabs(R2-R1)<epsilon) </p><p>  return R2;</p><p>  R1=R2;C1=C2;T1=T2;S1=S2;h/=2;n*=2;</p><p><b>  }</b>&

32、lt;/p><p><b>  }</b></p><p>  第3章 軟件詳細(xì)設(shè)計</p><p><b>  3.1主界面設(shè)計</b></p><p>  數(shù)值積分軟件主界面如圖3.1.1所示,包括兩大功能。一個是選擇求積方法,另一個是查看相應(yīng)算法的算法理論。</p><p>

33、;  為了使軟件美觀,還可以為軟件添加背景圖片以及顯示系統(tǒng)時間,這樣就使軟件顯得不再單調(diào)。</p><p>  圖3.1.1 主界面</p><p>  添加背景圖片關(guān)鍵代碼:</p><p>  void CAutoTrap::OnPaint() </p><p><b>  {</b></p><

34、p>  CPaintDC dc(this); // device context for painting</p><p>  CRect rect;</p><p>  GetClientRect(&rect);</p><p>  CDC dcMem;</p><p>  dcMem.CreateCompatibleDC

35、(&dc);</p><p>  CBitmap bmpBackground;</p><p>  bmpBackground.LoadBitmap(IDB_BITMAP2); </p><p>  BITMAP bitmap;</p><p>  bmpBackground.GetBitmap(&bitmap);<

36、;/p><p>  CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); </p><p>  dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);</p><p&g

37、t;<b>  }</b></p><p><b>  顯示時間代碼:</b></p><p>  void CMyDlg::OnTimer(UINT nIDEvent) </p><p><b>  {</b></p><p>  CDialog::OnTimer(nIDEv

38、ent);</p><p>  CString str;</p><p>  CTime theTime = CTime::GetCurrentTime(); </p><p>  str.Format("%02d年%02d月%02d日 %02d:%02d:%02d",</p><p>  theTime.GetYear(

39、),theTime.GetMonth(),theTime.GetDay(),</p><p>  theTime.GetHour(),theTime.GetMinute(),theTime.GetSecond());</p><p>  SetDlgItemText(IDC_STATIC_TIME,str);</p><p>  CDialog::OnTimer(n

40、IDEvent);</p><p><b>  }</b></p><p><b>  3.2功能設(shè)計</b></p><p>  3.2.1自適應(yīng)梯形法的實(shí)現(xiàn)</p><p>  通過類向?qū)榭丶x值,從界面獲取上下界以及精度值,從而進(jìn)行計算,將結(jié)果顯示在對應(yīng)框。若輸入錯誤的數(shù)據(jù)將進(jìn)行錯誤提示。為

41、了美觀,以相同方法添加背景圖片。</p><p>  圖3.2.1 自適應(yīng)梯形法</p><p>  圖3.2.2積分區(qū)間錯誤提示 圖3.2.3精度值錯誤提示</p><p><b>  關(guān)鍵代碼:</b></p><p>  錯誤檢查及提示代碼:</p><p> 

42、 if(m_xiajie==m_shangjie)</p><p><b>  {</b></p><p>  MessageBox("積分區(qū)間錯誤!");</p><p><b>  return;</b></p><p><b>  }</b></

43、p><p>  if(m_epsilon<=0)</p><p><b>  {</b></p><p>  MessageBox("精度值有誤!");</p><p><b>  return;</b></p><p><b>  }<

44、/b></p><p>  3.2.2復(fù)化辛卜生法的實(shí)現(xiàn)</p><p>  同樣,通過類向?qū)榭丶x值,從界面獲取上下界、劃分區(qū)間及運(yùn)算次數(shù),從而進(jìn)行計算,將結(jié)果顯示在列表框。若輸入錯誤的數(shù)據(jù)將進(jìn)行錯誤提示。</p><p>  圖3.2.4 復(fù)化辛卜生法</p><p>  圖3.2.5 錯誤提示</p><p&

45、gt;<b>  關(guān)鍵代碼:</b></p><p>  列表框表頭初始化代碼:</p><p>  BOOL CSimpson::OnInitDialog() </p><p><b>  {</b></p><p>  Cdialog::OnInitDialog();</p>&l

46、t;p>  // TODO: Add extra initialization here</p><p>  m_combo.SetCurSel(0);</p><p>  m_List1.SetExtendedStyle(LVS_EX_FLATSB</p><p>  |LVS_EX_FULLROWSELECT</p><p>  |

47、LVS_EX_HEADERDRAGDROP</p><p>  |LVS_EX_ONECLICKACTIVATE</p><p>  |LVS_EX_GRIDLINES);</p><p>  m_List1.InsertColumn(0,”s[n]”, LVCFMT_LEFT, 80);</p><p>  m_List1.InsertCo

48、lumn(1,”值”, LVCFMT_LEFT, 140);</p><p>  return TRUE; // return TRUE unless you set the focus to a control</p><p>  // EXCEPTION: OCX Property Pages should return FALSE</p><p><b

49、>  }</b></p><p><b>  結(jié)果顯示代碼:</b></p><p>  for(int j=0;j<m_cishu;j++)</p><p><b>  {</b></p><p>  if(index==0)</p><p>  s

50、=Simpson(f7,m_xiajie,m_shangjie,n);</p><p>  if(index==1)</p><p>  s=Simpson(f8,m_xiajie,m_shangjie,n);</p><p>  if(index==2)</p><p>  s=Simpson(f9,m_xiajie,m_shangjie,

51、n);</p><p>  p.Format("%d",n);</p><p>  p="s["+p+"]";</p><p>  q.Format("%f",s);</p><p>  m_List1.InsertItem(j,"");<

52、;/p><p>  m_List1.SetItemText(j,0,p);</p><p>  m_List1.SetItemText(j,1,q);</p><p><b>  n*=2;</b></p><p><b>  }</b></p><p>  3.2.3龍貝格算法

53、的實(shí)現(xiàn)</p><p>  同樣,通過類向?qū)榭丶x值,從界面獲取上下界及精度值。單機(jī)計算按鈕,即可將結(jié)果顯示在結(jié)果框。單機(jī)返回按鈕,返回主界面。若輸入錯誤的數(shù)據(jù)將進(jìn)行錯誤提示。</p><p>  圖3.2.6 龍貝格算法</p><p>  3.2.4算法簡介功能設(shè)計</p><p>  算法簡介功能就是對每種算法的簡單介紹,單機(jī)相應(yīng)按鈕

54、就可以查看。</p><p>  圖3.2.7 自適應(yīng)梯形法簡介</p><p>  圖3.2.8 復(fù)化辛卜生法簡介</p><p>  圖3.2.9 龍貝格算法簡介</p><p><b>  第4章 軟件測試</b></p><p>  4.1自適應(yīng)梯形法的測試</p><

55、p>  4.1.1 軟件計算</p><p>  用本軟件計算結(jié)果如下</p><p>  圖4.1.1 自適應(yīng)梯形法結(jié)果顯示</p><p>  4.1.2 Matlab計算</p><p>  Matlab計算結(jié)果如下:</p><p><b>  >> syms x</b>

56、</p><p>  f=int(sin(x)/x,x,0,1)</p><p><b>  f =</b></p><p><b>  sinint(1)</b></p><p>  >> sinint(1)</p><p><b>  ans =&l

57、t;/b></p><p><b>  0.9461</b></p><p>  4.2復(fù)化辛卜生法的測試</p><p>  4.2.1 軟件計算</p><p>  本軟件計算結(jié)果如下:</p><p>  圖4.2.1 復(fù)化辛卜生法結(jié)果顯示</p><p>  

58、4.2.2 Matlab計算</p><p>  Matlab計算結(jié)果如下:</p><p><b>  >> syms x</b></p><p>  f=int(cos(x),x,0,1)</p><p><b>  f =</b></p><p><b

59、>  sin(1)</b></p><p><b>  >> sin(1)</b></p><p><b>  ans =</b></p><p><b>  0.8415</b></p><p>  4.3龍貝格法的測試</p>&

60、lt;p>  4.3.1 軟件計算</p><p>  本軟件計算結(jié)果如下:</p><p>  圖4.3.1 龍貝格算法結(jié)果顯示</p><p>  4.3.2 Matlab計算</p><p>  Matlab計算結(jié)果如下:</p><p>  >> syms x</p><

61、p>  f=int(1/(1+x^2),x,0,1)</p><p><b>  f =</b></p><p><b>  pi/4</b></p><p><b>  4.4測試結(jié)果</b></p><p>  可以看到每一種算法都接近其真實(shí)值,所以本軟件計算結(jié)果具有

62、相當(dāng)?shù)目煽啃???梢宰鳛楹唵畏e分的計算工具。</p><p><b>  第5章 總結(jié)</b></p><p>  通過一周的時間終于完成了數(shù)值分析軟件的設(shè)計開發(fā),由于時間有限不免存在很多問題。在課程設(shè)計的過程中困難不時的出現(xiàn),很多時候覺得無可入手,想盡辦法也不知道該怎么解決。但是這個時候是最關(guān)鍵的,進(jìn)一步的堅持和探討后終于是“功夫不負(fù)有心人”。面對各種考驗,在堅持不懈

63、的努力后總會解決。</p><p>  數(shù)值積分軟件的設(shè)計不同于其他軟件的設(shè)計,它要求軟件能夠準(zhǔn)確并快速的計算出被積函數(shù)的積分值。在實(shí)現(xiàn)過程中發(fā)現(xiàn)每一步都沒有想象的那樣順利。分析問題原因,首先是對算法的不精通,其次是對MFC編程的不夠熟練。還有些問題是不可避免的,比如數(shù)學(xué)與編程語言的結(jié)合本身就有一定的難度。類似這樣的問題只能一步一步探索了,這也是軟件開發(fā)過程中必不可少的階段。</p><p&g

64、t;  本軟件界面清新,操作簡單,能夠快速準(zhǔn)確的計算一定范圍內(nèi)的積分值。在某種程度上還是具有一定的靈活性的,比如可以設(shè)置精度,積分區(qū)間,劃分區(qū)間份數(shù)等。這樣,在可選范圍內(nèi)還是能夠比較準(zhǔn)確的求解的。用MFC編程求解數(shù)值積分的過程中最大的困難就是被積函數(shù)不能自定義,也就是被積函數(shù)是在局域范圍內(nèi)的,也是目前為止沒有解決的問題,這是本軟件有待改進(jìn)的地方。</p><p>  當(dāng)然,軟件的開發(fā)離不開好的資料和同學(xué)的交流。在

65、這次課程設(shè)計中深深感受到了同學(xué)之間交流合作的重要性。交流不但可以發(fā)現(xiàn)新的問題,提高解決問題的效率,而且可以快速的學(xué)習(xí)到新的知識。</p><p>  最后感謝這次課程設(shè)計中給予我?guī)椭睦蠋熀屯瑢W(xué),是你們的幫助才使課程設(shè)計有了快速的進(jìn)展。</p><p><b>  參 考 文 獻(xiàn)</b></p><p>  [1] 陳越,童若峰. 數(shù)值分析課程

66、設(shè)計 [M]. 浙江:浙江大學(xué)出版社, 2009.</p><p>  [2] 李慶揚(yáng),王能超.數(shù)值分析 [M]. 北京:清華大學(xué)出版社, 2011.</p><p><b>  附 錄</b></p><p><b>  源程序清單</b></p><p>  自適應(yīng)梯形法關(guān)鍵代碼:</p&

67、gt;<p>  float f1(float x)</p><p><b>  {</b></p><p><b>  if(x==0)</b></p><p><b>  return 1;</b></p><p><b>  else</b&

68、gt;</p><p>  return sin(x)/x;</p><p><b>  }</b></p><p>  float f2(float x)</p><p><b>  {</b></p><p>  return cos(x);</p><

69、;p><b>  }</b></p><p>  float f3(float x)</p><p><b>  {</b></p><p>  return 1/(1+x*x);</p><p><b>  }</b></p><p>  flo

70、at AutoTrap(float (*f)(float),float a,float b,float epsilon)</p><p><b>  {</b></p><p><b>  int i,n;</b></p><p>  float x,s,h=b-a;</p><p>  float

71、 t1,t2=h/2.0*(f(a)+f(b));</p><p><b>  n=1;</b></p><p><b>  do</b></p><p><b>  {</b></p><p><b>  s=0.0;</b></p>&l

72、t;p><b>  t1=t2;</b></p><p>  for(i=0;i<=n-1;i++)</p><p><b>  {</b></p><p>  x=a+i*h+h/2;</p><p><b>  s+=f(x);</b></p>&

73、lt;p><b>  }</b></p><p>  t2=(t1+s*h)/2.0;</p><p><b>  n*=2;</b></p><p><b>  h/=2.0;</b></p><p><b>  }</b></p>

74、<p>  while(fabs(t2-t1)>epsilon);</p><p>  return t2;</p><p><b>  }</b></p><p>  void CAutoTrap::Onjisuan() </p><p><b>  {</b></p>

75、<p>  // TODO: Add your control notification handler code here</p><p><b>  //int i;</b></p><p>  UpdateData(true);</p><p>  if(m_xiajie==m_shangjie)</p>&

76、lt;p><b>  {</b></p><p>  MessageBox("積分區(qū)間錯誤!");</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(m_epsilon<=0)&

77、lt;/p><p><b>  {</b></p><p>  MessageBox("精度值有誤!");</p><p><b>  return;</b></p><p><b>  }</b></p><p>  int index

78、;</p><p>  index=m_combo.GetCurSel();</p><p>  if(index==0)</p><p>  m_result=AutoTrap(f1,m_xiajie,m_shangjie,m_epsilon);</p><p>  if(index==1)</p><p>  m_

79、result=AutoTrap(f2,m_xiajie,m_shangjie,m_epsilon);</p><p>  if(index==2)</p><p>  m_result=AutoTrap(f3,m_xiajie,m_shangjie,m_epsilon);</p><p>  UpdateData(FALSE);</p><p&g

80、t;<b>  }</b></p><p>  BOOL CAutoTrap::OnInitDialog() </p><p><b>  {</b></p><p>  CDialog::OnInitDialog();</p><p>  // TODO: Add extra initializa

81、tion here</p><p>  m_combo.SetCurSel(0);</p><p>  return TRUE; // return TRUE unless you set the focus to a control</p><p>  // EXCEPTION: OCX Property Pages should return FALSE<

82、;/p><p><b>  }</b></p><p>  復(fù)化辛卜生法關(guān)鍵代碼:</p><p>  float f7(float x)</p><p><b>  {</b></p><p><b>  if(x==0)</b></p>&

83、lt;p><b>  return 1;</b></p><p><b>  else</b></p><p>  return sin(x)/x;</p><p><b>  }</b></p><p>  float f8(float x)</p>&l

84、t;p><b>  {</b></p><p>  return cos(x);</p><p><b>  }</b></p><p>  float f9(float x)</p><p><b>  {</b></p><p>  retur

85、n 1/(1+x*x);</p><p><b>  }</b></p><p>  float Simpson(float (*f)(float),float a,float b, int n)</p><p><b>  {</b></p><p><b>  int k;</b

86、></p><p>  float s,s1,s2=0.0;</p><p>  float h=(b-a)/n;</p><p>  s1=f(a+h/2);</p><p>  for(k=1;k<=n-1;k++)</p><p><b>  {</b></p>&

87、lt;p>  s1+=f(a+k*h+h/2);</p><p>  s2+=f(a+k*h);</p><p><b>  }</b></p><p>  s=h/6*(f(a)+4*s1+2*s2+f(b));</p><p><b>  return s;</b></p>

88、<p><b>  }</b></p><p>  void CSimpson::Onjisuan() </p><p><b>  {</b></p><p>  // TODO: Add your control notification handler code here</p><p&

89、gt;  UpdateData(true);</p><p>  if(m_xiajie==m_shangjie)</p><p><b>  {</b></p><p>  MessageBox("積分區(qū)間錯誤!");</p><p><b>  return;</b><

90、/p><p><b>  }</b></p><p>  if(m_n==0)</p><p><b>  {</b></p><p>  MessageBox("區(qū)間劃分錯誤!");</p><p><b>  return;</b>&

91、lt;/p><p><b>  }</b></p><p>  if(m_cishu==0)</p><p><b>  {</b></p><p>  MessageBox("請輸入運(yùn)行次數(shù)!");</p><p><b>  return;<

92、;/b></p><p><b>  }</b></p><p>  m_List1.DeleteAllItems();</p><p>  int index,n;</p><p><b>  n=m_n;</b></p><p>  CString p,q;<

93、/p><p><b>  float s;</b></p><p>  index=m_combo.GetCurSel();</p><p>  for(int j=0;j<m_cishu;j++)</p><p><b>  {</b></p><p>  if(inde

94、x==0)</p><p>  s=Simpson(f7,m_xiajie,m_shangjie,n);</p><p>  if(index==1)</p><p>  s=Simpson(f8,m_xiajie,m_shangjie,n);</p><p>  if(index==2)</p><p>  s=Si

95、mpson(f9,m_xiajie,m_shangjie,n);</p><p>  p.Format("%d",n);</p><p>  p="s["+p+"]";</p><p>  q.Format("%f",s);</p><p>  m_List1.I

96、nsertItem(j,"");</p><p>  m_List1.SetItemText(j,0,p);</p><p>  m_List1.SetItemText(j,1,q);</p><p><b>  n*=2;</b></p><p><b>  }</b><

97、/p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p>  龍貝格算法關(guān)鍵代碼:</p><p>  float f4(float x)</p><p><b>  {</b></p><p><

98、;b>  if(x==0)</b></p><p><b>  return 1;</b></p><p><b>  else</b></p><p>  return sin(x)/x;</p><p><b>  }</b></p><

99、;p>  float f5(float x)</p><p><b>  {</b></p><p>  return cos(x);</p><p><b>  }</b></p><p>  float f6(float x)</p><p><b>  

100、{</b></p><p>  return 1/(1+x*x);</p><p><b>  }</b></p><p>  float Romberg(float a,float b,float (*f)(float),float epsilon)</p><p><b>  {</b&g

101、t;</p><p>  int n=1,k;</p><p>  float h=b-a,x,temp;</p><p>  float T1,T2,S1,S2,C1,C2,R1,R2;</p><p>  T1=(b-a)/2*((*f)(a)+(*f)(b));</p><p><b>  while(

102、1)</b></p><p><b>  {</b></p><p><b>  temp=0;</b></p><p>  for(k=0;k<=n-1;k++)</p><p><b>  {</b></p><p>  x=a+k

103、*h+h/2;</p><p>  temp+=(*f)(x);</p><p><b>  }</b></p><p>  T2=(T1+temp*h)/2;</p><p>  if(fabs(T2-T1)<epsilon) </p><p>  return T2;</p>

104、<p>  S2=T2+(T2-T1)/3.0;</p><p>  if(n==1){T1=T2;S1=S2;h/=2;n*=2;continue;}</p><p>  C2=S2+(S2-S1)/15;</p><p>  if(n==2){C1=C2;T1=T2;S1=S2;h/=2;n*=2;continue;}</p><

105、;p>  R2=C2+(C2-C1)/63;</p><p>  if(n==4){R1=R2;C1=C2;T1=T2;S1=S2;h/=2;n*=2;continue;}</p><p>  if(fabs(R2-R1)<epsilon) </p><p>  return R2;</p><p>  R1=R2;C1=C2;T

106、1=T2;S1=S2;h/=2;n*=2;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CRomberg::Onjisuan() </p><p><b>  {</b></p><p>

107、  // TODO: Add your control notification handler code here</p><p>  UpdateData(true);</p><p>  if(m_xiajie==m_shangjie)</p><p><b>  {</b></p><p>  MessageBo

108、x("積分區(qū)間錯誤!");</p><p><b>  return;</b></p><p><b>  }</b></p><p>  if(m_epsilon<=0)</p><p><b>  {</b></p><p>

109、;  MessageBox("精度值有誤!");</p><p><b>  return;</b></p><p><b>  }</b></p><p>  int index;</p><p>  index=m_combo.GetCurSel();</p>

110、<p>  if(index==0)</p><p>  m_result=Romberg(m_xiajie,m_shangjie,f4,m_epsilon);</p><p>  if(index==1)</p><p>  m_result=Romberg(m_xiajie,m_shangjie,f5,m_epsilon);</p>&l

111、t;p>  if(index==2)</p><p>  m_result=Romberg(m_xiajie,m_shangjie,f6,m_epsilon);</p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p>  靜態(tài)文本控件透明代碼:</p&

112、gt;<p>  HBRUSH CRomberg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) </p><p><b>  {</b></p><p>  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);</p><p

113、>  // TODO: Change any attributes of the DC here</p><p>  if(nCtlColor==CTLCOLOR_STATIC)</p><p>  //對所有的STATIC控件的屬性進(jìn)行設(shè)定</p><p><b>  {</b></p><p>  pDC-&g

114、t;SetBkMode(TRANSPARENT);</p><p>  return (HBRUSH)::GetStockObject(NULL_BRUSH); </p><p><b>  }</b></p><p>  // TODO: Return a different brush if the default is not desir

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論