// 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))) );
    }
}
Пример #2
0
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;
}
Пример #3
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;
}
Пример #4
0
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;
}
Пример #5
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;
}