算法学习:插值型求积公式

2023-11-09

算法学习:插值型求积公式

牛顿-柯斯特(Newton-Cotes)求积公式

定义

牛顿-柯斯特(Newton-Cotes)求积公式是插值型求积公式特殊形式
在插值求积公式

baf(x)dxbaP(x)dx=k=0nAkf(xk) ∫ a b f ( x ) d x ≈ ∫ a b P ( x ) d x = ∑ k = 0 n A k f ( x k )

中所取节点是等距时称为牛顿-柯斯特公式
其中插值多项式

P(x)=k=0nk(x)f(xk) P ( x ) = ∑ k = 0 n ℓ k ( x ) f ( x k )

求积系数

Ak=bak(x)dx A k = ∫ a b ℓ k ( x ) d x

这里 k(x) ℓ k ( x ) 指的是插值基函数,即有

Ak=bak(x)dx=baj=0,jknxxjxkxjdx A k = ∫ a b ℓ k ( x ) d x = ∫ a b ∏ j = 0 , j ≠ k n x − x j x k − x j d x

推导

[a,b] [ a , b ] 区间内设置等距的插值基点 a=x0<x1<xn=b a = x 0 < x 1 ⋯ < x n = b ,设节点步长为 h=ban,xk=a+kh,k{0,1,,n} h = b − a n , x k = a + k h , k ∈ { 0 , 1 , ⋯ , n }
积分作变量替换 x=a+th x = a + t h
xkxj=(kj)h,xxj=(tj)h,dx=hdt x k − x j = ( k − j ) h , x − x j = ( t − j ) h , d x = h d t
(xkx0)(xkxk1)(xkxk+1)(xkxn) ( x k − x 0 ) ⋯ ( x k − x k − 1 ) ( x k − x k + 1 ) ⋯ ( x k − x n )
=k(k1)1(1)(2)((nk))hn=(1)nkk!(nk)!hn = k ( k − 1 ) ⋯ 1 ( − 1 ) ( − 2 ) ⋯ ( − ( n − k ) ) h n = ( − 1 ) n − k k ! ( n − k ) ! h n
(xx0)(xxk1)(xxk+1)(xxn) ( x − x 0 ) ⋯ ( x − x k − 1 ) ( x − x k + 1 ) ⋯ ( x − x n )
=t(t1)(tk+1)(tk1)(tn)hn = t ( t − 1 ) ⋯ ( t − k + 1 ) ( t − k − 1 ) ⋯ ( t − n ) h n
x=a x = a 时, t=0 t = 0 ,当 x=b x = b 时, t=n t = n
于是有 Ak=bak(x)dx=hn0t(t1)(tk+1)(tk1)(tn)(1)nkk!(nk)!dt A k = ∫ a b ℓ k ( x ) d x = h ∫ 0 n t ( t − 1 ) ⋯ ( t − k + 1 ) ( t − k − 1 ) ⋯ ( t − n ) ( − 1 ) n − k k ! ( n − k ) ! d t
=h(1)nkk!(nk)!n0t(t1)(tk+1)(tk1)(tn)dt = h ⋅ ( − 1 ) n − k k ! ( n − k ) ! ∫ 0 n t ( t − 1 ) ⋯ ( t − k + 1 ) ( t − k − 1 ) ⋯ ( t − n ) d t
=nh(1)nkk!(nk)!nn0t(t1)(tk+1)(tk1)(tn)dt = n h ⋅ ( − 1 ) n − k k ! ( n − k ) ! n ∫ 0 n t ( t − 1 ) ⋯ ( t − k + 1 ) ( t − k − 1 ) ⋯ ( t − n ) d t
=(ba)(1)nkk!(nk)!nn0t(t1)(tk+1)(tk1)(tn)dt = ( b − a ) ⋅ ( − 1 ) n − k k ! ( n − k ) ! n ∫ 0 n t ( t − 1 ) ⋯ ( t − k + 1 ) ( t − k − 1 ) ⋯ ( t − n ) d t
=(ba)(1)nkk!(nk)!nn0j=0,jkn(tj)dt = ( b − a ) ⋅ ( − 1 ) n − k k ! ( n − k ) ! n ∫ 0 n ∏ j = 0 , j ≠ k n ( t − j ) d t
不难发现,式子中的 (1)nkk!(nk)!nn0j=0,jkn(tj)dt ( − 1 ) n − k k ! ( n − k ) ! n ∫ 0 n ∏ j = 0 , j ≠ k n ( t − j ) d t 与步长h无关,所以可以预处理。我们将上述表达式称之为柯斯特求积系数,记为

