自适应辛普森法 学习笔记

对于一个二次函数 f(x)=ax2+bx+c,积分得 F(x)=0xf(t)dt=a3x3+b2x2+cx+C

于是

lrf(x)dx=F(r)F(l)

=a(r3l3)3+b(r2l2)2+c(rl)+(CC)

=(rl)[a(r2+rl+l2)3+b(r+l)2+c]

=rl6(2ar2+2arl+2al2+3br+3bl+6c)

=rl6{(ar2+br+c)+(al2+bl+c)+4[a(l+r2)2+b(l+r2)+c]}

=(rl)(f(l)+4f(l+r2)+f(r))6

以上即为辛普森公式。

普通辛普森法

为了求 lrf(x)dx,可以将区间 [l,r] 分为2n个等长的区间 [gi,gi+1](i{1,2,...,2n})。设 h=rl2n,近似地计算过 (gi1,f(gi1))(gi,f(gi))(gi+1,f(gi+1)) 三点的二次函数在区间 [gi1,gi+1] 的积分。当 n 足够大时,计算结果便越接近原函数的积分。设 P(x) 为过该三点的函数,则

lrf(x)dxi=1ng2i1g2i+1P(x)dx

=h3(i=1nf(g2i1)+4f(g2i)+f(g2i+1))

=h3(f(g1)+4f(g2)+2f(g3)+4f(g4)+...+2f(g2n1)+4f(g2n)+f(g2n+1))

Code:

int n = 1e7;

double calc(double l, double r) {
    double h = (r - l) / (2 * n), res = f(l) + f(r);
    
    for (int i = 2; i < 2 * n; ++i)
        res += f(l + i * h) * (i & 1? 2: 4);
    
    return res * h / 3;
}

自适应辛普森法

考虑到当分割出的二次函数在该区间内已经足够接近原函数时,可以直接使用该积分值;而当二次函数仍不够接近时还需再分割,于是可以考虑分别用辛普森公式计算区间 [l,r][l,l+r2][l+r2,r] 的积分值,若大区间的积分值与小区间的积分值和的差足够小,则可以认为二次函数的图像在该区间内足够接近原函数的图像,并直接返回大区间的积分值。否则,递归计算两个小区间。一般还需设定一个次数,当已经递归超过该次数时才开始判断是否可以直接返回。

P4525 【模板】自适应辛普森法 1 AC Code:

#include <cstdio>
#define simpson(l, r) ((r - l) * (f(l) + f(r) + 4 * f((l + r) / 2)) / 6)
#define f(x) (double(c * (x) + d) / (a * (x) + b))
#define abs(x) ((x) >= 0? (x): -(x))

using namespace std;

double a, b, c, d, L, R;

double calc(double l, double r, int step, double sps) {
    double mid = (l + r) / 2;
    double fl = simpson(l, mid), fr = simpson(mid, r);
    
    if (abs(fl + fr - sps) <= 1e-6 && step < 0)
        return sps;
    else
        return calc(l, mid, step - 1, fl) + calc(mid, r, step - 1, fr);
}

int main() {
    scanf("%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &L, &R);
    printf("%lf", calc(L, R, 12, simpson(L, R)));
    
    return 0;
}
posted @   wf715  阅读(47)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示