Optimization Mathematica中的优化插值
作为我工作的一部分,我经常不得不想象复杂的三维密度。我使用的一个程序套件将密度的径向分量输出为对数网格上781个点的集合,Optimization Mathematica中的优化插值,optimization,wolfram-mathematica,interpolation,Optimization,Wolfram Mathematica,Interpolation,作为我工作的一部分,我经常不得不想象复杂的三维密度。我使用的一个程序套件将密度的径向分量输出为对数网格上781个点的集合,ri=(Rmax/Rstep)^((I-1)/(pts-1),乘以球谐函数。对于低对称系统,球谐函数的数量可以相当大,以确保精度,例如,一个系统需要49个对应于lmax=6的谐波。因此,要在Mathematica中使用此数据,我将有多达49个插值函数的总和,每个插值函数乘以不同的s球谐函数。当使用v.6并使用插值构建插值径向函数时,设置r=Sqrt(x^2+y^2+z^2),
ri=(Rmax/Rstep)^((I-1)/(pts-1)
,乘以球谐函数。对于低对称系统,球谐函数的数量可以相当大,以确保精度,例如,一个系统需要49个对应于lmax=6
的谐波。因此,要在Mathematica中使用此数据,我将有多达49个插值函数的总和,每个插值函数乘以不同的s球谐函数。当使用v.6并使用插值构建插值径向函数时,设置r=Sqrt(x^2+y^2+z^2)
,我会在一个多小时后停止ContourPlot3D
,而不显示任何内容。这包括将插值顺序和最大递归减少到1
提出了几个备选方案:
在固定网格上计算密度函数,并改用ListContourPlot
或者,对径向函数进行线性样条,并使用分段
将它们缝合在一起。(这本身就表现出来了,因为我可以使用simplify来帮助降低结果函数的复杂性。)
我最终使用了这两种方法,因为插值函数
在计算过程中会有明显的延迟,并且有多达49个插值函数要计算,任何延迟都会变得明显。此外,轮廓曲线三维
使用样条曲线时速度更快,但它没有给我想要的速度
我可以坦率地承认,我没有在v.7上尝试过插值
,也没有在升级的硬件上尝试过(G4与Intel Core i5)。但是,我正在寻找当前方案的替代方案;最好是可以直接使用ContourPlot3D
。我可以尝试其他形式的样条曲线,例如a,并可能将其与UnitBox
相结合,而不是使用分段
编辑:为了澄清,我目前的实现包括为每个径向部分创建一个一阶样条曲线,将每个样条曲线乘以它们各自的球谐函数,求和并简化每个径向间隔上的方程,然后使用分段
将它们绑定到一个函数中校正是半解析的,因为球谐函数是精确的,只有径向部分是数值的。这就是我希望能够使用ContourPlot3D
,以便利用数据的半解析性质的部分原因。值得注意的是,径向网格足够精细,可以很好地表示径向部分的插值是生成的,可以平滑地插值。虽然这给了我一个显著的加速,但当我编写代码时,我当时使用的硬件仍然很慢
因此,我不使用ContourPlot3D
,而是首先生成函数,如上所述,然后在803笛卡尔网格上对其进行求值。这是我在ListContourPlot3D
中使用的这一步中的数据。由于这不是自适应网格,在某些地方这太容易了,而且我缺少功能。如果可以的话如果没有Mathematica,我建议你看看(美国政府资助的自由和开放源码软件,所有平台),我发现它在可视化海量数据方面优于一切。
该软件的核心是“可视化工具包”,如果需要,您可以查找/编写其他前端
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> ...
#vtk数据文件版本2.0
由mma通过VTKGRIDUMP生成
ASCII码
数据集结构化数据点
尺寸49 25 15
间距0.125 0.125 0.0625
原点8.5.0.712499999999
点_数据18375
标量RF_pondpot_1V1MHz1amu双1
查找表默认值
0.04709501616121583
0.04135197485227461
... ...
HTH!如果你可以不用Mathematica,我建议你看看(美国政府资助的自由和开放源码软件,所有平台),我发现在可视化海量数据方面,它比任何东西都优越。
该软件的核心是“可视化工具包”,如果需要,您可以查找/编写其他前端
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> ...
#vtk数据文件版本2.0
由mma通过VTKGRIDUMP生成
ASCII码
数据集结构化数据点
尺寸49 25 15
间距0.125 0.125 0.0625
原点8.5.0.712499999999
点_数据18375
标量RF_pondpot_1V1MHz1amu双1
查找表默认值
0.04709501616121583
0.04135197485227461
... ...
Hth.< /P> < P>如果真的是径向函数的插值正在减慢你的速度,你可以考虑基于你对采样点的知识来手工编码这一部分。
我用你的符号设置了一切。
lookuprvals
是一个包含100000个r
值的列表,用于查找计时
首先,将股票插值视为基准
With[{interp=Interpolation[N@Transpose@{rvals,yvals}]},
Timing[interp[lookuprvals]][[1]]]
Out[259]= 2.28466
切换到第0阶插值已经快了一个数量级(第一阶的速度几乎相同):
通过直接计算指数,我们可以得到另外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} ]