c(n)k=(1)nkk!(nk)!nn0j=0,jkn(tj)dt c k ( n ) = ( − 1 ) n − k k ! ( n − k ) ! n ∫ 0 n ∏ j = 0 , j ≠ k n ( t − j ) d t

那么我们的求积系数

Ak=(ba)c(n)k A k = ( b − a ) c k ( n )

于是求得牛顿-柯斯特公式

baf(x)dx(ba)k=0nc(n)kf(xk) ∫ a b f ( x ) d x ≈ ( b − a ) ∑ k = 0 n c k ( n ) f ( x k )

上面你就当我装了一波逼,其实闷声背公式也是可以滴

公式应用:梯形公式

梯形公式

我们将上述式子令n=1,得到柯斯特系数
c(1)0=10(t1)dt=12 c 0 ( 1 ) = − ∫ 0 1 ( t − 1 ) d t = 1 2
c(1)1=10tdt=12 c 1 ( 1 ) = − ∫ 0 1 t d t = 1 2
于是得到梯形公式

I1(f)=(ba)12f(a)+f(ba)12f(b) I 1 ( f ) = ( b − a ) 1 2 f ( a ) + f ( b − a ) 1 2 f ( b )

梯形公式具有一次代数精确度(就是没什么卵用)

辛普森积分

辛普森积分在立体几何中的公式应用

在立体几何中,辛普森积分用来计算拟柱体体积公式

公式内容

设拟柱体的高(两底面 α,β α , β 间的距离)为H,如果用平行于底面的平面γ去截该图形,所得到的截面面积是平面 γ γ 与平面 α α 之间距离h的不超过3次的函数,那么该拟柱体的体积V为

V=H(S1+4S2+S3)6 V = H ( S 1 + 4 S 2 + S 3 ) 6

式中, S1 S 1 S2 S 2 是两底面的面积, S0 S 0 是中截面的面积

公式证明

V=f(x)dx V = ∫ f ( x ) d x
=ah44+bh33+ch22+dh = a h 4 4 + b h 3 3 + c h 2 2 + d h
利用公式计算体积,可以得到:
V=H(S1+4S2+S3)6 V = H ( S 1 + 4 S 2 + S 3 ) 6
=h(f(0)+4f(h2)+f(h))/6 = h ( f ( 0 ) + 4 f ( h 2 ) + f ( h ) ) / 6
=16h[d+4(ah38+bh24+ch2+d)+(ah3+bh2+ch+d)] = 1 6 h [ d + 4 ( a h 3 8 + b h 2 4 + c h 2 + d ) + ( a h 3 + b h 2 + c h + d ) ]
=ah44+bh33+ch22+dh = a h 4 4 + b h 3 3 + c h 2 2 + d h
于是原命题得证

辛普森积分拟合目标函数

根据牛顿-柯斯特求积公式,令n=2,带入得到柯斯特系数
c(2)0=1420(t1)(t2)dt=16 c 0 ( 2 ) = 1 4 ∫ 0 2 ( t − 1 ) ( t − 2 ) d t = 1 6
c(2)1=1220t(t2)dt=46 c 1 ( 2 ) = − 1 2 ∫ 0 2 t ( t − 2 ) d t = 4 6
c(2)2=1420t(t1)dt=16 c 2 ( 2 ) = 1 4 ∫ 0 2 t ( t − 1 ) d t = 1 6
于是有

I2(f)=(ba)(16f(a)+46f(a+b2)+16f(b)) I 2 ( f ) = ( b − a ) ( 1 6 f ( a ) + 4 6 f ( a + b 2 ) + 1 6 f ( b ) )
=16(ba)(f(a)+4f(a+b2)+f(b)) = 1 6 ( b − a ) ( f ( a ) + 4 f ( a + b 2 ) + f ( b ) )

