关于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 阅读详情

相关推荐

部署资源管理系统chemx

资源管理系统的部署教程

weixin_40784215的博客 822

Simpson(辛普森)积分公式

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

小歪猫 1万+

TCNOpen实现TRDP通信协议(源码编译运行测试)

概述 本文介绍了通过TCNOpen开源源码实现TRDP通信,包括源码下载,开发环境搭建,编译运行,测试。 Linux环境下编译运行TRDP (一) 下载CANOpen源码。 下载地址:https://sourceforge.net/p/tcnopen/trdp/HEAD/tree/ (二) 源码编译 下载源码解压过后,在根目录文件readme-makefile.txt有介绍源码的配置和编译方法。 在trdp/config目录下可以看到包含在linux环境下的编译配置文件LINUX_config;执行”m

fengweibo112的博客 9632

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

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

RBS的专栏 5333

【TM1640】STM32 TM1640芯片驱动程序

以下为.h文件: #ifndef __TM1640_H__ #define __TM1640_H__ #include "stm32f10x.h" #define ADDR_START1640 0XC0 #define DSP1640_DIS 0 #define DSP1640_ENB 1 /* 控制显示 ...

cxw312864660的博客 1万+

electron windows设置镜像地址环境变量报错npm error `ELECTRON_MIRROR` is not a valid npm option

如果你是在使用某个特定的脚本或配置文件,请检查该文件中是否有不正确的配置项,并进行相应的修正。确保你遵循electron的官方安装指南,并且没有包含不必要的或错误的配置选项。如果问题依然存在,可以查看npm的官方文档或者相关社区获取更多帮助。

qq_36158551的博客 3324

辛普森积分法

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

LiuXF93的博客 2万+

Redis中什么是Big Key(大key)问题?如何解决Big Key问题?

通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一

weixiaohuai的博客 3万+

辛普森积分入门讲解

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

TimeTraveller-VictoryCzt 2万+

从数据到行为的可控暴露:SAP RAP 中的 BO Projection 与 BO Interface 全面实践指南

本文系统梳理了ABAP RAP中BO Projection与BO Interface的定位与实现方式。BO Projection面向业务服务(如UI/API),通过CDS投影视图(as projection on)和行为定义裁剪字段与操作,实现差异化暴露;BO Interface则为EML代码和跨组件复用提供稳定访问层,使用transactional_interface标识。两者均遵循C_/I_命名规范,通过分层设计实现封装性、安全性和灵活性。文中结合真实案例展示了如何通过不同投影满足多角色需求,并详细说明

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 249

如何在Windows上安装Node-RED?

Node-RED 是一款基于流程的可视化编程工具,专注于物联网(IoT)和自动化应用的快速开发,其核心特点是通过拖拽节点构建数据流网络,实现低代码/无代码编程。

猿小白的博客 1171

Simpson积分

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

0ng的博客 1721

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

simpson积分公式

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

fengzhizi76506的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Simpson积分学习笔记

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

lunch__的博客 2106

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、付费专栏及课程。

余额充值