// Recursive Romberg, level 1 : Trapezodial, level >= 1 double Romberg(fp f, double a, double b, int n, int level){ if (level == 1){ return Trapezodial(f, a, b, n); } else { return ((Romberg(f,a,b,2 * n,level - 1) - pow(4,-(level-1)) * Romberg(f,a,b,n,level-1)) / (1 - pow(4, -(level-1))) ); } }
inline double Integral(double a, double b, double (*f)(double x, double y, double z), double eps, double l, double t) { const double pi(acos(-1.0f)); int n; double R, p, res; n = (int)(floor)(b * t * 0.50 / pi); p = 2.0 * pi / t; res = b - (double)n * p; if (n) R = Romberg (a, p, f0, eps/(double)n, l, t); R = R * (double)n + Romberg( 0.0, res, f0, eps, l, t ); return R/100.0; }
double Integral(double a, double b, double (*f)(double x, double y, double z), double eps, double l, double t) { //count cycles double T = 2.0 * PI / t; int count_T = (int)(b / T); double remain = b - (double)count_T * T; double length_T = Romberg(0.0, T, f0, eps, l, t); double length_r = Romberg(0.0, remain, f0, eps, l, t); double result = (length_T * count_T + length_r) / 100.0; return result; }
int main() { double a, b; printf("请输入积分上下限!\n 下限a = "); scanf ("%lf", &a); getchar(); printf(" 上限b = "); scanf ("%lf", &b); getchar(); printf("\n龙贝格法求积分结果为: %lf\n", Romberg(a, b)); system("pause"); return 0; }
//积分计算 ErrNo Calculus::GetStart_I(int iSelectIndex) { ErrNo err; int iLength; ChangeVariableSymbol(TEXT('x')); //使用默认的变量符号 //获取函数表达式 if(! (iLength = Edit_GetText(GetDlgItem(hDlg,EditControlID[0]),expression,MAXINPUT))) { MessageBox(hDlg,TEXT("未输入表达式"),TEXT("错误"),MB_ICONERROR); return NO_DATA_INPUT; } iLength = lstrlen(expression); for(int i=0;i<=iLength;i++) { exp_store[i] = expression[i]; } //获取区间大小 if(err = GetLine_Double(GetDlgItem(hDlg,EditControlID[1]),&left_interval)) { ErrorReport(hDlg,err); return err; } if(err = GetLine_Double(GetDlgItem(hDlg,EditControlID[2]),&right_interval)) { ErrorReport(hDlg,err); return err; } if(iSelectIndex == GAUSS_LEGENDRE_INDEX || iSelectIndex == GAUSS_CHEBYSHEV_INDEX) { if(fabs(left_interval+1)>eps || fabs(right_interval-1)>eps) { MessageBox(hDlg,TEXT("区间输入错误,应输入范围[-1,1]"),TEXT("错误"),MB_ICONERROR); return NOT_MATCH; } } //获取计算精度 if(err = GetLine_Double(GetDlgItem(hDlg,EditControlID[3]),&precision)) { if(iSelectIndex == GAUSS_LEGENDRE_INDEX || iSelectIndex == GAUSS_CHEBYSHEV_INDEX) ; else { ErrorReport(hDlg,err); return err; } } precision_a = precision; switch(iSelectIndex) { case ROMBERG_INDEX: err = Romberg(expression,precision,left_interval,right_interval,result,precision_a,times); break; case GAUSS_LEGENDRE_INDEX: err = Gauss_Legendre(expression,result); break; case GAUSS_CHEBYSHEV_INDEX: err = Gauss_Chebyshev(expression,result); break; } OutputResult_I(iSelectIndex,err); return 0; }