关于Simpson积分

[spoj CIRU2]关于圆面积并的思考,非simpson!! aekdycoin神犇的讲解 图一是普通求圆并的思路,复杂度O(n^2 logn) 图二是神犇给的提示,没有题解… 一开始困扰了好久,我觉得这和hzwer开的坏头有关,他在BZOJ上圆并用了simpson之后一大批同学思路都跟着“奇怪”了起来,这题simpson没试过,不过评论说会挂精度。 首先我们要理解非simpson的圆并在干什么?这个算法很神的地方在于他把圆并分成了好 阅读详情

这两天写了圆交和圆并

圆交和圆并都有非常优美的O(n^2logn)算法,AekdyCoin有讲

但是像这种求面积的题还可以用Simpson积分法

简单的说就是将一段函数积分用二次函数积分拟合

一听这种搞法就知道是乱搞……但是很多时候比较有用……

嗯……像是求圆并的话,可以这样做

将x轴某一点上各个圆并所对应的长度视为函数值,用Simpson积分拟合

圆并在x轴上某一点对应的长度比较好算


如图,蓝色的那一段就是这一点对应的函数值,那么实际上就是每个圆和直线求一次交,得到的一段线段再做一次线段覆盖

看的出来复杂度是比较高的……每求一次函数值就是O(n)

具体的拟合怎么做呢

对于一段区间(l,r)我们首先计算f(l),f(r),f(mid)

然后(l,r)对应的拟合积分就是(f(l)+f(r)+4*f(mid))*(r-l)/6

然后再分别计算(l,mid),(mid,r)的积分

如果误差<eps,认为这一段拟合正确,否则递归计算两个区间

又好想又好写~~


问题是,这样做真是乱搞的……

在做得时候要注意几个问题

一是最好确保积的这一段函数是连续的,否则极有可能出现4个峰分别在mid两边,你积出来得0的情况……

二是注意精度……如果输出要求精确到几位,你的eps最好比他高几个数量级……否则容易出错……而精度设高的代价为非常慢……

综上所述,Simpson积分法虽然不失为一个非常优秀的算法

但是由于他的种种问题,在可以想出正解或者有比他更好的算法的时候尽量少用……

优点就是适用范围广,好想好实现

如果没想出什么更好的算法就尽管用吧,总比没分好……

但是如果是ACM或者TC,CF之类的需要全部AC的慎用……或者eps精度高一点……

话说这样的考试一般不会出积分才能过的题吧……

SPOJ CIRU的代码 //此题为裸圆并

