0

我正在尝试通过 polyfit 和 polyval 使用多项式创建“滚动样条曲线”。

但是,我要么收到未定义“偏移”的错误……要么样条没有绘制。

我的代码如下,请提供建议或见解。我是一个polyfit newby。

import numpy as np
from matplotlib import pyplot as plt

x = np.array([ 3893.50048173,  3893.53295003,  3893.5654186 ,  3893.59788744,
        3893.63035655,  3893.66282593,  3893.69529559,  3893.72776551,
        3893.76023571,  3893.79270617,  3893.82517691,  3893.85764791,
        3893.89011919,  3893.92259074,  3893.95506256,  3893.98753465,
        3894.02000701,  3894.05247964,  3894.08495254])
y = np.array([ 0.3629712 ,  0.35187397,  0.31805825,  0.3142261 ,  0.35417492,
        0.34981215,  0.24416184,  0.17012087,  0.03218199,  0.04373861,
        0.08108644,  0.22834105,  0.34330638,  0.33380814,  0.37836754,
        0.38993407,  0.39196328,  0.42456769,  0.44078106])
e = np.array([ 0.0241567 ,  0.02450775,  0.02385632,  0.02436235,  0.02653321,
        0.03023715,  0.03012712,  0.02640219,  0.02095554,  0.020819  ,
        0.02126918,  0.02244543,  0.02372675,  0.02342232,  0.02419184,
        0.02426635,  0.02431787,  0.02472135,  0.02502038])

xk = np.array([])
yk = np.array([])

w0 = np.where((y<=(e*3))&(y>=(-e*3)))
w1 = np.where((y<=(1+e*3))&(y>=(1-e*3)))
mask = np.ones(x.size)
mask[w0] = 0
mask[w1] = 0

for i in range(0,x.size):
    if mask[i] == 0:
        if ((abs(y[i]) < abs(e[i]*3))and(abs(y[i])<(abs(y[i-1])-abs(e[i])))):
            imin = i-2
            imax = i+3
            if imin < 0:
                imin = 0
            if imax >= x.size:
                imax = x.size
            offset = np.mean(x)
            for order in range(20):
                coeff = np.polyfit(x-offset,y,order)
                model = np.polyval(coeff,x-offset)
                chisq = ((model-y)/e)**2
                chisqred = np.sum(chisq)/(x.size-order-1)
                if chisqred < 1.5:
                    break
            xt = x[i]
            yt = np.polyval(coeff,xt-offset)
    else:
        imin = i-1
        imax = i+2
        if imin < 0:
            imin = 0
        if imax >= x.size:
            imax = x.size
        offset = np.mean(x)
        for order in range(20):
            coeff = np.polyfit(x-offset,y,order)
            model = np.polyval(coeff,x-offset)
            chisq = ((model-y)/e)**2
            chisqred = np.sum(chisq)/(x.size-order-1)
            if chisqred < 1.5:
                break
        xt = x[i]
        yt = np.polyval(coeff,xt-offset)

    xk = np.append(xk,xt)
    yk = np.append(yk,yt)

#print order,chisqred
################################

plt.plot(x,y,'ro')
plt.plot(xk+offset,yk,'b-') # This is the non-plotting plot
plt.show()

################################

更新


所以我编辑了代码,删除了所有不适用于这个小数据样本的 if 条件。

我还添加了我所做的更改,这些更改允许代码绘制所需的点……但是,既然绘图是可见的,我就有了一个新问题。

该图不是代码告诉我的顺序的多项式。

在 plot 命令之前,我添加了一个打印,以显示多项式和 chisqred 的顺序,以确保它正在工作。

4

1 回答 1

0

首先,感谢您提供一个独立的样本(没有多少新手这样做)!如果您想改进您的问题,您应该从示例中删除所有调试代码,因为现在它会使代码混乱。代码很长,不是很容易解释。(至少对我来说——问题也可能在我的耳朵之间。)


让我们从头到尾展开这个问题。你得到一个空图的最接近的原因是你有空xkyk(空数组)。

这是为什么?那是因为你有 19 个点,因此你的 for 循环本质上是:

for i in range(12, 19-1-12):
    ...

从 12..6 开始没有什么可以迭代的!因此,实际上您的循环恰好运行了零次,并且没有任何内容附加到xkand yk

相同的解释解释了offset. offset如果循环从未运行过,则您的绘图命令 ( )中没有 定义xk+offset,因此NameError.


这是最简单的部分。但是,我不太了解您的代码。尤其是循环order形成 0..19 的循环看起来很奇怪,因为只会使用最后一个循环的结果。也许有什么要解决的?

(如果您在分析后仍然对代码有问题,请修复您可以解决的问题,尽可能简化代码,并编辑您的问题。然后我们可以再看看这个!)

于 2014-08-13T19:45:01.543 回答