自适应辛普森(算法简要 + 模板)

简述:

对于普通的二次函数有f(x)=ax2+bx+cf(x) = ax ^ 2 + bx + cf(x)=ax2+bx+c,原函数F(x)=ax33+bx22+cxF(x) = \frac{a x^3}{3} + \frac{bx ^2}{2} + cxF(x)=3ax3+2bx2+cx


⎰lrf(x)=F(r)−F(l)=a3(r−l)3+b2(r−l)2+c(r−l)=(r−l)6(2a(l2+r2+lr)+3b(l+r)+c)=(r−l)6((al2+bl+c)+(ar2+br+c)+4(a((l+r)2)2+b(l+r)2+c))=(r−l)6(f(l)+f(r)+4f((l+r)2))\lmoustache_{l} ^{r} f(x) = F(r) - F(l) \\ = \frac{a}{3}(r - l) ^3 + \frac{b}{2} (r - l) ^2 + c(r - l)\\ = \frac{(r - l)}{6} (2a(l ^ 2 + r ^2 + lr) + 3b(l + r) + c)\\ = \frac{(r - l)}{6} ((al ^2 + bl + c) +( a r ^ 2 + br + c) + 4(a(\frac{(l + r)}{2}) ^ 2 + b\frac{(l + r)}{2} + c))\\ = \frac{(r - l)}{6} (f(l) + f(r) + 4f(\frac{(l + r)}{2}))\\ lrf(x)=F(r)F(l)=3a(rl)3+2b(rl)2+c(rl)=6(rl)(2a(l2+r2+lr)+3b(l+r)+c)=6(rl)((al2+bl+c)+(ar2+br+c)+4(a(2(l+r))2+b2(l+r)+c))=6(rl)(f(l)+f(r)+4f(2(l+r)))
这是普通的辛普森推导,自适应辛普森就是在普通的辛普森上加了一个评估步骤,我们通过把一个区间二分,如果这个区间整体求得的值与一半加一半单独求得的值是较为接近的这个时候我们就可以认为我们已经求得正确答案。

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

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;
const double eps = 1e-6;double a, b, c, d, l, r;double f(double x) {return (c * x + d) / (a * x + b);
}double sim(double l, double r) {return (r - l) * (f(l) + f(r) + 4.0 * f((l + r) / 2.0)) / 6.0;
}double asr(double l, double r, double eps, double ans) {double mid = (l + r) / 2;double ansl = sim(l, mid), ansr = sim(mid, r);if(fabs(ansl + ansr - ans) < 15 * eps) return ansl + ansr + (ansl + ansr - ans) / 15.0;return asr(l, mid, eps / 2.0, ansl) + asr(mid, r, eps / 2.0, ansr);
}int main() {// freopen("in.txt", "r", stdin);   // freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &l, &r);printf("%.6f\n", asr(l, r, eps, sim(l, r)));return 0;
}

Ellipse

显然有y=b×1−(xa)2y = b \times \sqrt{1 - (\frac{x}{a}) ^2}y=b×1(ax)2,所以只要简单的带入求解即可。

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;
const double eps = 1e-7;const int N = 1e3 + 10, mod = 6;double a, b, l, r;double f(double x) {return 2 * b * (sqrt(1 - (x * x) / (a * a)));
}double sim(double l, double r) {return (r - l) * (f(l) + f(r) + 4.0 * f((l + r) / 2.0)) / 6.0;
}double asr(double l, double r, double eps, double ans) {double mid = (l + r) / 2;double ansl = sim(l, mid), ansr = sim(mid, r);if(fabs(ansl + ansr - ans) < eps) return ansl + ansr;return asr(l, mid, eps / 2.0, ansl) + asr(mid, r, eps / 2.0, ansr);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T; scanf("%d", &T);while(T--) {scanf("%lf %lf %lf %lf", &a, &b, &l, &r);printf("%.3f\n", asr(l, r, 1e-5, sim(l, r)));}return 0;
}

The area

两个函数积分求差,也就是分别算出两个积分,然后相减即可。

对于二次函数的式子,这里直接用了拉格朗日插值来求了,没去推导公式。

对于一次函数的式子,只要简单求解一下即可。

