simpson法求积分 专题练习
【xsy1775】数值积分
题意
多组询问,求\(\int_l^r\sqrt{a(1-{x^2\over b})}dx\)
分析
double f(double x) {
return sqrt(a*(1-x*x/b));
}
double Get(double l,double r) {
return (r-l)*(f(l)+f(r)+4*f((l+r)/2))/6;
}
double Calc(double l,double r) {
double gx=Get(l,r);
double mid=(l+r)/2,gl=Get(l,mid),gr=Get(mid,r),gs=gl+gr;
if (!cmp(gx-gs))
return gs;
else {
double rl=Calc(l,mid),rr=Calc(mid,r),rs=rl+rr;
return rs;
}
}
【bzoj2178】圆的面积并
//...
int cmp(double x);
int n,flag[N];
struct Cir {
int x,y,r;
Cir(int _x=0,int _y=0,int _r=0) {
x=_x,y=_y,r=_r;
}
friend int operator < (Cir a,Cir b) {
return a.r<b.r;
}
}cir[N];
int tot;
struct Line {
double l,r;
Line(double _l=0,double _r=0) {
l=_l,r=_r;
}
friend int operator < (Line a,Line b) {
return cmp(a.l-b.l)<0;
}
}line[N];
double res;
//...
int cmp(double x) {
if (fabs(x)<EPS) return 0;
return x<0?-1:1;
}
int Contain(Cir a,Cir b) {
int dx=a.x-b.x,dy=a.y-b.y,dr=a.r-b.r;
return dx*dx+dy*dy<=dr*dr;
}
#define ld double
#define get f
#define F rep
#define p line
#define segment Line
#define eps EPS
#define a cir
#define inf 1e9
inline bool cmp2(segment a,segment b) {
return a.l<b.l;
}
inline ld get(ld x) {
int cnt=0;
F(i,1,n) if (cmp(fabs(x-a[i].x)-a[i].r)<=0) {
ld tmp=sqrt(pow(a[i].r,2)-pow(x-a[i].x,2));
if (!cmp(tmp)) continue;
p[++cnt]=(segment) {
a[i].y-tmp,a[i].y+tmp
};
}
sort(p+1,p+cnt+1,cmp2);
/*
ld h=-inf,ans=0;
F(i,1,cnt) {
if (h<p[i].l) ans+=p[i].r-p[i].l,h=p[i].r;
else if (h<p[i].r) ans+=p[i].r-h,h=p[i].r;
}
return ans;
*/
double totLen=0,mxp=MIN;
rep(i,1,cnt) {
// if (cmp(line[i].r-mxp)<=0) continue;
if (mxp<p[i].l/*cmp(line[i].l-mxp)>0*/)
totLen+=line[i].r-line[i].l,mxp=line[i].r;
else if (mxp<p[i].r/*cmp(mxp-p[i].r)<0*/)
totLen+=line[i].r-mxp,mxp=line[i].r;
// mxp=line[i].r;
}
return totLen;
}
#undef ld
#undef get
#undef F
#undef p
#undef segment
#undef eps
#undef a
#undef inf
double Get(double l,double r) {
return (r-l)*(f(l)/6+f(r)/6+f((l+r)/2)*2/3);
}
double Calc(double l,double r) {
double gx=Get(l,r);
double mid=(l+r)/2;
double gl=Get(l,mid);
double gr=Get(mid,r);
double gs=gl+gr;
if (!cmp(gx-gs))
return gs;
else {
double rl=Calc(l,mid);
double rr=Calc(mid,r);
double rs=rl+rr;
return rs;
}
}
int main(void) {
//...
sort(cir+1,cir+n+1);
rep(i,1,n) rep(j,i+1,n)
if (Contain(cir[j],cir[i])) {
flag[i]=1;
break;
}
int cur=0;
rep(i,1,n) if (!flag[i])
cir[++cur]=cir[i];
n=cur;
res=Calc(L,R);
printf("%.3lf\n",res);
//...
}
小结
对于这类求面积的问题,意味着它满足连续性,可以使用积分来求解。
【hdu1724】Ellipse
double f(double x) {
double y2=(1-pow(x,2)/pow(a,2))*pow(b,2);
if (cmp(y2)<0) return 0; else return 2*sqrt(y2);
}
double Get(double l,double r) {
return (r-l)*(f(l)+f(r)+4*f((l+r)/2))/6;
}
double Calc(double l,double r) {
double mid=(l+r)/2;
double gl=Get(l,mid);
double gr=Get(mid,r);
double gs=Get(l,r);
if (!cmp(gs-(gl+gr)))
return gl+gr;
else {
double rl=Calc(l,mid);
double rr=Calc(mid,r);
return rl+rr;
}
}
simpson法求积分 专题练习的更多相关文章
- 【编程练习】收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等
写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...
- 之前写的收集的一些c++代码片,算法排序,读文件,写日志,快速求积分等等
写日志: class LogFile { public: static LogFile &instance(); operator FILE *() const { return m_file ...
- 复化梯形求积分——用Python进行数值计算
用程序来求积分的方法有很多,这篇文章主要是有关牛顿-科特斯公式. 学过插值算法的同学最容易想到的就是用插值函数代替被积分函数来求积分,但实际上在大部分场景下这是行不通的. 插值函数一般是一个不超过n次 ...
- 自适应Simpson法与积分初步
前言 不知道为什么,今天感觉想要写一下数学的东西,然后就看了一下我还有这个模板不会,顺手写了一下. 没有学过微积分的最好还是看一下求导为好. 求导 听说很多人都不会求导,我写一下吧qwq 令\(f(x ...
- [日常摸鱼]HDU1724 Ellipse-自适应Simpson法
模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...
- [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法
关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...
- C语言实现快速排序法(分治法)
title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...
- 洛谷P4207 [NOI2005]月下柠檬树(计算几何+自适应Simpson法)
题面 传送门 题解 我还好奇自适应辛普森法干嘛用的呢--突然想起来积分的一个用处就是求曲边图形的面积-- 我们先来考虑一下这些投影是什么形状 一个圆的投影还是它自己 一个圆锥的投影是一个圆加上一个点, ...
- 在线倍增法求LCA专题
1.cojs 186. [USACO Oct08] 牧场旅行 ★★ 输入文件:pwalk.in 输出文件:pwalk.out 简单对比时间限制:1 s 内存限制:128 MB n个被自 ...
随机推荐
- rdesktop共享剪贴板的问题
使用-r clipboard:PRIMARYCLIPBOARD参数来共享剪贴板,连接到window7 但有时就不好用了,剪贴板没有同步 找到一些相关的资料 https://bugs.launchpad ...
- MySQL的create table as 与 like区别
对于MySQL的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? ? 1 create table t2 as select * fro ...
- 3173: [Tjoi2013]最长上升子序列
原题:http://www.lydsy.com/JudgeOnline/problem.php?id=3173 题解:促使我写这题的动力是,为什么百度遍地是Treap,黑人问号??? 这题可以用线段树 ...
- MVC 中301永久重定向
public class PermanentRedirectResult : ViewResult { public string Url { get; set; } public Permanent ...
- PARENT VIEW INVALIDATE
如果启动display list,parentview 调用invalidate,子view是不会是去调用onDraw的,因为直接调用displaylist了,如果parentview认为子view应 ...
- Microsoft.Crm.Setup.SrsDataConnector.RegisterServerAction 操作失败
System.Exception: Microsoft.Crm.Setup.SrsDataConnector.RegisterServerAction 操作失败. ---> System.Ty ...
- C# 利用反射
.NET基础篇——反射的奥妙 C#获取实体类属性名和值 | 遍历类对象 c#通过反射获取类上的自定义特性 C#利用反射+特性实现简单的实体映射数据库操作类
- HTTP 错误 500.23 - Internal Server Error
HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. IIS8.0详细错误 老版本WEB程序用 VS2013打开时 ...
- Error:Failed to create directory 'C:\Users\Administrator\.gradle\caches\2.8\scripts\ijinit7_5jx13p26
在导入别人库的时候同步工程时出现此错误. 解决方式:File-->>Invalidate Caches/Restart,弹出一个框,点击Invalidate and Restart按钮,等 ...
- Logstash学习-plugin安装
Usage: bin/logstash-plugin [OPTIONS] SUBCOMMAND [ARG] ... Parameters: SUBCOMMAND subcommand [ARG] .. ...