这就是辛普森积分公式,说明了辛普森积分公式就是牛顿-柯斯特求积公式的特殊情况。
辛普森积分具有良好的稳定性与收敛性,在数值逼近领域有很重要的应用。

自适应辛普森积分算法
引例

bzoj2178圆的面积并

算法流程

辛普森积分不论具有多么优秀的稳定性与收敛性,在大数据范围内仍会出现较大误差。因此自适应辛普森积分算法是辛普森积分的衍生算法。其基本步骤如下

  1. 对于区间[l,r]上的函数求出其辛普森积分的答案ans
  2. 分别求出区间[l,m],[m,r]两个子区间的辛普森积分的答案之和ret
  3. 若ans和ret的误差范围不超过eps,返回ret的值,否则递归左右子区间。
    在对于圆滑曲线的近似积分中,自适应辛普森积分具有非常优秀的表现。
引例分析

对于平面上的圆的面积并,我们首先排除内含的所有圆,然后建立函数模型f(a)表示在圆所覆盖直线x=a的线段长度。那么就有
ans=xmaxxminf(x) a n s = ∫ x m i n x m a x f ( x )
函数无法直接求出,于是我们采用自适应辛普森积分法即可。
(ps:这题卡精度,小心为妙)

代码
/**************************************************************
    Problem: 2178
    User: 2014lvzelong
    Language: C++
    Result: Accepted
    Time:4412 ms
    Memory:1340 kb
****************************************************************/

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<string>
using namespace std;
const int N = 1101;
const double eps = 1e-6;
int read() {
    char ch = getchar(); int x = 0, f = 1;
    while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) - '0' + ch; ch = getchar();}
    return x * f;
}
struct C{
    int x, y, r;
    C(int xx = 0, int yy = 0, int rr = 0) : x(xx), y(yy), r(rr) {}
    C operator - (C &a) {return C(x - a.x, y - a.y);}
    int operator ^ (C &a) {return x * a.x + y * a.y;}
}c[N];
int n, st, ed, tot, L, R;
bool del[N];
struct Li{double l, r;}p[N];
int sqr(double x) {return x * x;}
int sqr(C a) {return a ^ a;}
bool cmp1(C a, C b) {return a.r < b.r;}
bool cmp2(C a, C b) {return a.x - a.r < b.x - b.r;}
bool cmp3(Li a, Li b) {return a.l < b.l;}
void Del() {
    sort(c + 1, c + n + 1, cmp1);
    for(int i = 1;i <= n; ++i)
        for(int j = i + 1;j <= n; ++j) 
            if(sqr(c[i] - c[j]) <= sqr(c[j].r - c[i].r))
                {del[i] = true; break;}
    int top = 0;
    for(int i = 1;i <= n; ++i) if(!del[i]) c[++top] = c[i];
    n = top;
    sort(c + 1, c + n + 1, cmp2);
}

double F(double x) {
    double ret = 0; tot = 0;
    for(int i = 1;i <= n; ++i) 
    if(fabs(c[i].x - x) <= c[i].r - eps) {
        double dis = sqrt(sqr(c[i].r) - (x - c[i].x) * (x - c[i].x));
        p[++tot].l = c[i].y - dis; p[tot].r = c[i].y + dis;
    }
    if(!tot) return 0;
    sort(p + 1, p + tot + 1, cmp3);
    double h = -2200;
    for(int i = 1;i <= tot; ++i) {
        if(p[i].l > h) ret += p[i].r - p[i].l, h = p[i].r;
        else if(p[i].r > h) ret += p[i].r - h, h = p[i].r;
    }
    return ret;
}

double calc(double l, double r) {return (r - l) / 6 * (F(l) + 4 * F((l + r) / 2.0) + F(r)) ;}
double Simpson(double l, double r) {
    double m = (l + r) / 2.0, s1 = calc(l, m) + calc(m, r), s2 = calc(l, r);
    if(fabs(s1 - s2) < eps) return s1;
    else return Simpson(l, m) + Simpson(m, r);
}

