优化 Mathematica 中的插值

rco*_*yer 2 optimization interpolation wolfram-mathematica

作为我工作的一部分,我经常需要可视化复杂的 3 维密度。我使用的一个程序套件将密度的径向分量输出为对数网格上的一组 781 个点,ri = (Rmax/Rstep)^((i-1)/(pts-1)乘以球谐函数。对于低对称性系统,球谐函数的数量可以相当大以确保精度,例如,一个系统需要对应于 的 49 个谐波lmax = 6。因此,要在 Mathematica 中使用这些数据,我需要计算最多 49 个插值函数的总和,每个函数都乘以不同的球谐函数。在使用 v.6 并使用Interpolation和 设置构建插值径向函数时r = Sqrt(x^2 + y^2 + z^2),我会 ContourPlot3D在一个多小时后停止,没有任何显示。这包括将InterpolationOrder和 都减少MaxRecursion到 1。

出现了几种替代方案:

  1. 评估固定网格上的密度函数,ListContourPlot然后使用。
  2. 或者,对径向函数进行线性样条并用于Piecewise将它们缝合在一起。(这本身就出现了,因为我可以使用简化来帮助降低结果函数的复杂性。)

我最终使用了两者,因为InterpolatingFunction它的评估有明显的延迟,并且有多达 49 个插值函数需要评估,任何延迟都会变得明显。另外,ContourPlot3D样条线速度更快,但它没有给我带来我想要的速度。

我坦白承认,我没有Interpolation在 v.7 上尝试过,也没有在升级后的硬件(G4 v. Intel Core i5)上尝试过。然而,我正在寻找当前方案的替代方案;最好是我可以ContourPlot3D直接使用的。我可以尝试其他形式的样条曲线,例如B-spline,并可能将其与 结合起来UnitBox而不是使用Piecewise.

编辑:为了澄清,我当前的实现涉及为每个径向部分创建一阶样条,将每个样条乘以各自的球谐函数,对Simplify每个径向间隔上的方程求和并进行求和,然后使用Piecewise将它们绑定到一个函数中。因此,我的实现是半解析的,因为球谐函数是精确的,并且只有径向部分是数值的。这是我希望能够使用 的部分原因ContourPlot3D,以便我可以利用数据的半分析性质。值得注意的是,径向网格足够精细,可以生成径向部分的良好表示,并且可以平滑地进行插值。虽然这给了我显着的加速,但当我编写代码时,对于我当时使用的硬件来说,速度仍然很慢。

因此,ContourPlot3D我不会使用 ,而是首先生成函数,如上所述,然后在 80 3笛卡尔网格上对其进行评估。我在 中使用的就是这一步的数据ListContourPlot3D。由于这不是自适应网格,因此在某些地方这太当然了,而且我缺少功能。

Jan*_*nus 5

如果你可以不用 Mathematica,我建议你看一下Paraview(美国政府资助的 FOSS,所有平台),我发现它在可视化大量数据方面优于一切。该软件的核心是“可视化工具包” VTK,如果需要,您可以找到/编写其他前端。

VTK/Paraview 可以处理几乎任何数据类型:结构化网格上的标量和向量或随机点、多边形、时间序列数据等。在 Mathematica 中,我经常将网格数据转储为 VTK 旧格式,在最简单的情况,它看起来像这样

# 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> ...
Run Code Online (Sandbox Code Playgroud)

哈!