//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
//Macro
#define	rep(i,a,b)	for(int i=a,tt=b;i<=tt;++i)
#define	drep(i,a,b)	for(int i=a,tt=b;i>=tt;--i)
#define	erep(i,e,x)	for(int i=x;i;i=e[i].next)
#define	irep(i,x)	for(__typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define	read()	(strtol(ipos,&ipos,10))
#define	sqr(x)	((x)*(x))
#define	pb	push_back
#define mp	make_pair	
#define	PS	system("pause");
typedef	long long	ll;
typedef	pair<int,int>	pii;
const int oo=~0U>>1;
const double inf=1e100;
const double eps=1e-6;
string name="", in=".in", out=".out";
//Var
struct CIR
{
	double x,y,r;	
	void init(){scanf("%lf%lf%lf",&x,&y,&r);}
}o[1008],tmp[1008];
int n,st,ed;
double xl[1008],xr[1008],ans;
pair<double,double> seg[1008];
bool cmp1(const CIR &a,const CIR &b){return a.r>b.r;}
bool cmp2(const CIR &a,const CIR &b){return a.x-a.r<b.x-b.r||fabs(a.x-a.r-(b.x-b.r))<=eps&&a.x+a.r<b.x+b.r;}
bool In(int i,int j){return sqr(tmp[i].x-o[j].x)+sqr(tmp[i].y-o[j].y)<=sqr(tmp[i].r-o[j].r);}
void Init()
{
	scanf("%d",&n);
	rep(i,1,n)o[i].init();//,s[i]=i;
	sort(o+1,o+1+n,cmp1);
	int k=0,j;
	rep(i,1,n)
	{
		for(j=1;j<=k;j++)
			if(In(j,i))break;
		if(j>k)
			tmp[++k]=o[i];
	}
	n=k;
	rep(i,1,n)o[i]=tmp[i];
}
double f(double x)
{
	int tot=0,j;
	double ret=0,dis,l,r;
	rep(i,st,ed)
	{
		if(x<=xl[i]||x>=xr[i])continue;
		dis=sqrt(o[i].r-sqr(x-o[i].x));
		seg[++tot]=mp(o[i].y-dis,o[i].y+dis);
	}
	sort(seg+1,seg+1+tot);
	rep(i,1,tot)
	{
		l=seg[i].first;r=seg[i].second;
		for(j=i+1;j<=tot;j++)
			if(seg[j].first>r)break;
			else r=max(seg[j].second,r);
		ret+=r-l;i=j-1;
	}
	return ret;
}
double Calc(double s,double fl,double fr,double fmid){return (fl+fr+4*fmid)*s/6;}
double Simpson(double l,double mid,double r,double fl,double fm,double fr,double tot)
{
	double m1=(l+mid)*0.5,m2=(mid+r)*0.5;
	double fm1=f(m1),fm2=f(m2);
	double g1=Calc(mid-l,fl,fm,fm1),g2=Calc(r-mid,fm,fr,fm2);
	if(fabs(tot-g1-g2)<=eps)return g1+g2;
	return Simpson(l,m1,mid,fl,fm1,fm,g1)+Simpson(mid,m2,r,fm,fm2,fr,g2);
}
void Work()
{
	sort(o+1,o+1+n,cmp2);
	rep(i,1,n)xl[i]=o[i].x-o[i].r,xr[i]=o[i].x+o[i].r,o[i].r*=o[i].r;
	double l,r,mid,fl,fr,fm;
	int j;
	rep(i,1,n)
	{
		l=xl[i],r=xr[i];
		for(j=i+1;j<=n;j++)
			if(xl[j]>r)break;
			else r=max(xr[j],r);
		mid=(l+r)*0.5;
		st=i;ed=j-1;i=j-1;
		fl=f(l);fm=f(mid);fr=f(r);
		ans+=Simpson(l,mid,r,fl,fm,fr,Calc(r-l,fl,fr,fm));
	}
	printf("%.3lf\n",ans);
}
int main()
{
	Init();
	Work();
	return 0;
}
P.S:

bzoj上有道和这个一模一样的圆并,但是eps得设到1e-13才能AC,可见Simpson积分十分不稳定啊

P.S2:

bzoj要关了……不知道root出于什么原因……谨以此篇写的非常烂的不知道想干什么的文章纪念我的bzoj账号……

学习笔记: 自适应Simpson积分 看了一些大牛的博客,终于对自适应Simpson积分有了初步的了解。 Q:自适应Simpson积分是用来做什么的? A:用来求积分啊! Q:它和一般的微积分有什么区别? A:不能求出精确解,但是可以近似地求出不可导图像的面积。 首先是Simpson积分公式:   (感谢维基百科) 由于直接套这个公式很容易得出差得离谱的解,所以要稍加改进,使用自适应S 阅读详情

相关推荐

嵌入式开发实战:LWIP中PPP协议配置全流程(含CHAP认证避坑指南)

本文是一份嵌入式开发实战指南,详细解析了如何在STM32平台上配置LWIP协议栈中的PPP协议,实现从串口到IP网络的完整连接。内容涵盖工程搭建、源码整合、关键配置、串口驱动绑定、状态管理以及CHAP认证等核心流程,并重点提供了CHAP认证失败的排查与避坑指南,帮助开发者高效打通嵌入式设备的网络连接。

plant的博客 463

Simpson(辛普森)积分公式

而从计算机运算的角度,精度的控制可以通过设定一个能够容忍的误差作为最终的返回情况,基于二分设计出递归的计算流程,即所说的Simpson自适应算法。1.Simpson积分公式是将区间端点和区间中点三个点近似看成抛物线上对应的三个点,以二次曲线逼近的方式取代矩形或梯形积分公式,以求得定积分的数值近似解。有了 Simpson积分公式,一个自然的想法是把积分区间拆成多个小区间后求和,但是分成区间的个数和长度因积分区间和精度要求甚至被积函数而异。其中,函数F(x) 是连续函数f(x)在区间[a,b]上的原函数。

小歪猫 1万+

Unity类银河战士恶魔城学习总结(P103之前 Enemy相关 , 骷髅战士,状态机,敌人状态,)

udemy的Alex银河战士恶魔城,记录我自己的学习,代码会逐渐每一p更新,仅供参考学习。

suzh1qian的博客 1632

格林公式求圆并的面积及重心

ICPC格林公式计算圆并的面积与重心

RBS的专栏 5333

Windows下CMake的下载与安装详解

