Simpson&自适应Simpson

Simpson公式:
∫ l r f ( x ) d x ≈ ( r − l ) ( f ( l ) + f ( r ) + 4 f ( l + r 2 ) ) 6 \int^{r}_{l}f(x)dx\approx\frac{(r-l)(f(l)+f(r)+4f(\frac{l+r}{2}))}{6} lrf(x)dx6(rl)(f(l)+f(r)+4f(2l+r))

inline double simpson(double l, double r) {
	double mid = (l + r) / 2.0;
	return (r - l) * (f(l) + f(r) + 4.0 * f(mid)) / 6.0;
}

自适应Simpson法:
二分枚举精度,就可以了鸭!
以一道洛谷模板题为例LuoGu4525_自适应辛普森法1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
double a, b, c, d, l, r;
inline double f(double x) {
	return (c * x + d) / (a * x + b);
} 
inline double simpson(double l, double r) {
	double mid = (l + r) / 2.0;
	return (r - l) * (f(l) + f(r) + 4.0 * f(mid)) / 6.0;
}
double asr(double l, double r, double eps, double ans) {
	double mid = (l + r) / 2;
	double l_ans = simpson(l, mid), r_ans = simpson(mid, r);
	if (fabs(l_ans + r_ans - ans) <= eps * 15) return l_ans + r_ans + (l_ans + r_ans - ans) / 15;
	return asr(l, mid, eps / 2, l_ans) + asr(mid, r, eps / 2, r_ans);
}
inline double asr(double l, double r, double eps) {
	return asr(l, r, eps, simpson(l, r));
}
int main() {
	scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &c, &d, &l, &r);
	printf("%.6lf", asr(l, r, 1e-6));
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值