代码之家  ›  专栏  ›  技术社区  ›  rcollyer

Mathematica中的优化插值

  •  1
  • rcollyer  · 技术社区  · 15 年前

    ri = (Rmax/Rstep)^((i-1)/(pts-1) ,乘以球谐函数。对于低对称系统,球谐波数可以相当大以确保精度,例如,一个系统需要49次谐波,对应于 lmax = 6 Interpolation 和设置 r = Sqrt(x^2 + y^2 + z^2) ContourPlot3D 一个多小时后什么也没显示出来。这包括减少 InterpolationOrder MaxRecursion 到1。

    1. 在固定网格上计算密度函数,并使用 ListContourPlot 相反。
    2. 或者,线性样条径向函数并使用 Piecewise 把它们缝在一起。(这一点很明显,因为我可以使用simplify来帮助降低结果函数的复杂性。)

    InterpolatingFunction 在其计算中给出明显的延迟,并且有多达49个插值函数进行计算,任何延迟都可以变得明显。也, 三维等高线图 花键的速度更快,但没有达到我想要的速度。

    我承认我没有试过 在v.7上,我也没有在升级后的硬件(g4v.Intel Core i5)上尝试过。不过,我正在寻找我目前计划的替代方案;最好是一个我可以使用的方案 三维等高线图 B-spline ,并可能将其与 UnitBox 而不是使用 .

    编辑: Simplify 计算每个径向间隔上的方程,然后使用 将它们绑定到一个函数中。因此,我的实现是半解析的,因为球谐函数是精确的,只有径向部分是数值的。这就是为什么我想使用 ,以便我可以利用数据的半分析性质。值得注意的是,径向网格足够精细,可以生成径向零件的良好表示,并且可以平滑地进行插值。虽然这给了我很大的提速,但当我编写代码时,对于我当时正在使用的硬件来说,速度还是要慢一些。

    所以,不用 ,我首先生成函数,如上所述,然后在80 笛卡尔网格。我用的是这一步的数据 ListContourPlot3D . 因为这不是一个自适应的网格,在某些地方这太理所当然了,我错过了功能。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Community Mohan Dere    8 年前

    如果真的是径向函数的插值减慢了速度,那么可以考虑根据对采样点的了解对该部分进行手动编码。如下所示,这将显著加速:

    lookuprvals 是十万人的名单 r

    首先,把股票插值看作一个基准

    With[{interp=Interpolation[N@Transpose@{rvals,yvals}]},
      Timing[interp[lookuprvals]][[1]]]
    Out[259]= 2.28466
    

    切换到0阶插值已经快了一个数量级(1阶几乎是相同的速度):

    With[{interp=Interpolation[N@Transpose@{rvals,yvals},InterpolationOrder->0]},
      Timing[interp[lookuprvals]][[1]]]
    Out[271]= 0.146486
    

    通过直接计算指数,我们可以得到另一个1.5个数量级:

    Module[{avg=MovingAverage[yvals,2],idxfact=N[(pts-1) /Log[Rmax/Rstep]]},
      Timing[res=Part[avg,Ceiling[idxfact Log[lookuprvals]]]][[1]]]
    Out[272]= 0.006067
    

    作为中间环节,手工做对数线性插值。这比上述解决方案慢,但仍比股票插值快得多:

    Module[{diffs=Differences[yvals],
      idxfact=N[(pts-1) /Log[Rmax/Rstep]]},
      Timing[Block[{idxraw,idxfloor,idxrel},
        idxraw=1+idxfact Log[lookuprvals];
        idxfloor=Floor[idxraw];
        idxrel=idxraw-idxfloor;
        res=Part[yvals,idxfloor]+Part[diffs,idxfloor]idxrel  
      ]][[1]]]
    Out[276]= 0.026557
    

    如果你有内存的话,我会把球谐函数和半径(甚至半径索引)缓存在整个网格上。然后展开网格缓存以便

     Sum[ interpolate[yvals[lm],gridrvals] gridylmvals[lm], {lm,lmvals} ]
    

    here .

        2
  •  4
  •   Janus    15 年前

    Paraview (美国政府资助的自由/开源软件,所有平台),我发现在可视化海量数据方面,它比任何东西都优越。 软件的核心是“可视化工具包” VTK ,如果需要,您可以找到/编写其他前端。

    VTK/Paraview几乎可以处理任何类型的数据:结构化网格上的标量和矢量,或随机点、多边形、时间序列数据等。从Mathematica我通常只将网格数据转储到VTK中 legacy format 最简单的例子是这样的

    # vtk DataFile Version 2.0
    Generated by mma via vtkGridDump
    
    ASCII
    
    DATASET STRUCTURED_POINTS
    DIMENSIONS 49 25 15
    SPACING 0.125 0.125 0.0625
    ORIGIN 8.5 5. 0.7124999999999999
    
    POINT_DATA 18375
    SCALARS  RF_pondpot_1V1MHz1amu  double 1
    LOOKUP_TABLE default
    
    0.04709501616121583
    0.04135197485227461
    ... <18373 more numbers> ...
    

    推荐文章