自适应辛普森法

自适应辛普森法通过Simpson公式,用二次函数来拟合,实现时用二分递归来自动控制区间分割的大小,既保证精度,又保证速度

Simpson公式推导

abf(x)dx

abAx2+Bx+C

=A3(b3a3)+B2(b2a2)+C(ba)

=(ba)6(2Ab2+2Aab+2Aa2+3Bb+3Ba+6C)

=(ba)6(Aa2+Ba+C+Ab2+Bb+C+4A(a+b2)2+4B(a+b2)+4C)

=(ba)6(f(a)+f(b)+4f(a+b2))

lrcx+dax+bdx

code:

double f(double x) { return (c*x+d)/(a*x+b); } double simpson(double l,double r) { double mid=(l+r)/2; return (r-l)*(f(l)+f(r)+4*f(mid))/6; } double solve(double l,double r,double eps) { double mid=(l+r)/2; double a=simpson(l,mid),b=simpson(mid,r),m=simpson(l,r); if(fabs(a+b-m)<=15*eps) return a+b+(a+b-m)/15; return solve(l,mid,eps/2)+solve(mid,r,eps/2); }

月下柠檬树:求一个图形的面积

code:

double f(double x) { double y=0; for(int i=1;i<n;++i) if(x>=h[i]-r[i]&&x<=h[i]+r[i]) y=max(y,sqrt(r[i]*r[i]-(h[i]-x)*(h[i]-x))); for(int i=1;i<n;++i) if(x>=p[i].l&&x<=p[i].r) y=max(y,p[i].k*x+p[i].b); return y; } double simpson(double l,double r) { double mid=(l+r)/2; return (r-l)*(f(l)+f(r)+4*f(mid))/6; } double solve(double l,double r,double eps) { double mid=(l+r)/2; double a=simpson(l,mid),b=simpson(mid,r),m=simpson(l,r); if(fabs(a+b-m)<=15*eps) return a+b+(a+b-m)/15; return solve(l,mid,eps/2)+solve(mid,r,eps/2); }

__EOF__

本文作者lhm_
本文链接https://www.cnblogs.com/lhm-/p/12229789.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
posted @   lhm_liu  阅读(674)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示