如何在数学上区分Mathematica 中的列表而不首先将其与数学表达式相匹配(即使用FindFit
)?
具体来说,我想在列表中找到最大斜率点。
我考虑使用Differences
并找到最大差异,但数据中的噪音会导致不准确。使用MovingAverage
平滑数据也无济于事。
提前致谢。
答案 0 :(得分:6)
您可以尝试使用高斯内核ListConvolve
来平滑数据。其中一个很好的特性是带有高斯内核的卷积的派生等同于卷积和衍生< / strong>高斯核。
以下是一些示例数据:
data = Table[Sin[x] + .5 RandomReal[{-1, 1}], {x, 0, 6 \[Pi], .05}];
ListLinePlot[data]
这是一个带高斯内核的简单卷积:
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]
使用高斯的一阶导数进行卷积:
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]
您可能希望使用sigma参数来查看在您的情况下获得最佳结果的内容。
这背后的整个理论称为Scale Space。请注意,上面关于卷积的声明适用于连续空间。 For a discrete implementation, the kernel could be chosen somewhat better.
进一步注意,就像MovingAverage一样,卷积可以移动数据的功能。