int main() {
    n = read();
    for(int i = 1;i <= n; ++i) {
        c[i].x = read(); c[i].y = read(); c[i].r = read();
        L = min(L, c[i].x - c[i].r); R = max(R, c[i].x + c[i].r);
    }
    Del();
    printf("%.3lf\n", Simpson(-2000.0, 2000.0));
    return 0;
}
/*
3
0 0 1
1 0 1
0 1 1
*/

小结

对于插值型求积公式,在信息学中主要应用自适应辛普森积分算法。此算法的优点在于好写易懂,并有一定的精确度。但是对于某些“二分精度”题,还是小心为妙。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法学习:插值型求积公式 的相关文章

  • 关于详解Java的对象创建

    前言 在 还不清楚怎样面向对象 和 面向对象再探究 两篇文章中 都介绍了关于面向对象程序设计的概念和特点 其中也涉及到了许多代码 比如 Dog dog new Dog 这篇文章就主要来谈谈创建对象时的具体操作 2 引入例子 下面是一个Dog
  • 洛谷 P5710 数的性质

    题目描述 一些数字可能拥有以下的性质 性质 1 是偶数 性质 2 大于 4 且不大于 12 小A 喜欢这两个性质同时成立的数字 Uim 喜欢这至少符合其中一种性质的数字 八尾勇喜欢刚好有符合其中一个性质的数字 正妹喜欢不符合这两个性质的数字
  • VR开发——Unity中导入常用的VR开发插件及简单使用

    VR开发 Unity中导入VIVE的VR开发插件及简单使用 V客学院 今天我们来讲解如何进行简单的htc vive设备的软体开发 今天的教程主要讲解从插件的导入到基本的设置以及场景搭建 小白向 首先 我们需要进入Unity中的AssetsS
  • MySQL explain 、explain extended用法

    explain显示了mysql如何使用索引来处理select语句以及连接表 可以帮助选择更好的索引和写出更优化的查询语句 使用方法 在select语句前加上explain就可以了 如 explain select from statuses
  • Unity基础之Vuforia

    Vuforia官网 https developer vuforia com Vuforia Agumented Reality SDK Vuforia增强现实扩展工具包 所属公司 高通 支持平台 Android IOS UWP 支持设备 前
  • 基于langChain 的privateGPT 文档问答 研究

    参考 gihtub代码 https github com imartinez privateGPT 官网 privateGPT可以在断网的情况下 借助GPT和文档进行交互 有利于保护数据隐私 privateGPT可以有四个用处 1 增强知识
  • [nodejs]解决mysql和连接池(pool)自动断开问题

    最近在做一个个人项目 数据库尝试使用了mongodb sqlite和mysql 分享一下关于mysql的连接池用法 项目部署于appfog 项目中我使用连接池链接数据库 本地测试一切正常 上线以后 经过几次请求两个数据接口总是报503 一直
  • stm32_acs712电流采集计算思路

    Acs712数据手册地址 https item szlcsc com 45473 html 需要测量的参数 0 实际电流值 ACS712 A 1 acs712供电电压 Vin 2 ACS 输出电压 712 OUT V 3 ACS 输出电压
  • ps命令查看具体进程的所有线程

    ps p PID t
  • 【Java数据结构】——详解优先级队列-(堆)

    文章目录 一 堆的概念 二 向下调整 1 建初堆 2 建堆 三 优先级队列 1 什么是优先队列 2 入队列 3 出队列 4 返回队首元素 5 堆的其他TopK问题 总结 一 堆的概念 堆的定义 n个元素的序列 k1 k2 kn 称之为堆 当
  • Hyperledger Fabric架构详解

    Fabric是一个模块化和可扩展的开源系统 用于部署和操作许可的区块链 也是Linux基金会 www hyperledger org 主持的Hyperledger项目之一 Hyperledger Fabric是一个较为典型的联盟链结构 1
  • Kubernetes 映射外部服务到集群内部的场景

    0x04 Kubernetes 映射外部服务到集群内部的场景 场景 1 集群外的数据库映射到集群内部 IP地址 描述 如果您在 Kubernetes 内部和外部分别运行一些服务应用 此时应用如果分别依赖集群内部和外部应用时 通过采用将集群外
  • 游标循环loop,while和for的性能比较

    利用游标循环取大量数据时 性能显得十分重要 现在对三种循环进行一下性能的比较 一 测试环境配置 硬件 HP笔记本 intel core TM 2 主频2 0GHz 3G内存 win7操作系统 工具 PL SQL 数据库 oracle 我的数
  • 深入浅出python系列(三):逻辑判断语句

    深入浅出python系列 深入浅出python系列 一 基本数据类型 深入浅出python系列 二 运算符 版权申明 未经博主同意 谢绝转载 请尊重原创 博主保留追究权 本博客的内容来自于 深入浅出python系列 三 逻辑判断语句 学习
  • 如何基于 Git 设计合理的多人开发模式

    本文转自 Java高性能架构 一个企业级项目是由多人合作完成的 不同开发者在本地开发完代码之后 可能提交到同一个代码仓库 同一个开发者也可能同时开发几个功能特性 这种多人合作开发 多功能并行开发的特性如果处理不好 就会带来诸如丢失代码 合错
  • 信安大佬真的用kali吗?

    Kali只是现在网络安全和kali比较火的一个操作系统 下面我为大家讲讲kali系统都有那些优点 Kali介绍Kali Linux是基于Debian的Linux发行版 设计用于数字取证操作系统 面向专业的渗透测试和安全审计 集成化 预装超过
  • 【Linux】2、systemd、journalctl 超详细介绍

    文章目录 一 背景 二 系统管理 2 1 systemctl 2 1 1 State degraded 2 2 systemd analyze 2 3 hostnamectl 2 4 localectl 2 5 timedatectl 2
  • 微信小程序项目实战-电影票订票系统的毕业设计(附源码+论文)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 微信小程序毕业设计 精彩专栏推荐 安卓app毕业设计 Java毕业设计 电影票订票小程序软件 java 演示 源码下载地址 https download csdn net d
  • 电工学习笔记——示波器交直流耦合的区别

    一 概述 示波器的输入耦合方式的意思是输入信号的传输方式 耦合是指两个或两个以上的电路元件或电网络等的输入与输出之间存在紧密配合与相互影响 并通过相互作用从一侧向另一侧传输能量的现象 示波器的输入耦合属于信号直接耦合 一般有两种方式 分别是

