问题标签 [numerical-integration]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 仅通过数据点已知的函数的数值积分 - 首选 AS3
是否有任何库或开源函数可以近似一条线下的区域,该区域由不规则间隔获取的一些值描述?
动作脚本将是首选,但 Java 也可以正常工作。
r - 适应集成与集成的性能
我想在一维中执行数值积分,其中被积函数是向量值。integrate()
只允许标量被积函数,因此我需要多次调用它。这个cubature
包看起来很适合,但它似乎对一维积分表现很差。考虑以下示例(标量值被积函数和一维积分),
不知何故,adaptIntegrate
似乎正在使用更多的函数评估来实现类似的精度。这两种方法显然都使用了高斯-克朗罗德求积法(一维情况:15 点高斯求积法则),但?integrate
添加了“Wynn 的 Epsilon 算法”。这能解释巨大的时间差异吗?
我愿意接受有关处理向量值被积函数的替代方法的建议,例如
谢谢。
c - C中的反衍生物
我正在尝试创建实现氡变换算法的 ac 程序。我知道对于图像 f(x,y) 是 g(phi,s) 的集合,phi 是图像的随机变换,其中 g(phi,s) 定义为:
现在,我没有太多的 C 经验,我总是使用带有 Java 和 C# 的外部库来执行复杂的数学运算。我很难为 c 找到一个,我也很难创建一个函数来做到这一点,我一直在研究数值积分,但这是针对定积分的。任何帮助,将不胜感激
math - 游戏设计中的数值积分、Runge-Kutta、RK4
几乎每个游戏都倾向于使用一些游戏循环。Gafferongames 有一篇关于如何制作精心设计的游戏循环的精彩文章:http: //gafferongames.com/game-physics/fix-your-timestep/
在他的代码中,他使用integrate( state, t, deltaTime );
,我认为state
其中包含对象的位置、速度和加速度。他使用 RK4 将其从 集成t
到t+deltaTime
。
我的问题是,当您可以使用运动学方程(此处)找到精确值时,为什么要使用像 RK4 这样的数值积分技术?
这些方程在加速度恒定时起作用。您似乎很少会在一个时间步长内获得不断变化的加速度。看起来 RK4 是一种性能较低、精度较低、更复杂的解决方案。
编辑:如果你真的想的话,我认为你可以为对象添加一个“jerk”值,并且仍然可以找到加速度、速度和位移的精确表达式。
编辑2:好吧,我没有仔细阅读他的“集成基础”文章。我认为他正在模拟一个阻尼器和弹簧,这确实会在一个时间步内导致非恒定加速度。
fft - 用 FFT 对振荡函数进行傅里叶积分/傅里叶变换
f(x) = cos(x^2)
并且g(k) = pi^0.5 cos((pi*k)^2 - pi/4)
是傅里叶对。
我想g(k)
通过傅里叶积分f(x)
使用 FFT 来重现,即
近似Integrate[ f(x) * exp(2 pi * ikx), {x, -inf, inf} ]
和Sum[ fn * exp(2 pi * ik x_n), {n, 0, N-1} ] * Delta_x
然而,如果结果完全一致,则结果g(k)
仅在非常小k
的范围内一致(相同的代码适用于平滑傅里叶对,例如高斯函数)。N
我猜问题是为and选择合适的值Delta_x
。是否有任何既定的规则来选择它们?我在哪里可以找到文献中的相关主题(我已经阅读了数字食谱第 13.9 节,但它似乎没有解决我的问题)?
python - 处理 scipy.integrate.odeint 中的 KeyboardInterrupt
在对 scipy.integrate.odeint 的调用中评估导数时是否有合理的方法来处理异常?
如果在紧密循环中调用积分器,则此问题变得很重要,并且由于某种原因您需要停止执行。目前,我已经求助于转换KeyboardInterrupt
为SystemExit
异常(见下文)以使进程退出,这很好,但显然不理想。
scipy.integrate 绑定和 Fortran 代码似乎正在对 odepack.error 进行一些操作,但我不确定这些异常是否会传播到 Python 中。
c++ - 轮廓积分算法 C++
我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分。对于初学者,我想为梯形方法编写一个算法,但我有点难以理解它会是什么样子。毕竟 - 我们通常将梯形方法视为 2D 图,这里我们有 f: C -> C 所以我们说的是 4D。
最终我希望用这个算法计算残差,但是当我尝试最简单的简单 f(z) = 1/z 时,轮廓为围绕原点的半径为 1 的圆,我在 1 附近什么也得不到(这就是我应得)。这是梯形方法的代码:
在这里,'function' 只计算 f(z) = 1/z (我确信这是正确完成的),而 complexCartesian 是我的 a + bi 格式复点类:
我非常有信心这些功能中的每一个都在做它应该做的事情。(我知道复数有一个标准类,但我想我会自己写一个练习)。要实际集成,我使用以下内容:
当我只沿着实轴积分,或者当我用一个常数替换我的函数时,我得到了正确的结果。否则,我倾向于得到大约 10^(-10) 到 10^(-15) 的数字。如果您有任何建议,我将不胜感激。
谢谢。
python - Python:使用 odeint 实现阈值模型
我正在处理的问题(所示示例高度简化)似乎是一个常见问题,但我还没有找到解决方案。我有三种不同的反应,v1、v2 和 v3,定义如下:
v1:R <-> A + C;v1 = k1*(R - A*C/5000.)
v2:R <-> B + C;v2 = k2*(R - B*C/5000.)
v3:A + B -> P;v3 = k3*A*B
使用资源 R,前两个反应分别产生 A 和 C 以及 B 和 C,而第三个反应将 A 和 B 转换为产物 P(k1、k2、k3 是常数,这里它们设置为 1)。
只有当 C 超过称为 Cthr(此处:Cthr = 25)的某个阈值时才会发生第三个反应,否则 v3 为 0。因此想法是 C 积累,然后一旦达到一定浓度,就会产生产品 P。
我实现如下:
模拟的输出如下所示:http: //i50.tinypic.com/apdvkj.png
所以显然它在第一次达到阈值之前一直有效(v3 为 0,不产生 P)但之后 C 未设置为 0,我不知道为什么。
我想得到的是:C一直产生到阈值,下降到0,再次产生,下降到0等等,看起来像一个锯齿波。
P 的时间过程应该看起来像楼梯(仅在超过 Cthr 时产生)。
有谁知道我必须做什么才能将 C 设置回 0 并接收预期的输出?非常感谢!
numerical-methods - 使用 odeint 函数定义
很菜鸟的问题,所以请多多包涵。
我正在按照此处给出的示例-> http://www.codeproject.com/Articles/268589/odeint-v2-Solving-ordinary-differential-equations
特别是,我正在研究这个函数:
就我而言,R 采用一系列值(具有 100 个双精度值的向量)。
odeint 被称为:
我想为每个 R 值执行此操作。我该如何完成此操作?我对 C++/OOP 的了解有限,但我愿意学习。
谢谢你。
c# - 使用 Microsoft 解决方案基础定义目标
计划目的:整合。我正在为高维(高达 100)实现自适应正交(又名数值积分)算法。这个想法是通过使用与该点的误差估计成比例的采样密度来评估点,将体积随机分成更小的部分。早期我“老化”了一个均匀的样本,然后根据估计误差的高斯分布随机选择点。以类似于模拟退火的方式,我“降低温度”并随着时间的推移降低我的高斯标准偏差,因此低误差点最初有一个公平的机会被选择,但后来被选择为稳步下降可能性。这使程序能够偶然发现由于误差函数的缺陷而可能遗漏的尖峰。(我的算法在精神上类似于马尔可夫链蒙特卡洛积分。)
功能特点。要集成的功能是估计因自然灾害导致的多栋建筑物的保险单损失。保单功能不流畅:有免赔额、最高赔付、分层(如损失100万美元零赔付、1-200万美元100%赔付、200万美元以上零赔付)等奇数保单条款。这引入了在许多平面上没有导数的非线性行为和函数。在策略函数之上是破坏函数,它因建筑物类型和飓风强度而异,绝对不是钟形的。
问题上下文:错误函数。困难在于选择一个好的误差函数。对于每个点,我都记录了似乎对此有用的度量:函数的大小,由于先前的度量(一阶导数的代理)而改变了多少,该点占据的区域的体积(更大的体积可以更好地隐藏错误),以及与区域形状相关的几何因素。我的误差函数将是这些度量的线性组合,其中每个度量被分配不同的权重。(如果我得到不好的结果,我会考虑非线性函数。)为了帮助我完成这项工作,我决定对每个权重的各种可能值进行优化,因此微软解决方案基金会。
优化什么:错误等级。我的度量是标准化的,从零到一。随着集成的进行,这些错误值会逐渐修改,以反映函数值、更改等的最近平均值。因此,我不是试图创建一个产生实际错误值的函数,而是产生一个排序相同的数字真正的误差,即如果所有采样点都按这个估计的误差值排序,它们应该收到一个类似于如果按真正的误差排序时它们将收到的排名。
并非所有点都是平等的。我非常关心具有 #1 真实错误的点区域是否排名 #1000(反之亦然),但很少关心 #500 点是否排名 #1000。我衡量成功的标准是在算法执行的中途将多个区域的以下总和最小化:
ABS(Log2(trueErrorRank) - Log2(estimatedErrorRank))
对于 Log2,我使用了一个函数,它返回小于或等于该数字的 2 的最大幂。从这个定义,得出有用的结果。交换#1 和#2 需要一分,但交换#2 和#3 不需要任何费用。这具有将点分层为两个范围的幂的效果。在一个范围内交换的点不会添加到函数中。
我如何评价。我已经构建了一个名为Rank的类来执行此操作:
按真实错误对所有区域进行一次排名。
对于每组单独的参数化权重,它计算该区域的试验(估计)误差。
按该试验错误对区域进行排序。
计算每个区域的试验等级。
将两个等级的对数的绝对差相加,并将其称为参数化的值,因此要最小化的值。
C# 代码。完成所有这些后,我只需要一种方法来设置 Microsoft Solver Foundation 来为我找到最佳参数。语法让我难住了。这是我到目前为止的 C# 代码。在其中,您将看到对我已确定的三个问题的评论。也许你可以发现更多!任何想法如何使这项工作?
更新:我决定寻找另一个库作为后备,并找到了 DotNumerics ( http://dotnumerics.com/ )。他们的 Nelder-Mead Simplex 求解器很容易调用:
我所需要的只是将 ObjectiveFunction 实现为采用双数组的方法:
我没有针对真实数据尝试过,但我在 Excel 中创建了一个模拟来设置测试数据并对其进行评分。他们的算法得到的结果并不完美,但给出了一个很好的解决方案。