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 中的“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 列中的值等于
  • 确定一个集合是否是另一个集合的子集的有效代码

    我正在寻找一种有效的方法来确定一个集合是否是 Matlab 或 Mathematica 中另一个集合的子集 例子 集合 A 1 2 3 4 集合 B 4 3 集 C 3 4 1 集合 D 4 3 2 1 输出应该是 设置A 集合B和C属于集
  • 从稀疏定义列表中挑选无模式下值的算法

    我有以下问题 我正在开发一个随机模拟器 它随机采样系统的配置 并存储每个配置在特定时间实例被访问次数的统计数据 代码大致是这样的 f Integer Integer 0 someplace later in the code e g ind
  • 设计方法:过载与开关?

    关于封装设计的性能和可扩展性 最好是 重载 函数名称 让 Mathematica 根据模式 条件 测试以及系统对定义的排序方式来确定要使用哪个版本 或者使用 Switch 或类似命令 构建单个函数来直接求值 Mathematica 的表达能
  • 在mathematica中使用Input[]输入数据

    我怎样才能在这段代码中使输入命令对话框中的文本像这样 输入 1 元素 输入 2 元素 For k 1 k n k br Input Enter the i element AppendTo x br 确保您的变量匹配 您可以使用Row来构建
  • 在 MathLink 函数中检查中止?

    我刚刚发现这样的MathLink功能为LinkWrite and LinkRead有类似其内部的东西CheckAbort吸收任何中止 并且不会进一步传播它们 这可以很容易地显示为LinkRead link LinkLaunch First
  • 将符号暴露给 $ContextPath

    有多种Internal 有用的上下文函数 例如InheritedBlock https stackoverflow com questions 4198961 what is in your mathematica tool bag 568
  • 从 Mathematica 中的 Web 设置用户代理导入

    当我使用 Mathematica 连接到我的网站时 Import mysite Data 并查看我的 Apache 日志 我看到 99 XXX XXX XXX 22 May 2011 19 36 28 0200 GET HTTP 1 1 2
  • 调整 Mathematica 中现有 Graphics 对象的样式/属性

    Mathematica 的优势之一是其一致的对象底层表示 因此 要更改绘图的属性而不重做用于生成它的计算 我可以做类似的事情 Replace myplot Graphics x List y List gt Graphics x Flatt
  • 创建自定义表格表示的函数

    我使用下面的代码来概述我的部分数据 从以下代码中创建函数的最佳方法是什么 它将采用 dataList 以及一些图形选项 例如颜色 作为参数 并返回自定义的表格表示形式 如下所示 overviewtheData Text Grid Map R
  • 如何在 Mathematica 8 中并行集成

    有人知道如何使用所有核心来计算积分吗 我需要使用并行化或并行表 但如何使用 f r Sum 1 n 2 r 2 n 7 2 n n r 2 n 1 x r 2 n 1 n 0 r 2 Nw Transpose Table f j i 1 j
  • 如何将 ListPlot 的图形与 Plot 的图形结合起来?

    有没有办法将图形组合起来ListPlot到一个图形Plot 我需要在 ListPlot 的图形上绘制函数的图形 您可以将任何图形与Show函数如下 Show myListPlot myPlot 这概括为一次组合任意数量的图 Show p1
  • 在 Mathematica 中使用 f@expr 和 expr // f 得到不同的结果

    我正在玩Prefix and Postfix运算符 and 分别 我遇到了以下问题 给定以下代码 它们以完全相同的方式进行评估 Hold MatrixPlot Sort data FullForm Hold MatrixPlot Sort
  • 自定义后缀表示法,应用/函数

    我想在 Mathematica 7 中设置以下自定义符号 这种表示法本身并不是特别有用 因此请不要建议现有的替代方案 或指出这只会节省一些击键次数 我想知道是否可以以及如何完成 目前 可以进入 f 2 2 3 f a b c Out b a
  • Mathematica 中的数据缓存

    有一个非常耗时的操作在我的包中生成数据集 我想保存此数据集 并仅在我手动删除缓存文件时才让包重建它 这是我的方法作为包的一部分 myDataset Module fname data fname cached data mx If File
  • Mathematica:如何获取plot命令绘制的数据点?

    当使用 Plot 绘制函数时 我想获取由 Plot 命令绘制的数据点集 例如 如何获取以下简单示例中使用的点 t f Plot 的列表 f Sin t Plot f t 0 10 我尝试使用一种将值附加到列表的方法 如 Jerry B Ke
  • Mathematica 列表轮廓图3D

    我有表格中的数据 x y z f 我在用ListContourPlot3D但我得到的只是一个空盒子 每个方向的尺寸为 1 到 1 这是我的代码 ListContourPlot3D data5 PlotRange gt All AxesLab
  • 在 Mathematica 中创建可变长度的空格字符串

    以下 Mathematica 函数 f 创建长度为 n 的空白字符串 f n Fold StringJoin Array n 必须有无数种替代方案来创建此功能 你会怎么做呢 f n StringJoin ConstantArray n Ed
  • 如何使带有两个for循环的python代码运行得更快(有没有一种python方法可以进行Mathematica的并行化)?

    我对 python 或任何此类编程语言完全陌生 我对 Mathematica 有一些经验 我有一个数学问题 虽然 Mathematica 用她自己的 并行化 方法解决了这个问题 但在使用所有核心后 系统却变得非常疲惫 在跑步过程中我几乎无法

随机推荐

  • 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