⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quadrature.h

📁 经典numerical receip 配套代码
💻 H
字号:
struct Quadrature{
	Int n;
	virtual Doub next() = 0;
};
template<class T>
struct Trapzd : Quadrature {
	Doub a,b,s;
	T &func;
	Trapzd() {};
	Trapzd(T &funcc, const Doub aa, const Doub bb) :
		func(funcc), a(aa), b(bb) {n=0;}
	Doub next() {
		Doub x,tnm,sum,del;
		Int it,j;
		n++;
		if (n == 1) {
			return (s=0.5*(b-a)*(func(a)+func(b)));
		} else {
			for (it=1,j=1;j<n-1;j++) it <<= 1;
			tnm=it;
			del=(b-a)/tnm;
			x=a+0.5*del;
			for (sum=0.0,j=0;j<it;j++,x+=del) sum += func(x);
			s=0.5*(s+(b-a)*sum/tnm);
			return s;
		}
	}
};
template<class T>
Doub qtrap(T &func, const Doub a, const Doub b, const Doub eps=1.0e-10) {
	const Int JMAX=20;
	Doub s,olds=0.0;
	Trapzd<T> t(func,a,b);
	for (Int j=0;j<JMAX;j++) {
		s=t.next();
		if (j > 5)
			if (abs(s-olds) < eps*abs(olds) ||
				(s == 0.0 && olds == 0.0)) return s;
		olds=s;
	}
	throw("Too many steps in routine qtrap");
}
template<class T>
Doub qsimp(T &func, const Doub a, const Doub b, const Doub eps=1.0e-10) {
	const Int JMAX=20;
	Doub s,st,ost=0.0,os=0.0;
	Trapzd<T> t(func,a,b);
	for (Int j=0;j<JMAX;j++) {
		st=t.next();
		s=(4.0*st-ost)/3.0;
		if (j > 5)
			if (abs(s-os) < eps*abs(os) ||
				(s == 0.0 && os == 0.0)) return s;
		os=s;
		ost=st;
	}
	throw("Too many steps in routine qsimp");
}
template <class T>
struct Midpnt : Quadrature {
	Doub a,b,s;
	T &funk;
	Midpnt(T &funcc, const Doub aa, const Doub bb) :
		funk(funcc), a(aa), b(bb) {n=0;}
	Doub next(){
		Int it,j;
		Doub x,tnm,sum,del,ddel;
		n++;
		if (n == 1) {
			return (s=(b-a)*func(0.5*(a+b)));
		} else {
			for(it=1,j=1;j<n-1;j++) it *= 3;
			tnm=it;
			del=(b-a)/(3.0*tnm);
			ddel=del+del;
			x=a+0.5*del;
			sum=0.0;
			for (j=0;j<it;j++) {
				sum += func(x);
				x += ddel;
				sum += func(x);
				x += del;
			}
			s=(s+(b-a)*sum/tnm)/3.0;
			return s;
		}
	}
	virtual Doub func(const Doub x) {return funk(x);}
};
template <class T>
struct Midinf : Midpnt<T>{
	Doub func(const Doub x) {
		return Midpnt<T>::funk(1.0/x)/(x*x);
	}
	Midinf(T &funcc, const Doub aa, const Doub bb) :
		Midpnt<T>(funcc, aa, bb) {
		Midpnt<T>::a=1.0/bb;
		Midpnt<T>::b=1.0/aa;
	}
};
template <class T>
struct Midsql : Midpnt<T>{
	Doub aorig;
	Doub func(const Doub x) {
		return 2.0*x*Midpnt<T>::funk(aorig+x*x);
	}
	Midsql(T &funcc, const Doub aa, const Doub bb) :
		Midpnt<T>(funcc, aa, bb), aorig(aa) {
		Midpnt<T>::a=0;
		Midpnt<T>::b=sqrt(bb-aa);
	}
};
template <class T>
struct Midsqu : Midpnt<T>{
	Doub borig;
	Doub func(const Doub x) {
		return 2.0*x*Midpnt<T>::funk(borig-x*x);
	}
	Midsqu(T &funcc, const Doub aa, const Doub bb) :
		Midpnt<T>(funcc, aa, bb), borig(bb) {
		Midpnt<T>::a=0;
		Midpnt<T>::b=sqrt(bb-aa);
	}
};
template <class T>
struct Midexp : Midpnt<T>{
	Doub func(const Doub x) {
		return Midpnt<T>::funk(-log(x))/x;
	}
	Midexp(T &funcc, const Doub aa, const Doub bb) :
		Midpnt<T>(funcc, aa, bb) {
		Midpnt<T>::a=0.0;
		Midpnt<T>::b=exp(-aa);
	}
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -