首页 > 编程知识 正文

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

时间:2023-05-06 14:51:25 阅读:268381 作者:2419

附上一道水(模板)题

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);}*/

 

转载于:https://www.cnblogs.com/cgjh/p/9419103.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。