?? romberg.cpp
字號:
#include<iostream.h>
#include<math.h>
#define f(x) (1/x) //舉例函數
#define epsilon 0.000001 //精度
double Romberg(double aa, double bb,int MAXREPT)
{ //aa,bb 積分上下限
int m, n;//m控制迭代次數, 而n控制復化梯形積分的分點數. n=2^m
double h, x;
double s, q;
double ep; //精度要求
double *y = new double[4];//為節省空間,只需一維數組
//每次循環依次存儲Romberg計算表的每行元素,以供計算下一行,算完后更新
double p;//p總是指示待計算元素的前一個元素(同一行)
//迭代初值
h = bb - aa;
y[0] = h*(f(aa) + f(bb))/2.0;
m = 1;
n = 1;
ep = epsilon + 1.0;
//迭代計算
while ((ep >= epsilon) && (m <= MAXREPT))
{
//復化積分公式求T2n(Romberg計算表中的第一列),n初始為1,以后倍增
p = 0.0;
for (int i=0; i<n; i++)//求Hn
{
x = aa + (i+0.5)*h;
p = p + f(x);
}
p = (y[0] + h*p)/2.0;//求T2n = 1/2(Tn+Hn),用p指示
//求第m行元素,根據Romberg計算表本行的前一個元素(p指示),
//和上一行左上角元素(y[k-1]指示)求得.
s = 1.0;
int k;
for (k=1; k<=m; k++)
{
if(k==4)
break;
s = 4.0*s;
q = (s*p - y[k-1])/(s - 1.0);
y[k-1] = p;
p = q;
}
y[k-1] = q;
ep = fabs(q - y[k-2]);
m = m + 1;
n = n + n; h = h/2.0;
}
return (q);
}
void main()
{
double a,b;
int MAXREPT;
cout<<"Romberg積分,請輸入積分范圍a,b:"<<endl;
cin>>a>>b;
cout<<"Romberg積分迭代次數:"<<endl;
cin>>MAXREPT;
cout<<"積分結果:"<<Romberg(a, b, MAXREPT)<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -