Mathematica中列表的数值微分

时间:2011-06-28 06:27:28

标签: wolfram-mathematica

如何在数学上区分Mathematica 中的列表而不首先将其与数学表达式相匹配(即使用FindFit)?

具体来说,我想在列表中找到最大斜率点。

我考虑使用Differences并找到最大差异,但数据中的噪音会导致不准确。使用MovingAverage平滑数据也无济于事。

提前致谢。

1 个答案:

答案 0 :(得分:6)

您可以尝试使用高斯内核ListConvolve来平滑数据。其中一个很好的特性是带有高斯内核的卷积派生等同于卷积衍生< / strong>高斯核。

以下是一些示例数据:

data = Table[Sin[x] + .5 RandomReal[{-1, 1}], {x, 0, 6 \[Pi], .05}];
ListLinePlot[data]

enter image description here

这是一个带高斯内核的简单卷积:

data2 = 
  Block[{\[Sigma] = 2}, 
   ListConvolve[
    Table[1/(Sqrt[2 \[Pi]] \[Sigma]) E^(-x^2/(2 \[Sigma])), 
         {x, -2 , 2, 1/10}
    ], data, {11, 11}
   ]
  ];  
ListLinePlot[data2]

enter image description here

使用高斯的一阶导数进行卷积:

data3 = 
  Block[{\[Sigma] = 1}, 
   ListConvolve[
    Table[-((E^(-(x^2/(2 \[Sigma]))) x)/(Sqrt[2 \[Pi]] \[Sigma]^2)), 
      {x, -2 \[Sigma],2 \[Sigma], \[Sigma]/10}
    ], data, {11, 11}
   ]
  ];
ListLinePlot[data3]

enter image description here

您可能希望使用sigma参数来查看在您的情况下获得最佳结果的内容。

这背后的整个理论称为Scale Space。请注意,上面关于卷积的声明适用于连续空间。 For a discrete implementation, the kernel could be chosen somewhat better.

进一步注意,就像MovingAverage一样,卷积可以移动数据的功能。