Optimization Mathematica中的优化插值

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),

作为我工作的一部分,我经常不得不想象复杂的三维密度。我使用的一个程序套件将密度的径向分量输出为对数网格上781个点的集合,
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} ]