NIntegrate - 为什么在这种情况下 Mathematica 8 的速度要慢得多?

2024-04-19

我有一个 Mathematica 代码,我必须在数值上评估数千个与此类似的积分

NIntegrate[
    (Pi*Cos[(Pi*(-2*x + y))/(1 + y)] + (1 + y)*(-Sin[(2*Pi*x)/(1 + y)] + 
    Sin[(Pi*(-2*x + y))/(1 + y)]))/(E^x*(1 + y)), 
    {x, 0, 100}, {y, 0, 100}
] //AbsoluteTiming

被积函数是一个很好的绝对可积函数,没有奇点,它在一个方向上呈指数衰减,在另一个方向上衰减为 1/y^3。

The NIntegrate命令在 Mathematica 7 中运行良好,但在最新版本 8.0.4 中速度减慢了两个数量级。我认为在新版本中它试图更好地控制错误,但代价是时间的巨大增加。我是否可以使用一些设置,以便以与 Mathematica 7 中相同的速度进行计算?


ruebenko的回答和评论用户1091201 and Leonid结合起来给出正确的答案。

The Edit 1回答者ruebenko是正确的第一个答案general像这样的情况,即添加选项Method -> {"SymbolicPreprocessing", "OscillatorySelection" -> False}:

expr = (Pi*
      Cos[(Pi*(-2*x + y))/(1 + y)] + (1 + y)*(-Sin[(2*Pi*x)/(1 + y)] +
         Sin[(Pi*(-2*x + y))/(1 + y)]))/(E^x*(1 + y));

NIntegrate[expr, {x, 0, 100}, {y, 0, 100}, 
  Method -> {"SymbolicPreprocessing", 
    "OscillatorySelection" -> False}] // AbsoluteTiming

And 用户1091201的评论建议Method -> "GaussKronrodRule"接近最快的答案这个具体的问题。

我将在这个特定示例中描述 NIntegrate 中发生的情况,并在此过程中提供一些有关处理一般情况下明显相似情况的提示。

方法选择

在此示例中,NIntegrate 检查expr,得出多维“LevinRule”是该被积函数的最佳方法的结论,并应用它。然而,对于这个特定的示例,“LevinRule”比“MultiDimensionalRule”慢(尽管“LevinRule”获得了更令人满意的误差估计)。 “LevinRule”也比任何在二维上迭代的高斯型一维规则慢,例如“GaussKronrodRule”用户1091201 found.

NIntegrate 在对被积函数执行一些符号分析后做出决定。应用了多种类型的符号预处理;那个设定Method -> {"SymbolicPreprocessing", "OscillatorySelection" -> False}禁用一种类型的符号预处理。

本质上,启用“OscillatorySelection”后,NIntegrate 选择“LevinRule”。禁用“OscillatorySelection”后,NIntegrate 选择“MultiDimensionalRule”,对于该积分来说速度更快,尽管我们可能不信任基于消息 NIntegrate::slwcon 的结果,该消息表明观察到异常缓慢的收敛。

这是 Mathematica 8 与 Mathematica 7 不同的部分:Mathematica 8 在“OscillatorySelection”中添加了“LevinRule”和相关的方法选择启发式。

除了使 NIntegrate 选择不同的方法之外,禁用“OscillatorySelection”还可以节省实际符号处理所花费的时间,这在某些情况下可能很重要。

Setting Method -> "GaussKronrodRule"覆盖并跳过与方法选择相关的符号处理,而是使用二维笛卡尔积规则Method -> {"CartesianRule", Method -> {"GaussKronrodRule", "GaussKronrodRule"}}。对于这个积分来说,这恰好是一种非常快速的方法。

其他符号处理

Both ruebenko's Method -> {"SymbolicPreprocessing", "OscillatorySelection" -> False} and 用户1091201's Method -> "GaussKronrodRule"不要禁用其他形式的符号处理,这通常是一件好事。看NIntegrate 高级文档的这一部分 http://reference.wolfram.com/mathematica/tutorial/NIntegrateIntroduction.html#118305364有关可应用的符号预处理类型的列表。特别是,“SymbolicPiecewiseSubdivision”对于由于分段函数的存在而在多个点上不可解析的被积函数非常有价值。

禁用all符号处理并仅获取具有默认方法选项的默认方法,请使用Method -> {Automatic, "SymbolicProcessing" -> 0}。对于一维积分,目前相当于Method -> {"GlobalAdaptive", Method -> "GaussKronrodRule"}这些方法的所有参数都有某些默认设置(规则中的插值点数量、全局自适应策略的奇点处理类型等)。对于多维积分,目前相当于Method -> {"GlobalAdaptive", Method -> "MultidimensionalRule"},再次使用某些默认参数值。对于高维积分,将使用蒙特卡罗方法。

