自适应辛普森(算法简要 + 模板)
简述:
对于普通的二次函数有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(r−l)3+2b(r−l)2+c(r−l)=6(r−l)(2a(l2+r2+lr)+3b(l+r)+c)=6(r−l)((al2+bl+c)+(ar2+br+c)+4(a(2(l+r))2+b2(l+r)+c))=6(r−l)(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;
}
自适应辛普森(算法简要 + 模板)相关推荐
- 【算法讲10:自适应辛普森法】求平滑曲线积分近似 | 洛谷 P4526 | HDU1724 | QLU Youmu with Master spark
自适应辛普森法 参考 引入 ⌈ \lceil ⌈辛普森法求积分 ⌋ \rfloor ⌋ 原理 思考 ⌈ \lceil ⌈自适应辛普森法求积分 ⌋ \rfloor ⌋ 原理 优点 缺点 代码 例题 模板 ...
- LA3485二分+求解积分方程+辛普森算法计算积分
1 /*LA3485: 2 求解积分方程 3 关于这道题的数学模型: 4 给定抛物线长度L,抛物线函数f(x)=a(x-d)(x+d),求解 |a*d*d|的值,a>0,曲线积分函数lf(x)= ...
- 地狱飞龙(自适应辛普森积分)
地狱飞龙 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submissi ...
- [NOI2005] 月下柠檬树 (自适应辛普森积分)
题目 原题链接:点这里 总体思路–>问题转化 先将原本的柠檬树分解成为多个圆台,再单独看圆台的投影 一个圆在地面的投影,是等比例的,而一条竖线的投影长度d=htanαd=\cfrac{h}{\ ...
- 基于DCT离散余弦变换的自适应水印算法的设计
文章目录 前言 一.目的和需求分析 1.1项目设计目的 1.2项目需求分析 二.图像预处理 2.1 图像预处理的作用 2.2 Logistic混沌映射置乱 2.2 细胞自动机处理 均值滤波平滑处理 三 ...
- AC自动机算法及模板
AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报 分类: AC自动机(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...
- 从动力学角度看优化算法:自适应学习率算法
作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 在从动力学角度看优化算法SGD:一些小启示一文中,我们提出 SGD 优化算法跟常微分方程(ODE) ...
- 深度学习算法简要综述(下)
点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 124 篇文章,本文大约 3731 字,阅读大约需要 10 分钟 原文 ...
- caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf
自适应canny算法研究及其在图像边缘检测中的应用.pdf 还剩 51页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容 ...
最新文章
- 端口聚合与Trunk综合配置
- 深度学习基本概念的了解
- php study 直接显示代码_PHP获取文件大小的方法详解(附视频)
- Direct3D中设备丢失处理
- 国内 GitHub 造假黑色产业链曝光;开源开发者撤销对 ICE 禁用的决定
- 学计算机U盘内存,在U盘上设置虚拟内存
- c语言之图形编程 pdf,《C语言图形编程》.pdf
- 实验二:运算器数据通路
- c语言:“有一个已排好序的数组,要求输入一个数后,按原来的规律将它插入数组中” 的程序分析及详细代码
- Tomcat 运行 maven项目报错 com.sun.faces.config.ConfigureListener
- 华为 CISCO 交换机型号识别
- Java 截取String类型字符串截掉后两位
- UNIT文档对话机器人的训练(值班表排版在后面)
- 齐二TK6916/20/26/32系列数控落地铣镗床简介5
- 使用Qt构建ROS应用程序
- php 红宝石,红宝石-世界名贵宝石排行榜-天天排行网
- ajax图片上传插件demo,jQuery 自制上传头像插件-附带Demo实例(ajaxfileupload.js第三弹)...
- MES对接神器工业协议转换数据采集网关4GWiFi以太网通信
- MySQL:开窗函数
- 2018年重塑科技行业的15个趋势之(1-4)
热门文章
- 学前教育试题库及答案_最新《学前教育学》专科-试题库及答案资料
- 基于文本知识库的强化学习技术——Learning to Win by Reading Manuals in a Monte-Carlo Framework
- java对象引用出错_“Java有值传递和引用传递”为什么错了?
- tensorflow去掉某一维度_在Python中解压缩(取消堆栈)一个输入(占位符),在tensorflow中有一个None维度...
- 现在相亲还要体检报告了?
- 超越Linux!华为鸿蒙明年将成“第五大操作系统”,网友:何时超过iOS?
- 你真的不了解这个地球
- .net post提交后接收返回数据_Ajax提交表单的方式
- 正弦波 程序 角度传感器_激光位移传感器的原理及应用领域
- 为什么电脑不能打字_嘉兴在线丨「生活经济学」为什么笔记本电脑能在任何国家的供电标准下运作,其他大部分电器却不能?...