算法学习:自适应辛普森
作者:互联网
【定义】
【定积分】
【解决问题】
在计算机中计算出定积分的值,有可能有直接的数学题,也有可能应用到其他方面
主要就是算定积分的值(摊手)
【算法分析】
实际上就是尝试得到一个
定积分 f(x)函数约等于 定积分 g(x) 函数
而令g(x)为一个二项式 Ax^2 +Bx + c ,然后我们直接对他进行定积分得到公式
这个对这个函数在区间【a,b】区间上的积分,不断细分最终会得到一个无限接近答案的值
而在题目中,往往会有最后输出的精度要求
所以我们只需要让最终的结果满足这个精度要求即可
有点问题,就是这个精度的要求最后会不会不断的累加最后输出又有问题
【题目】
【luogu 4525】
求
【代码】
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 const double eps = 1e-9; 7 double a, b, c, d, l, r; 8 double f(double x) 9 { 10 return (c*x + d) / (a*x + b); 11 } 12 double simp(double l, double r) 13 { 14 double mid = (l + r) / 2; 15 return (r - l)*(f(l) + f(r) + 4 * (f(mid))) / 6; 16 } 17 double ans(double l, double r,double ret) 18 { 19 double mid = (l + r) / 2; 20 double l1 = simp(l, mid), l2 = simp(mid, r); 21 if (l1 + l2 - ret > eps || l1+l2-ret < -eps) return ans(l, mid,l1) + ans(mid , r,l2); 22 return l1 + l2; 23 } 24 int main() 25 { 26 scanf("%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &l, &r); 27 printf("%.6f", ans(l,r,simp(l,r))); 28 }View Code
【luogu 4526】
求
【思路分析】
用数学分析函数发散时,a的情况hu
然后在用打表或者验算的方式找到,x>10之后,函数的值小于eps
可以忽略不计
【代码】
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<algorithm> 5 #include<iostream> 6 using namespace std; 7 const double eps = 1e-9; 8 double a, b, c, d, l, r; 9 double f(double x) 10 { 11 return pow(x, (a / x) - x); 12 } 13 double simp(double l, double r) 14 { 15 double mid = (l + r) / 2; 16 return (r - l)*(f(l) + f(r) + 4 * (f(mid))) / 6; 17 } 18 double ans(double l, double r,double ret) 19 { 20 double mid = (l + r) / 2; 21 double l1 = simp(l, mid), l2 = simp(mid, r); 22 if (l1 + l2 - ret > eps || l1+l2-ret < -eps) return ans(l, mid,l1) + ans(mid , r,l2); 23 return l1 + l2; 24 } 25 int main() 26 { 27 scanf("%lf", &a); 28 if (a < 0) 29 printf("orz"); 30 else 31 { 32 printf("%.5f", ans(eps, 12.0, simp(eps, 12))); 33 34 } 35 }View Code
【代码】
标签:适应,double,mid,eps,辛普森,算法,l2,l1,include 来源: https://www.cnblogs.com/rentu/p/11653506.html