随机推荐

  • spark报错:The current account does not have the permission of database

    异常信息 22 01 18 20 21 34 main WARN HiveSessionCatalog The current account does not have the permission of database adm It
  • 关于软件产品化的几点思考【转】

    关于软件产品化的几点思考 转自 汉捷咨询 国内很多软件企业尤其是行业软件企业是从开发一 二个软件项目起家的 而且项目规模和复杂度也不大 依赖其中一两个高手 他们能够在客户适度满意的状态下成功完成项目 基于以往研究 成功的主要因素是项目具备以
  • 各种语言的简写代码

    中文 zh CN 英语 en 中文 繁体 zh TW 越南语 vi 阿尔巴尼亚语 sq 阿拉伯语 ar 阿塞拜疆语 az 爱尔兰语 ga 爱沙尼亚语 et 白俄罗斯语 be 保加利亚语 bg 冰岛语 is 波兰语 pl 波斯语 fa 布尔文
  • Matlab - Solidworks 机器人建模(6)——使用rigidBodyTree构建机器人模型

    前言 本文适用对象 没有机器人的Solidworks模型自己又懒得画的童鞋 没有机器人URDF模型的童鞋 如果你在Matlab帮助里面搜索rigidBody 你大概率会看到matlab自带的例程 链接在这里 教你怎么用rigidBody建立
  • 腾讯会议——录制的视频如何正常观看(转为MP4格式)

    1 打开腾讯会议 2 点击历史会议 3 点击你录制的会议 4 点击录制详情 5 点击转码 完成这5步 即可将所保存的视频转为MP4格式 便于观看
  • 游戏开发unity插件Cinemachine系列:制作摄像机沿路径移动的动画

    可以参看 https blog csdn net zhenghongzhi6 article details 104885429
  • 初级软件测试工程师需要具备那些知识与技能

    哈喽 大家好 今天我们来聊聊如何成为一名初级软件测试工程师 需要必备那些知识和技能 什么是软件测试 软件测试的经典定义是 在规定的条件下对程序进行操作 以发现程序错误 衡量软件品质 并对其是否能满足设计要求进行评估的过程 软件测试的现实定义
  • iOS安全之ipa 包重签名的3种方法

    重签名的意义 ipa 重签名最大的用处是 不必重新打包 和配置其它第三方获取 appkey 等操作 直接重签名之后依然可以拥有这些功能 更快的发布测试或者灰度版本 方法一 终端命令 sigh resign 1 明白两个东西 想要重签名的证书
  • Unity笔记--Canvas渲染

    参考 五 UGUI源码分析之Rebuild 布局重建 图形重绘 网格重建 网格重建大体包括布局重建和图形重建两部分 canvas更新过程可分为布局 渲染两部分 共六阶段 public enum CanvasUpdate Prelayout
  • C++类和对象——引用作为函数形参

    问题 1 如果函数的形参为普通函数 那么调用函数时形参对象会被构造 函数调用结束形参对象还需要被销毁 2 为了避免形参对象这种 临时对象 的创建 我们可以将形参设计成引用 着重理解下边的代码 include
  • 牛客网--HJ1 字符串最后一个单词的长度

    文章目录 前言 一 题目内容和牛客网的链接 二 话不多说 引入代码 1 引入库 2 读入数据 总结 前言 题目的分析 一 题目内容和牛客网的链接 牛客网题目链接 二 话不多说 引入代码 1 引入库 代码如下 示例 include
  • Origin常见问题

    1 在绘图时 常常移动一个图 其他的图也跟着缩放 这是由于图层关联导致 取消即可 如下 图中所示 默认是图层2关联到了图层1 所以取消关联就可以了
  • C语言数组指针和指针数组实例演示

    一 数组指针 1 简介 数组指针就是指向数组的指针 定义方式 int p len NULL 示例 include
  • 使用RabbitMQ实现延时队列

    之前公司是一个类电商公司 会有用户下单后未支付取消订单的场景 解决方案是使用RabbitMQ的死信队列来实现一个延时队列 下单时 将订单丢进消息队列 设置过期时间 订单失效时间 然后到时候检查订单状态 如果未支付则取消订单 1 什么是死信
  • 【LeetCode】345. 反转字符串中的元音字母

    题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 示例 1 输入 s hello 输出 holle 示例 2 输入 s leetcode 输出 leotc
  • odoo连接器-odoo数据拉取,Java xml-rpc实现

    背景 odoo数据拉取 创建 更新 参考 官方external api文档 External API Odoo 14 0 文档 术语 ORM odoo数据以对象模型呈现 支持one2many many2one many2many等对象关联关
  • FSDataOutputStream 的深入分析

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 在这里插入代码片 Hadoop对于写操作提供了一个类 F
  • 刷脸支付服务商重金之下必有勇夫

    为了吸引消费者使用刷脸支付 而非扫码 支付宝和微信会给消费者提供优惠 比如在店里面使用刷脸会有随机立减 打折活动 而扫码则没有 这只是给消费者的补贴 以利益吸引商家与推广人员加入刷脸支付同样重要 显然 与二维码支付的几乎没有成本不同 刷脸支
  • C++全局变量的声明和定义

    参考 http wrchen blog sohu com 71617539 html 1 编译单元 模块 在VC或VS上编写完代码 点击编译按钮准备生成exe文件时 编译器做了两步工作 第一步 将每个 cpp c 和相应的 h文件编译成ob
  • 算法学习:插值型求积公式

    算法学习 插值型求积公式 牛顿 柯斯特 Newton Cotes 求积公式 定义 牛顿 柯斯特 Newton Cotes 求积公式是插值型求积公式的特殊形式 在插值求积公式 baf x dx baP x dx k 0nAkf xk a b