【问题标题】:Numerical Integral of large numbers in Fortran 90Fortran 90 中大数的数值积分
【发布时间】:2013-07-25 07:08:50
【问题描述】:

所以我有以下需要在数字上执行的积分:

Int[Exp(0.5*(aCosx + bSinx + cCos2x + dSin2x))] x=0..2Pi

问题是任何给定 x 值的输出都可能非常大,e^2000,比我在双精度下处理的要大。

我没有太多运气在谷歌上搜索以下内容,你如何处理 fortran 中的大量数字,而不是高精度,我不在乎我是否知道它超过双精度,最后我会记录日志,但我只需要能够处理大量数据,直到我可以记录日志..

是否有能够处理任意大数字的集成包? Mathematica 显然可以.. 所以那里一定有 类似的东西

干杯

【问题讨论】:

    标签: fortran90 numerical largenumber


    【解决方案1】:

    这可能是一个扩展评论而不是一个答案,但无论如何......

    正如您已经观察到的,Fortran 没有配备开箱即用的功能来处理e^2000 这样的大量数字。我认为你有 3 个选择。

    1. 使用数学将您的问题简化为一个(或多个相关的)在 Fortran 编译器可以计算的数值范围内的问题。

    2. 使用 Mathematica 或其他计算机代数系统之一(例如 Maple、SAGE、Maxima)。所有这些(我认为)都可以集成到 Fortran 程序中(难度和集成程度不同)。

    3. 高精度(通常也称为任意精度多精度)算术使用库。您最喜欢的搜索引擎会为您找到其中的一些,其中一些是用 Fortran 编写的(因此易于集成),一些是用 C/C++ 或其他语言编写的(因此稍微难以集成)。您可以从Lawrence Berkeleythe GNU bignum library 开始搜索。

    4. (是的,我知道我写过您有 3 个选项,但您的问题表明您还没有准备好考虑这一点)您可以编写自己的高/任意/多精度函数。 Fortran 提供了构建此类库所需的一切,该领域已有大量工作可供学习,您可能会感兴趣。

    在实践中,在求助于计算机之前尽可能多地应用数学来解决问题通常是有意义的,这个过程不仅可以帮助解决问题,还可以指导您选择或构建程序来解决剩下的问题问题。

    【讨论】:

      【解决方案2】:

      我同意 High Peformance Mark 的观点,这里的最佳数字选择是首先使用分析来扩展或简化结果。

      我会提到,如果您确实想强制使用它,gfortran(从 4.6 开始,带有libquadmath 库)支持quadruple precision reals,selecting the appropriate kind 可以使用它。只要您的答案(以及中间结果!)不会比您所描述的大太多,这可能有效,但通常会比双精度慢得多。

      【讨论】:

        【解决方案3】:

        这需要更深入地研究您要解决的问题以及基础数学的行为。为了补充 Mark 和 Jonathan 已经提供的良好建议,请考虑将指数函数和三角函数扩展为泰勒级数并截断到所需的精度水平。

        另外,退后一步,问问你为什么要通过计算这个值来完成。举个例子,我最近不得不调试为什么我从计算流体的蒸气压以查看是否发生冷凝的属性相关性中得到奇怪的结果。我花了很长时间试图了解将温度输入相关性有什么问题,直到我意识到导致错误的情况是对蒸汽爆炸的模拟。问题不在于数字,而在于在字面爆炸期间检查冷凝的逻辑。物理上,冷凝检查没有任何意义。真正的问题是代码问了一个不必要的问题。它已经有了答案。

        我强烈推荐 Forman Acton 的 Numerical Methods That (Usually) WorkReal Computing Made Real。两者都专注于此类问题,并提出了驯服无礼计算的技术。

        【讨论】:

          猜你喜欢
          • 2019-08-28
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多