计算几何_求面积_辛普森积分公式

附上一道水(模板)题

https://vjudge.net/problem/HDU-1724

和一道我认为卡精度要命的题(当然 是用这个方法被卡得要命的...)   

https://vjudge.net/problem/HDU-5858

 

/* %.17f的答案

附上 HDU-5858的答案   : 0.29276251905757444

/*
----3-----
0.29139233981798940
0.29256905497842256
0.29269850120464480
0.29275620952824744
0.29276135677808401
0.29276230281685778
0.29276248841316299
0.29276251530238584
0.29276251829065014
0.29276251894032201
0.29276251904563999
0.29276251905757444
0.29276251906022166
0.29276251906063600
0.29276251906068307
*/

*/

 

const double eps = 1e-18; // 精度 

double fx(double x) {
    // ToDo: 这儿填充自己的公式.   关于x轴区间[a, b]的公式
    // 注意: 如果求的是多个区域, 但是端点一致.那么可以一起放到fx中计算. 
//    eg: 曲线 y=2*x 与x轴的面积. (是积分求面积的 所以有正负.) 
//  return 2 * x; 
}

// 辛森普公式 
// 原理采用一条抛物线 不断二分逼近原曲线,即真实值.  
// 曲线是: Ax^2 + Bx + C 
// 这是计算过程.  AutoFix 是自适应求解的过程 时间复杂度和求解的eps精度有很大的关系. 
// 也就是说, 如果精度要求不是很高的水题可以用 辛森普公式 sososo 嗖嗖嗖嗖 
double XPS_GX(double left, double right) { return (fx(left) + 4.0 * fx((left + right) / 2.0) + fx(right) ) / 6.0 * (right - left); }


// 两种写法 
// @left , right [left, right]
// @val   ----> result
// @jeps  ----> 迭代后更新的精度. 原理我不知道. 
double AutoFix(double left, double right, double val, double jeps) {
    double mid = (left + right) / 2.0;
    double lval = XPS_GX(left, mid), rval = XPS_GX(mid, right);
    if (fabs(val - lval - rval) <= 15.0 * jeps) return lval + rval + (lval + rval - val) / 15.0; // 再减去 DeTa 减少误差
    return AutoFix(left, mid, lval, jeps / 2.0) + AutoFix(mid, right, rval, jeps / 2.0); // 迭代  jeps / 2.0 貌似会提高精度 原理不知道. 
}
/* 
double AutoFix(double left, double right, double val) {
    double mid = (left + right) / 2.0;
    double lval = XPS_GX(left, mid), rval = XPS_GX(mid, right);
    if (fabs(val - lval - rval) <= eps) return val;
    return AutoFix(left, mid, lval) + AutoFix(mid, right, rval);
}
*/ 

 

posted @ 2018-08-04 16:51  过路人1998  阅读(606)  评论(0编辑  收藏  举报