近似方法

时间:2010-01-07 14:39:24

标签: math approximation

我附图: alt text
(来源:piccy.info

因此,在此图像中,有一个函数图,它是在给定点上定义的。 例如,在点x = 1..N。

另一张图,绘制为半透明曲线, 这就是我想从原始图中得到的, 即我想近似原始功能,使其变得平滑。

有没有办法做到这一点?

我听说过最小二乘法,可用于通过直线或抛物线函数逼近函数。但我不需要用抛物线函数来近似。 我可能需要通过三角函数来近似它。 那么有没有办法做到这一点? 还有一个想法,如果我们可以推导出三角函数,可以使用最小二乘法来解决这个问题吗?

还有一个问题! 如果我使用离散傅立叶变换并将函数视为波的总和,那么噪声可能具有我们可以定义它的特殊特征,然后我们可以将相应的频率设置为零,然后执行逆傅里叶变换。 因此,如果您认为有可能,那么您可以建议什么来识别噪声的频率?

5 个答案:

答案 0 :(得分:8)

不幸的是,这里提出的许多解决方案都没有解决问题和/或它们是完全错误的。 有许多方法,它们专门用于解决您必须注意的条件和要求!

a)近似理论:如果你有一个非常清晰的定义函数而没有错误(由定义或数据给出)并且你想要尽可能准确地追踪它,你正在使用 Chebyshev或Legendre多项式的多项式或有理逼近,意味着你 通过多项式或者如果是周期性的傅里叶级数来处理函数。

b)插值:如果你有一个函数,其中给出了一些点(但不是整个曲线!)并且你需要一个函数来完成这些点,你可以使用几种方法:

牛顿 - 格雷戈里,牛顿,分歧差异,拉格朗日,埃尔米特,样条

c)曲线拟合:您有一个具有给定点的函数,并且您希望绘制具有给定(!)函数的曲线,该曲线尽可能接近曲线。有线性的 和非线性算法。

您的图纸暗示:

  • 它不像数学函数那样遥远。
  • 数据或功能没有明确定义
  • 你需要适应曲线,而不是一些点。

你想要什么,需要什么

d)平滑:给定带有噪声或快速变化元素的曲线或数据点,您只希望看到随时间变化的缓慢变化。

你可以像雅各布所说的那样用黄土做到这一点(但我发现这有点过分,特别是因为 选择合理的跨度需要一些经验)。对于你的问题,我只是建议 Jim C建议的平均运行平均值。

http://en.wikipedia.org/wiki/Running_average

对不起,cdonner和Orendorff,你的建议很有道理,但完全错了,因为你正在使用正确的工具来解决错误的问题。

这些人使用第六个多项式来拟合气候数据并完全淹没自己。

http://scienceblogs.com/deltoid/2009/01/the_australians_war_on_science_32.php

http://network.nationalpost.com/np/blogs/fullcomment/archive/2008/10/20/lorne-gunter-thirty-years-of-warmer-temperatures-go-poof.aspx

答案 1 :(得分:3)

loess(免费)中使用R

E.g。这里loess函数近似于嘈杂的正弦曲线。

sine
(来源:stowers-institute.org

如您所见,您可以使用span

调整曲线的平滑度

以下是here的一些示例R代码:

  

分步程序

     

让我们采取正弦曲线,添加一些   “噪音”到它,然后看怎么样   loess“span”参数影响   看起来平滑的曲线。

     
      
  1. 创建正弦曲线并添加一些噪音:

         

    周期&lt; - 120 x < - 1:120 y&lt; -   罪(2 * pi * x /句号)+   runif(长度(X), - 1,1)

  2.   
  3. 在这条嘈杂的正弦曲线上绘制点:

         

    plot(x,y,main =“Sine Curve +   '统一'噪音“)mtext(”显示   黄土平滑(局部回归   平滑)“)

  4.   
  5. 使用默认范围值0.75:

    应用黄土平滑      

    y.loess&lt; - 黄土(y~x,span = 0.75,   data.frame(x = x,y = y))

  6.   
  7. 计算曲线上所有点的黄土平滑值:

         

    y.predict&lt; - predict(y.loess,   data.frame(X = X))

  8.   
  9. 绘制黄土平滑曲线以及已经存在的点   绘制:

         

    线(X,y.predict)

  10.   

答案 2 :(得分:2)

您可以使用像FIR滤镜这样的数字滤镜。最简单的FIR滤波器只是一个运行平均值。对于更复杂的治疗,看起来像FFT。

答案 3 :(得分:2)

这称为曲线拟合。执行此操作的最佳方法是找到可以为您执行此操作的数字库。这是一个显示how to do this using scipy的页面。该页面上的图片显示了代码的作用:

graph showing two noisy data sets and two best-fit sine curves http://www.scipy.org/Cookbook/FittingData?action=AttachFile&do=get&target=datafit.png

现在它只有4行代码,但作者根本没有解释它。我将在这里简要解释一下。

首先,你必须决定你想要答案的形式。在这个例子中,作者想要一个形式的曲线

  

f(x) = p 0 cos(2π/ p 1 x + p 2 )+ p 3 x

您可能需要多条曲线的总和。没关系;公式是求解器的输入。

然后,该示例的目标是通过 p 3 找到常量 p 0 完成公式。 scipy可以找到这四个常量的数组。您只需要一个错误函数,scipy可以使用它来查看其猜测与实际采样数据点的接近程度。

fitfunc = lambda p, x: p[0]*cos(2*pi/p[1]*x+p[2]) + p[3]*x # Target function
errfunc = lambda p: fitfunc(p, Tx) - tX # Distance to the target function

errfunc只接受一个参数:长度为4的数组。它将这些常量插入公式并计算候选曲线上的值数组,然后减去采样数据点tX的数组。结果是一组错误值;大概scipy将取这些值的平方和。

然后只是进行一些初步的猜测,并scipy.optimize.leastsq收集数字,试图找到一组参数 p ,其中错误被最小化。

p0 = [-15., 0.8, 0., -1.] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:])

结果p1是一个包含四个常量的数组。如果解算器实际找到了解,那么success是1,2,3或4。 (如果errfunc足够疯狂,求解器可能会失败。)

答案 4 :(得分:1)

这看起来像多项式近似。您可以在Excel中使用多项式(“添加趋势线”到图表,选择“多项式”,然后将顺序增加到您需要的近似值)。找到一个算法/代码应该不难。 Excel也可以显示它为近似提出的等式。