目录一、CMake介绍二、CMake的下载与安装 一、CMake介绍 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 二、CMake的下载与安装 CMake下载链接:https://cmake.org/download/。 下载最新稳定版即可(Latest Release): 下载完成后,单击“Next”按钮,在下图中勾选“I acce

Wendy的博客 8万+

最新Win10离线安装.NET Framework 3.5的方法(附离线包2022/3/22)

win10 .net framework 3.5离线安装

别告诉我有Bug 27万+

辛普森积分法

定义:辛普森法则(Simpson's rule)是一种数值积分方法,是牛顿-寇次公式的特殊形式,以二次曲线逼近的方式取代矩形或梯形积分公式,以求得定积分的数值近似解。其近似值如下: 注:辛普森法则是数值分析领域中一个非常简单好用的近似求解函数区间上的一种方法,概括起来,它是将区间端点和区间中点做对应的三个点近似看成抛物线(至于为什么是抛物线而不是直线或者三次曲线……相对于三次曲线甚至更高次肯...

LiuXF93的博客 2万+

使用ONNX Runtime在Java Web应用中部署深度学习模型

当应用场景需要集成深度学习模型进行推理时,直接在Java Web应用中集成深度学习框架可能会面临性能、兼容性等问题。为了将深度学习模型无缝集成到Java Web应用中,是一项广受认可且实用的方法。本篇文档将介绍如何将模型转换为ONNX格式,并通过ONNX Runtime Server进行部署,并通过Java Web应用调用以进行回归或预测任务。本方案的主要目标是实现以下功能:将PyTorch模型转换为ONNX格式。部署ONNX Runtime Server,加载ONNX模型并提供推理服务。

shysea2019的博客 8857

辛普森积分入门讲解

辛普森积分 引用部分 百度一下 文库 定义 辛普森积分法就是在积分区间[a,b]上去找三个点a、b和m=(a+b)/2,计算其原函数的在此处的值,然后用抛物线来拟合原函数。 正文 Simpson积分公式 用途:来求一个函数的积分的近似值,用于面积计算等精度要求不是特别苛刻的地方。 其实它就是用一个二次函数曲线不断拟合逼近原函数,然后求得原函数的近似值...

TimeTraveller-VictoryCzt 2万+

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

Windows VHD的新玩法——设置任意挂载点

vhd 挂载隐藏的虚拟分区 详细过程 分别使用CreateVirtualDisk和OpenVirtalDisk来创建和打开虚拟磁盘文件。 使用AttachVirtualDisk,必须具有管理员权限才能成功执行此步骤。 初始化设备(延时Sleep),获取附加 VHD 的 UNC 路径:\\.\PhysicalDrive# 。 使用FindFirstVolume/FindNextVolume枚举已安装的卷以查找虚拟磁盘上的卷。 使用SetVolumeMountPoint将卷挂载到文件夹或者设

圣三一 2587

Simpson积分

  几何中的求面积、体积问题,可以用积分的方法,在某个方向上用扫描线或扫描面切过图形,求被覆盖的长度或面积,然后进行积分。   对于这类问题,如果能直接求出面积、体积,或者能列出覆盖长度(面积)关于扫描线(面)的位置的函数,然后手算积分,那当然是再好不过了。但是,如果直接用解析法、公式法比较费时费力,思考难度大,而题目对精度的要求不高(比如精确到0.01,0.001),数据规模不大,可以考虑用积分的方法。   用程序进行积分,一般的方法是矩形(梯形)切割法,但精度比较差。这里用Simpson积分公式,原理.

0ng的博客 1721

Hermes Agent 常见报错排查与问题解决

Hermes Agent 常见报错排查指南 摘要 本文全面梳理了 Hermes Agent 使用过程中的10类常见报错,按阶段划分为安装期、运行期认证类、后端基础设施类和长任务执行类四大类,并提供了系统化的排查流程: 安装期问题:包括命令未找到和Python版本不兼容,主要检查PATH环境和Python版本是否符合要求 认证类问题:涉及API Key认证失败和速率限制,需要验证密钥配置和配额状态 基础设施问题:包含Docker报错、MCP连接失败和OAuth令牌过期,需检查相关服务状态 执行类问题:主要是上

简简单单Onlinezuozuo 1345

Simpson积分应用

Simpson积分公式如何应用题目分析代码 公式 F(L,R)=16(R−L)×(F(L)+F(R)+4F(Mid))F(L,R) = \frac{1}{6} (R - L)\times (F(L) + F(R) + 4F(Mid))F(L,R)=61​(R−L)×(F(L)+F(R)+4F(Mid)) 考察A=F(L,Mid)+F(Mid,R),B=F(L,R)A = F(L, Mid) + F(Mid, R),B = F(L, R)A=F(L,Mid)+F(Mid,R),B=F(L,R) 如果∣A−B∣

qq_32303495的博客 298

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

simpson积分公式

看了Simpson积分公式,惊讶于积分方法在几何问题中竟如此强大! 比如几何中的求面积、体积问题,可以用积分的方法,在某个方向上用扫描线或扫描面切过图形,求被覆盖的长度或面积,然后进行积分。 对于这类问题,如果能直接求出面积、体积,或者能列出覆盖长度(面积)关于扫描线(面)的位置的函数,然后手算积分,那当然是再好不过了。但是,如果直接用解析法、公式法比较费时费力,思考难

fengzhizi76506的博客 3万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Simpson积分学习笔记

昨天ACMACMACM模拟的时候遇到了一道SimpsonSimpsonSimpson积分相关的题 完全不知道怎么求,我们组FishmenFishmenFishmen被BymBymBym嘲讽了很久 于是今天下午结合各种资料还是看了一下 这个东西不要觉得它看上去讲什么积分很高级 实际上认真推导也不是很难 首先SimpsonSimpsonSimpson积分的式子是这个东西 积分号的下标代表...

lunch__的博客 2106

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

c++ Simpson积分

c++ Simpson积分 // // main.cpp // 5.14 01 // // Created by Shatong on 2020/5/14. // Copyright © 2020 Shatong. All rights reserved. // #include <iostream> #include <iomanip> #include <cmath> using namespace std; class Base{ public:

weixin_45700834的博客 509

Simpson 积分算法

#define PR doubletypedef PR (*FUN)(PR);                                //定义指向被积函数的指针class Integral{private: PR lower,upper;                                            //lower——积分下限;upper——积分上限 FUN int

学习并无知着 2664

[数值算法]积分算法之Simpson算法

[数值算法]积分算法之Simpson算法       Simpson算法来源于Newton-Cotes公式,是一种插值型求积算法.在高阶时数值的稳定性较差,故常用的是比较低较的几种情况.       算法的具体实现还是相当简单的:(在这里列举三阶和四阶的情况)       /*Simpson Algorithm                            Made by EmilMatt

6190

自适应Simpson积分

自适应Simpson积分目录 简介 例题 HDU 1724 BZOJ 1502 SPOJ CIRUT 简介: Simpson积分是解决一重积分问题的强大公式 由公式可以看出,我们可以通过积分上下界来近似逼近积分的值。 但具体如何实现呢?我们可以二分区间然后递归的方法来求积分。 由积分的可叠加性:∫baf(x)dx=∫caf(x)dx+∫bcf(x)dx\int^b_af(x)dx= \in

新熊君的博客 1044

积分(二)——复化Simpson(C++)

C++实现复化simpson积分

m0_50793313的博客 2738

学习笔记: 自适应Simpson积分+例题

参考bloghttps://blog.youkuaiyun.com/lunch__/article/details/82288676 https://blog.youkuaiyun.com/xyz32768/article/details/81392369 这个东西对于三次以下的函数是正确的,但是对于三次以上的函数我们可以将其近似为低次函数套用Simpson公式,这个东西学名好像叫自适应Simpson积分。 昨天AC...

c___c18的博客 2152

python数值积分_python实现数值积分的Simpson方法实例分析

本文实例讲述了python实现数值积分的Simpson方法。分享给大家供大家参考。具体如下:#coding = utf-8#simpson 法计算积分,数值积分,效果非常理想from math import *def func(x):"""定义被积分函数"""return x*sin(x)def Get_N(a,b,width):# width为步长N=int((b-a)/width + 1)if...

weixin_39998881的博客 528

自适应simpson 积分

自适应simpson 积分求在区间[a,b]内f(x)的积分

Gzbgreat的博客 764

自动变步长Simpson积分方法函数

Module mod Implicit none Real(kind=8), parameter :: a = 1.d0, b = 1.02d0 !// 积分区间 Real(kind=8), parameter :: eps = 1.d-15 !// 误差控制 Real(kind=8) :: s !// 最终积分结果 Integer :: n !// 最终分的份数 C...

chd_lkl的博客 1651
上一篇: [POI2008]Sta
下一篇: 关于曼哈顿距离下的最小生成树
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值