我不建议直接切换到Method -> {Automatic, "SymbolicProcessing" -> 0}作为 NIntegrate 的第一个优化步骤,但它在某些情况下可能很有用。

最快的方法

大约有always某种方法可以至少稍微加快数值积分的速度,有时甚至加快很多,因为有很多参数是启发式选择的,您可能会从调整中受益。 (看看不同的选项和参数“莱文规则”法 http://reference.wolfram.com/mathematica/tutorial/NIntegrateIntegrationRules.html#32844337 or the “全球适应性”战略 http://reference.wolfram.com/mathematica/tutorial/NIntegrateIntegrationStrategies.html#137878679有,包括它们的所有子方法等)

也就是说,这是我为这个特定积分找到的最快方法:

NIntegrate[(Pi*
      Cos[(Pi*(-2*x + y))/(1 + y)] + (1 + y)*(-Sin[(2*Pi*x)/(1 + y)] +
         Sin[(Pi*(-2*x + y))/(1 + y)]))/(E^x*(1 + y)), {x, 0, 
   100}, {y, 0, 100}, 
  Method -> {"GlobalAdaptive", Method -> "GaussKronrodRule", 
    "SingularityDepth" -> Infinity}] // AbsoluteTiming

(那个设定"SingularityDepth" -> Infinity禁用奇点处理转换。)

积分范围

顺便问一下,您真正​​想要的积分范围是吗?{x, 0, 100}, {y, 0, 100}, or is {x, 0, Infinity}, {y, 0, Infinity}您的应用真正所需的集成范围?

如果你确实需要{x, 0, Infinity}, {y, 0, Infinity},我建议改用它。对于无限长度的积分范围,NIntegrate 将被积函数压缩到有限范围,以几何间隔的方式有效地对其进行采样。这通常比用于有限积分范围的线性(均匀)间隔样本要高效得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NIntegrate - 为什么在这种情况下 Mathematica 8 的速度要慢得多? 的相关文章

  • 从包内加载mathematica包

    我或多或少有以下设置 在 path to my packages我有两个包裹package1 m and package2 m 每个包的概要如下 BeginPackage package1 Unprotect Names package1
  • 如何检查表达式是否包含复杂表达式?

    有没有办法检查表达式是否包含复杂表达式 虚数 文档说你无法检查表达式是否包含I因为它是如何解释的 我也尝试过ImaginaryQ expr expr Conjugate expr and Simplify expr Simplify Con
  • 模式匹配不等式

    我想从不平等的实例中提取论据 以下不起作用 知道为什么以及如何解决它吗 Inequality 1 Less x Less 2 Inequality a c e gt a c e Inequality 1 Less x Less 2 Hold
  • 在 Mathematica 中绘制数轴

    我想在 Mathematica 的数轴上绘制一个简单的区间 我该怎么做呢 为了绘制开区间或闭区间 你可以这样做 intPlot ss s e ee Graphics Red Thickness 01 Text Style ss Large
  • Mathematica 中的空值和非空值测试

    在 Mathematica 中测试某个值是否为 Null 的最佳 最干净 建议的方法是什么 并且不为空 例如 a Null b 0 f n If n Null 1 2 f a f b 结果是 1 If 0 Null 1 2 我本来期望 f
  • Mathematica 中的“upvalue”是什么意思以及何时使用它们?

    To me g f g x h x 只是详细地等价于f g x h x 你能举一个你必须使用的例子吗 实际上 g f g x h x 不等于f g x h x 后者将定义与f while and 和它的 将定义与g 这是一个至关重要的区别
  • Mathematica 中的条件数据操作

    我正在努力准备高效数据分析的最佳工具在数学中 我有大约 300 列和 100 000 行 最好的技巧是什么 删除 提取 或简单地 考虑 数据结构的部分 用于绘制例如 我能想到的最棘手的例子之一是 给定一个数据结构 对于第 2 列中的值等于
  • 对嵌套列表内的列表进行排序

    我有一个嵌套列表 9 8 7 8 7 6 7 6 5 6 5 4 5 4 3 4 3 2 3 2 1 我需要对列表中的列表进行排序才能创建 7 8 9 6 7 8 5 6 7 4 5 6 3 4 5 2 3 4 1 2 3 我该怎么做呢 你
  • 了解内核-前端通信——为什么我的前端冻结?

    EDIT 只需确认您是否可以重现此内容就会很有用 只需一台计算机即可尝试此操作 无需远程连接 Update似乎其他人无法在 Mac 或 Win7 上重现此问题 因此它要么是 WinXP 特定的 要么是我的机器特定的 此时我要放弃了 最好有一
  • $多个变量的假设

    我想将整个笔记本的变量限制在特定范围内 有没有一种方法可以一次性做到这一点 而无需为每个变量输入不同的 asstitution 行 编辑 我想定义笔记本中所有计算的变量域 谷歌搜索帮助我更好地构建我的需求 全局定义如下 Assumption
  • Mathematica 什么时候创建新符号?

    再会 我早些时候以为数学在当前符号中创建新符号 Context在转换输入字符串的阶段 即分配给InString 来输入表达式 即分配给In 但一个简单的例子打破了这一解释 In 1 f During evaluation of In 1 I
  • 在 Mathematica 中查找先前定义的消息

    Mathematica 默认定义了许多有用的消息来表示常见错误 例如使用错误数量的参数调用函数或未找到文件 一般来说 我更喜欢尽可能使用现有的 已定义的消息 因为这样可以更轻松地通过诸如Check Quiet and On Off 然而 我
  • Mathematica:为什么 3D 绘图会记住最后的视点/旋转,即使在再次评估后也是如此?

    我觉得这有点烦人 我制作了一个 3D 绘图 最初它以默认方向出现 然后 我使用鼠标以某种方式旋转它 现在我再次运行该命令 期望获得原始形状 即通过鼠标旋转它之前的原始方向 但相反 它只是给了我与屏幕上相同的绘图 即它似乎保留 记住了该输出单
  • 调整 Mathematica 中现有 Graphics 对象的样式/属性

    Mathematica 的优势之一是其一致的对象底层表示 因此 要更改绘图的属性而不重做用于生成它的计算 我可以做类似的事情 Replace myplot Graphics x List y List gt Graphics x Flatt
  • 了解跟踪*

    再会 当试图理解数学使用标准的评估顺序Trace and TraceScan最近开发的命令及其漂亮的视觉表示thread https stackoverflow com questions 5459735 the clearest way
  • Mathematica 中的输入/输出单元标签是由什么生成的以及如何向它们添加自动计时?

    当 Mathematica 计算单元格时 它会为输入单元格和输出单元格提供细胞标签 http reference wolfram com mathematica ref CellLabel htmls In Line and Out Lin
  • NDS 求解波动方程时的不稳定性

    我正在尝试使用NDSolve求解波动方程 以检查使用它是否比我的旧特征方程更容易和 或更快 方法实施 我得到了很多特征方法没有得到的不稳定性 并且由于这些是简单的方程 我想知道出了什么问题 希望不是问题的物理方面 ans Flatten N
  • 在 Mathematica 中使用图形进行渐变填充

    我如何使用以下内容创建Rectangle in Graphics Using Polygon 你可以 Graphics EdgeForm Black Polygon 0 0 3 0 3 1 0 1 VertexColors gt White
  • 在 Mathematica 中创建具有不同颜色边的图形

    我想创建一个图 图论 其中某些边具有与其他边不同的颜色 这将用于突出显示图中从一个顶点到另一个顶点的路径 以下是一些具有不同颜色边缘的示例http demonstrations wolfram com AGraphTheoryInterpr
  • R 中从右到左的运算符结合性可能吗?

    我是 R 新手 我刚刚发现我患有支架恐惧症 https mathematica stackexchange com a 17315 2266 请参阅链接中的评论 我喜欢这种方式magrittr符号 gt 有效 因为它在某些情况下避免了嵌套括

随机推荐

  • C - 将大写字母转换为小写字母

    一个非常简单的程序 我只想将 A 变成 a 但输出给了我 A include
  • 类 VS 引用结构

    我正在使用 C 编写游戏 因此 我非常关心性能 我想知道主要区别是什么 如果可能的话 使用类传递数据或通过引用传递结构的性能考虑因素 出于性能原因 我希望不要复制数据 我假设通过 ref 传递比这里通过值传递要快得多 我知道类始终通过引用传
  • MS 缺少 VSTO 4.0 运行时下载?

    我们有代码检查 VSTO 4 0 运行时是否存在并下载 如果丢失 直到今天这一切都运作良好 MS 中的 VSTO 运行时文件似乎丢失了 有人对这个有了解吗 我们能否告诉客户这是 MS 问题并且很快就会得到解决 Google 没有找到任何有关
  • Serialized 和 DataContract(不是对比?)

    我正在阅读我的新项目中的一些代码 发现前开发人员同时使用 Serialized 和 DataContract Serializable and DataContract Namespace Some Name Space IsReferen
  • iTerm2 隐藏标记

    我最近安装了 iTerm2 的 Shell Integration 但在输入 shell 命令时它还添加了那些小箭头 称为标记 这真的很烦人 有什么方法可以禁用 隐藏它们 我在网上找不到 As per 文档 https www iterm2
  • 让 IIS6 与 WordPress 完美配合

    我有一个由 WordPress 驱动的博客 我正在尝试在 IIS6 服务器上进行设置 除了令我头疼的永久链接结构之外 一切正常 在谷歌搜索 wordpress codex之后 我了解到这是因为IIS6没有相当于Apache的mod rewr
  • 如何在 Android 上注册的应用程序中从我的 WebView 中启动 Web 链接?

    在我的 Android 应用程序中 我有一个 WebView 我想every在我的 WebView 中单击链接以启动我的设备上已注册的应用程序 如果有 否则在外部浏览器中打开 例如 如果用户从 WebView 中单击 Facebook 页面
  • Ninject - 找不到资源

    我收到错误 无法找到该资源 当我尝试在我的 MVC 3 应用程序中实现 Ninject 时 该问题似乎来自 Global asax 期间CreateKernel region Inversion of Control protected o
  • Postgres - python 多个 SSL 连接

    我在使用 psycopg2 和 SSL 建立两个并发 Postgres 数据库连接 一个到主数据库 一个到从数据库 时遇到问题 两个连接分别工作 即 import psycopg2 dsnMaster dbname sslcert path
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 多个 Access-Control-Allow-Origin 标头

    作为参考 我使用的是 Visual Studio 2017 和 Windows 10 我有一个 Web api 和带有用户帐户的相应 Web 应用程序 当我尝试登录时遇到一个错误 指出不存在 Access Control Allow Ori
  • 如何使用 JavaScript 将 HTML 转换为 XHTML?

    我需要在字符串中所有图像标签的末尾添加斜杠 我正在使用 JavaScript 正则表达式 这是我到目前为止所拥有的 strInput strInput replace
  • 计算编辑距离的最有效方法

    我刚刚实现了最佳匹配文件搜索算法来查找与字典中的字符串最接近的匹配项 对我的代码进行分析后 我发现绝大多数时间都花在计算查询与可能结果之间的距离上 我目前正在实现使用二维数组计算编辑距离的算法 这使得实现成为 O n 2 操作 我希望有人能
  • 在 Gulp 中将流与事件流连接时的顺序

    在此 Gulp 任务中 vendorFiles 代码放置在 dest style css 文件中的 appFiles 代码之后 这是因为 appFiles 流运行得更快吗 如何让vendorFiles代码按预期出现在前面 gulp task
  • 从线程内更新网页

    我有一个运行冗长过程的网页 除了在页面上显示进度之外 所有这些都在工作 我有以下进度条 引导程序 div class col md 8 div
  • 如何在 WPF 中使用 MVVM 从另一个视图打开一个视图

    我是 MVVM 新手 很长一段时间以来我都无法得到这个问题的答案 不知道是问题太难还是我没有解释清楚 我有 MainWindow Xaml 其中包含一个文本块和一个用于从文本块接收数据的按钮 现在当我按下按钮时 它应该打开第二个名为 tab
  • JavaFx 如何避免创建一个巨大的控制器

    我在 JavaFX 中有一个应用程序 它有带有菜单和工具栏的主场景 以及在按下菜单按钮之一后注入到该主场景中的较小场景 现在 HomeCntroller 负责场景组件 主场景 带有工具栏和菜单 和注入场景 如果注入的场景数量超过一个 这会导
  • kotlin 中的 init 块和构造函数有什么区别?

    我已经开始学习 Kotlin 了 我想知道之间的区别init块和constructor 这之间有什么区别以及我们如何利用它来改进 class Person constructor var name String var age Int va
  • 搭建控制器时引发的调用目标已引发异常

    我创建了一个单独的类库项目来存储数据库上下文和模型类 在同一解决方案中 我创建了一个 ASP NET MVC 项目并引用了类库项目 并在项目的 Web config 文件中包含了数据库上下文的连接字符串 但是 当我尝试添加控制器 带有视图
  • NIntegrate - 为什么在这种情况下 Mathematica 8 的速度要慢得多?

    我有一个 Mathematica 代码 我必须在数值上评估数千个与此类似的积分 NIntegrate Pi Cos Pi 2 x y 1 y 1 y Sin 2 Pi x 1 y Sin Pi 2 x y 1 y E x 1 y x 0 1