?? romberg00.cpp
字號:
#include<iostream>
#include<cmath>
#include <iomanip>
using namespace std;
#define f(x) (1/(1+x*x)) //舉例函數
#define epsilon 0.000001 //精度
#define MAXREPT 10 //迭代次數,到最后仍達不到精度要求,則輸出T(m=10).
double Romberg(double aa, double bb)
{
//aa,bb 積分上下限
int m, n; //m控制迭代次數, 而n控制復化梯形積分的分點數. n=2^m
double h, x;
double s, q;
double ep; //精度要求
double *y = new double[MAXREPT];//為節省空間,只需一維數組
//每次循環依次存儲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;
for (int k=1; k<=m; k++)
{
s = 4.0*s;
q = (s*p - y[k-1])/(s - 1.0);
y[k-1] = p;
p = q;
}
p = fabs(q - y[m-1]);
m = m + 1;
y[m-1] = q;
n = n + n; h = h/2.0;
}
return (q);
}
int main()
{
double a,b;
cout<<"Romberg積分,請輸入積分范圍a,b:"<<endl;
cin>>a>>b;
cout<<"積分結果:"<<setiosflags(ios::fixed)<<setprecision(11)<<Romberg(a, b)<<endl;
system("pause");
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -