- 相關推薦
Romberg龍貝格算法實驗報告
課 程 實 驗 報 告
課程名稱:
專業(yè)班級: CS1306班 學 號: U201314967 姓 名: 段沛云 指導教師: 報告日期:
計算機科學與技術學院
目錄
1 實驗目的 ........................................................ 1
2 實驗原理 ........................................................ 1
3 算法設計與流程框圖 .............................................. 2
4 源程序 .......................................................... 4
5 程序運行 ........................................................ 7
6 結果分析 ........................................................ 7
7 實驗體會 ........................................................ 7
1 實驗目的
掌握Romberg公式的用法,適用范圍及精度,熟悉Romberg算法的流程,并能夠設計算法計算積分
31
得到結果并輸出。 1x
2 實驗原理
2.1 取k=0,h=b-a,求T0=
數)。 2.2 求梯形值T0(
b-a
),即按遞推公式(4.1)計算T0。 k
2
h
[f(a)+f(b)],令1→k,(k記區(qū)間[a,b]的二分次2
2.3 求加速值,按公式(4.12)逐個求出T表的第k行其余各元素Tj(k-j)
(j=1,2,….k)。
2.4 若|Tk+1-Tk|
n-1
11T2n=[Tn+hn∑f(xi+)]
22i=0
1
Sn=T2n+(T2n-Tn)
31
Cn=S2n+(S2n-Sn)
151
Rn=C2n+(C2n-Cn)
63
3 算法設計與流程框圖
算法設計:(先假定所求積分二分最大次數次數為20) 3.1 先求T[k][0] 3.2 再由公式T
(k)m
4m(k+1)1)=mTm-1-mTm(k-1(k=1,2,) 求T[i][j] 4-14-1
3.3 在求出的同時比較T[k][k]與T[k-1][k-1]的大小,如果二者之差的絕對
值小于1e-5,就停止求T[k][k];此時的k就是所求的二分次數,而此時的T[k][k]就是最終的結果 3.4 打印出所有的T[i][j]; 程序流程圖
4 源程序
#include #include #include #include int main(void) {
float f(float(x)) {
float y; y=1/x; return y; }
float a,b,e,h,s,k,x,T1=0,T2=0,S1=0,S2=0,C1=0,C2=0,R1=0,R2=0; int i=0;
printf("請輸入積分下限 : "); scanf("%f",&a);
printf("\n請輸入積分上限 :"); scanf("%f",&b);
printf("\n請輸入允許誤差 :"); scanf("%f",&e); k大學網=1; h=b-a;
T1=h*(f(a)+f(b))/2;
printf("____________________________________________\n"); printf("計算結果如下 : \n");
printf("\nk T2 S2 C2 R2\n"); printf("%d %10.7f %10.7f %10.7f %10.7f\n",i,T1,S1,C1,R1); do {
x=a+h/2; s=0; while(x
{ s=s+f(x); x=x+h; }
T2=(T1+s*h)/2; S2=T2+(T2-T1)/3; if(k==1) {
T1=T2; S1=S2; h=h/2; k=k+1; }
else if(k==2) {
C2=S2+(S2-S1)/15; C1=C2; T1=T2; S1=S2; h=h/2; k=k+1; }
else if(k==3) {
R2=C2+(C2-C1)/63; C2=S2+(S2-S1)/15; C1=C2; T1=T2; S1=S2; h=h/2; k=k+1; } else {
C2=S2+(S2-S1)/15;
R2=C2+(C2-C1)/63; if(fabs(R2-R1)
printf("%d %10.7f %10.7f %10.7f %10.7f\n",i+1,T2,S2,C2,R2);
break;
} else { R1=R2; C1=C2; T1=T2; S1=S2; h=h/2; k=k+1; } } i++;
printf("%d %10.7f %10.7f %10.7f %10.7f\n",i,T2,S2,C2,R2); } while(1); system("pause"); return 0; }
5 程序運行
6 結果分析
如上所示的結果與課本中求得的結果完全一樣,表明程序編寫正確,且符合要求,事實上,只要再將所求值的精度設置得更小,則所求的結果將更加準確,最終將無限接近于標準值,由上表也可以看出用龍貝格積分法求函數的積分值在精度比較低的情況下就能求到很準確的值!
7 實驗體會
本次實驗較為簡單,主要時間是耗費在循環(huán)判斷上面,因為書上已經給了流程圖,都是基本的C語言,難度不大。過程中唯一遇到的一點障礙就是在寫循環(huán)判斷時由于多重判斷多重循環(huán)導致混亂,幸好最后改
正了,最后得到的結果經檢驗與給定的結果相同。通過這次實驗上機,
使我更進一步了解了龍貝格法的計算思想,其在精度上很有保證,收斂較快,是解積分問題的有效方法。
【Romberg龍貝格算法實驗報告】相關文章:
綠色良知-盧岑貝格和他的《自然不可改良》05-01
基于貝葉斯粗糙集模型的屬性約簡算法04-29
關于Romberg求積公式注記04-28
基于貝葉斯優(yōu)化的無人機路徑規(guī)劃算法04-30
轉:一個gg的羅蘭貝格暑期實習總結04-27
基于LMS格型算法的自適應參數譜估計方法04-29
可壓流的龍格-庫塔時間步進求解法及其應用04-27
心算法04-30
數學算法04-28