/*Author : lifehappy
*/
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;
const double eps = 1e-6;double x[5], y[5];double f1(double X) {double ans = 0;for(int i = 1; i <= 3; i++) {double a = 1, b = 1;for(int j = 1; j <= 3; j++) {if(i == j) continue;a *= X - x[j];b *= x[i] - x[j];}ans += y[i] * a / b;}return ans;
}double sim1(double l, double r) {return (r - l) * (f1(l) + f1(r) + f1((l + r) / 2.0) * 4.0) / 6.0;
}double asr1(double l, double r, double eps, double ans) {double mid = (l + r) / 2.0;double ansl = sim1(l, mid), ansr = sim1(mid, r);if(fabs(ansl + ansr - ans) < 15.0 * eps) return ansl + ansr + (ansl + ansr - ans) / 25.0;return asr1(l, mid, eps / 2.0, ansl) + asr1(mid, r, eps / 2.0, ansr);
}double f2(double X) {return (y[3] - y[2]) / (x[3] - x[2]) * (X - x[3]) + y[3];
}double sim2(double l, double r) {return (r - l) * (f2(l) + f2(r) + f2((l + r) / 2.0) * 4.0) / 6.0;
}double asr2(double l, double r, double eps, double ans) {double mid = (l + r) / 2;double ansl = sim2(l, mid), ansr = sim2(mid, r);if(fabs(ansl + ansr - ans) < 15.0 * eps) return ansl + ansr + (ansl + ansr - ans) / 15.0;return asr2(l, mid, eps / 2.0, ansl) + asr2(mid, r, eps / 2.0, ansr);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int T; scanf("%d", &T);while(T--) {for(int i = 1; i <= 3; i++) {scanf("%lf %lf", &x[i], &y[i]);}double ans = asr1(x[2], x[3], eps, sim1(x[2], x[3])) - asr2(x[2], x[3], eps, sim2(x[2], x[3]));printf("%.2f\n", ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3358 最长k可重区间集问题(网络流:串联思想)

P3358 最长k可重区间集问题 这是一个经典模型&#xff0c;给定n个开区间&#xff0c;选择一些区间使得每个位置被覆盖次数不超过k&#xff0c;并最大化选择的区间长度之和。 首先一个直接的想法就是每一个区间匹配了它所对应的点&#xff0c;但是我们要求选择一个区间就必须要…

对Windows桌面应用程序进行UI自动化测试

所谓UI自动化测试&#xff0c;就是模拟一个用户&#xff0c;对应用程序的UI进行操作&#xff0c;以完成特定场景的功能性集成测试。要对Windows桌面应用程序进行UI自动化测试&#xff0c;目前可选的技术主要是两种&#xff1a;VS自带的CodedUI Test和AppiumWinAppDriver。但是&…

2019年ICPC银川区域赛 Easy Problem(简单莫比乌斯函数 + 欧拉降幂)

Easy Problem ∑a11m∑a21m∑a31m⋯∑an−1m∑anm[gcd(a1,a2,a3,…,an−1,an)d](a1,a2,a3,…,an−1,an)kdkd∑a11md∑a21md∑a31md⋯∑an−1md∑anmd[gcd(a1,a2,a3,…,an−1,an)1](a1,a2,a3,…,an−1,an)kdkd∑i1mdikdμ(i)∑a11mid∑a21mid∑a31mid⋯∑an−11mid∑an1mid(∏j1…

P3357 最长k可重线段集问题(网络流/串联/拆点)

P3357 最长k可重线段集问题 对于n条开线段&#xff0c;选择一个子集使得任意xp和子集相交的直线个数小于等于k&#xff0c;并使得选择的线段长度之和最大。 这道题看上去和区间集没有什么区别&#xff0c;只是费用发生变化&#xff0c;但是要注意一个特殊情况&#xff0c;那就…

项目实战中如何使用抽象类和接口

引子&#xff1a;时常会有这么一个疑惑&#xff0c;抽象类和接口功能好像&#xff0c;真正用起来该如何抉择呢&#xff1f;&#xff1f;好问题。。来看看书上怎么说的&#xff08;C#7.0本质论&#xff09;虽然方法可在基类中声明为抽象成员&#xff0c;但是&#xff01;&#x…

番茄日志发布1.0.3版本-增加Kafka支持

番茄日志&#xff08;TomatoLog&#xff09;能做什么可能你是第一次听说TomatoLog&#xff0c;没关系&#xff0c;我可以从头告诉你&#xff0c;通过了解番茄日志&#xff0c;希望能帮助有需要的朋友&#xff0c;番茄日志处理将大大降低你采集、分析、处理日志的过程。介绍Toma…

Java String类型变量的比较问题

今天写程序的时候&#xff0c;发现了一个很奇怪的问题&#xff0c;代码如下&#xff1a; if((address.getCountry())!"国家"){ ad.insertAddress(address); //将只有国家、省份、城市三列的Address对象插入到数据库表格中 } 其中&#xff0c;我设置了断点进行调试…

P2494 [SDOI2011]保密(网络流/最小割/01分数规划)

P2494 [SDOI2011]保密 这道题是一个很综合的题目 首先有一个二分图&#xff0c;到达一个点就可以到达所有该点相连的边&#xff0c;然后需要覆盖所有边&#xff0c;然后给定一张图你从起点出发然后可以到达二分图的节点&#xff0c;保证没有环&#xff0c;每条边有时间和花费&…

B. Product(2019ICPC西安邀请赛)(杜教筛)

Product ∑i1n∑j1n∑k1ngcd⁡(i,j)[k∣gcd⁡(i,j)]∑k1n∑i1nk∑j1nkgcd⁡(ik,jk)∑k1nk∑i1nk∑j1nkgcd⁡(i,j)∑k1nk∑d1nkd∑i1nkd∑j1nkd[gcd⁡(i,j)1]∑k1nk∑d1nkd(∑i1nkd2ϕ(i)−1)Tkd∑T1n∑k∣TkTk(∑i1nT2ϕ(i)−1)∑T1nTσ0(T)(∑i1nT2ϕ(i)−1)\sum_{i 1} ^{n} …

ArangoDB 3.5发布:流事务API、蒙面数据、搜索性能大幅提升、最短路径功能

ArangoDB 3.5 发布了。ArangoDB 是一个分布式原生的多模型数据库&#xff0c;具有灵活的文档、图形和键值数据模型。使用方便的 SQL 查询语言或 JavaScript 扩展构建高性能应用程序。此版本亮点包括&#xff1a;期待已久的 Streaming Transactions API&#xff0c;可以直接使用…

Java StringBuffer相关解惑

在编程过程中遇到的StringBuffer初始化以及赋值的时候&#xff0c;遇到的问题。 StringBuffer sbnew StringBuffer(); // StringBuffer sb1new StringBuffer(1000); // System.out.println("sb capacity:"sb.capacity()); //默认容量是16&#xff0c;StringB…

P3511 [POI2010]MOS-Bridges(网络流/欧拉回路)

P3511 [POI2010]MOS-Bridges 给出一个图&#xff0c;边正着走和反着走的边权不同&#xff0c;求解最大边权最小的欧拉回路&#xff0c;输出方案。 首先看到最大边权最小我们就可以想到二分答案&#xff0c;然后现在在剩余的图上我们要判断是否存在欧拉回路&#xff0c;我们可…

Easy Math(ACM-ICPC 2018 徐州赛区网络预赛)(递归 + 杜教筛)

Easy Math 推式子 ∑i1mμ(in)∑i1mμ(indd)&#xff0c;d是n的一个质因子i,d互质项有(−∑i1mμ(ind))&#xff0c;由于减去了多余的非互质项&#xff0c;所以加上&#xff0c;−∑i1mμ(ind)∑i1mdμ(idnd)−∑i1mμ(ind)∑i1mdμ(in)\sum_{i 1} ^{m} \mu(in)\\ \sum_{i 1…

英雄会在线编程题目(请大家不吝赐教)

<span style"font-size:18px;">最近看了一道英雄会在线编程题目&#xff0c;题目的介绍如下&#xff1a;</span> <span style"font-size:18px;"></span> <span style"font-size:18px;">题目详情&#xff1a;</…

P2304 [NOI2015] 小园丁与老司机(网络流/上下界网络流)

P2304 [NOI2015] 小园丁与老司机 平面上有n个点&#xff0c;每次可以向左、右、上、左上45度、右上45度移动&#xff0c;然后直线移动到达第一个没有到过的点&#xff0c;如果没有这样的点就不能移动&#xff0c;求解一条最长路&#xff0c;然后求解将所有可能不是左右移动的道…

ASP.NET Core on K8S深入学习(7)Dashboard知多少

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。在第二篇《部署过程解析与Dashboard》中介绍了如何部署Dashboard&#xff0c;但是没有更多地介绍如何使用Dashboard&#xff0c;本文就来对Dashboard的使用进行补充。…

Convex Hull (ACM-ICPC 2018 沈阳赛区网络预赛) 存个公式

Convex Hull gay(i){0ifikxx,x>k,k>1iielse}求∑i1n∑j1igay(j)∑i1n(n−i1)gay(i)∑i1n(n−i1)μ2(i)i2因为μ2(n)∑i2∣nμ(i)&#xff0c;容斥定理显然得到有原式∑i1n(n−i1)i2∑j2∣iμ(j)(n1)∑i1n∑j2∣iμ(j)−∑i1ni3∑j2∣iμ(j)(n1)∑j1nμ(j)∑j2∣ii2−∑j1…

程序员的自我修养

一、技术类——互联网天际的摘星者 Unix环境高级编程&#xff08;第3版&#xff09; 编程珠玑 Python核心编程&#xff08;第二版&#xff09; 算法谜题 JavaScript框架设计 鸟哥的Linux私房菜 基础学习篇(第三版) 游戏机制——高级游戏设计技术 第一本Docker书 Swift …

多项式对数函数|指数函数(多项式)

多项式对数函数|指数函数 这个思路就是先求导然后再积分&#xff0c;这样就可以得到一个式子&#xff0c;对于多项式对数函数&#xff0c;我们就可以直接求解了&#xff0c;然后对于多项式指数函数还需要使用分治fft。 多项式对数&#xff1a; #include<bits/stdc.h> …

P5221 Product(反演)

P5221 Product 推式子 ∏i1n∏j1nlcm(i,j)gcd(i,j)∏i1n∏j1nijgcd(i,j)2我们考虑上面∏i1n∏j1nij∏i1nin∏j1nj∏i1ninn!n!n∏i1nin最后得到n!2n再考虑下面化简∏i1n∏j1ngcd(i,j)2∏d1nd2∑i1nd∑j1nd[gcd(i,j)1]对∑i1nd∑j1nd[gcd(i,j)1]化简∑k1ndμ(k)(nkd)2整体化简后…