作为我工作的一部分,我经常需要可视化复杂的三维密度。与我一起工作的一个程序套件将密度的径向分量输出为对数网格上的一组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在Mathematica中优化插值
几种替代品呈现自己:
- 评估固定网格密度函数,并使用
ListContourPlot
代替。 - 或者,线性旋转径向函数并使用
Piecewise
将它们缝合在一起。 (此提出了自己,因为我可以用简化,以帮助减少所产生的功能的复杂性。)
我结束了使用这两种,作为InterpolatingFunction
给出的评价明显的延迟,以及高达49个插补功能评估,任何延迟都会变得明显。此外,ContourPlot3D
与样条更快,但它并没有给我加速我想要的。
我会毫不犹豫地承认,我还没有尝试012.v.7,我也没有尝试过我的升级硬件(G4 v。英特尔酷睿i5)。但是,我正在寻找替代我目前的方案;最好是我可以直接使用ContourPlot3D
的地方。我可以尝试其他形式的样条,如B-spline,并可能将其与UnitBox
结合使用,而不是使用Piecewise
。
编辑:只是为了澄清,我的当前的实现包括创建用于每个径向部分的一阶样条,乘以每一个由各自的球谐,总结和Simplify
荷兰国际集团上每一径向间隔的公式,然后使用Piecewise
将它们绑定到一个函数中。所以,我的实现是半分析的,因为球谐函数是精确的,只有径向部分是数值的。这是我希望能够使用ContourPlot3D
的原因之一,以便我可以利用数据的半分析性质。作为一个注意点,径向网格足够精细,可以生成径向部分的良好表示,并且可以平滑插值。虽然这给我一个显着的提速,但是当我编写代码时,对于我当时使用的硬件来说,速度仍然很慢。
因此,我不会使用ContourPlot3D
,而是首先生成如上所述的函数,然后我将在笛卡尔网格上对其进行评估。这是我在ListContourPlot3D
中使用的这一步的数据。由于这不是一个自适应网格,在某些地方,这太过于自然,而且我缺少特征。
只是为了确保我正确理解你:每个径向函数上有781个数据点,总共有781 * 49个标量? – Janus 2010-10-26 05:51:09
您是否在'ListContourPlot'中使用'DataRange'和数据 - 否则它看起来像有一个内插层,请参阅http://stackoverflow.com/questions/2497517/mathematica-listcontourplot3d – Janus 2010-10-26 07:26:46
@Janus,是的,你阅读正确。有高达781 * 49的标量。正如我上面指出的,数据的角度部分是分析性的,只有径向部分是数字的。另外,在使用'ListContourPlot3D'之前,我已经遇到了用于'{x,y,z,f}'形式的低分辨率错误,但是在这里我生成了一个3D数组并指定了'DataRange'。此外,虽然速度较慢,但“ListContourPlot3D”中的内插层仍比“ContourPlot3D”快。 – rcollyer 2010-10-26 13:21:13