0

polyfit と polyval を介して多項式を使用して「ローリング スプライン」を作成しようとしています。

ただし、「オフセット」が定義されていないというエラーが発生するか、スプラインがプロットされません。

私のコードは以下のとおりです。提案や洞察を提供してください。私はポリフィット初心者です。

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 条件をすべて削除しました。

コードが目的の点をプロットできるようにする変更も追加しました...しかし、プロットが表示されるようになったので、新しい問題が発生しました。

プロットは、コードが指示する順序の多項式ではありません。

プロット コマンドの前に、多項式と chisqred の順序を表示するための出力を追加して、それが機能していることを確認しました。

4

1 に答える 1

0

まず、自己完結型のサンプルを提供していただきありがとうございます (多くの初心者はそうしません)! 質問を改善したい場合は、コードが乱雑になるため、サンプルからすべてのデバッグ コードを削除する必要があります。コードは非常に長く、自明ではありません。(少なくとも私にとっては、問題は耳の間にあるのかもしれません。)


問題を最後から解き明かしましょう。空のプロットが得られる近位の理由は、空のxkand yk(空の配列) があることです。

何故ですか?これは、ポイントが 19 あるため、for ループは基本的に次のようになるためです。

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

12..6 から繰り返すものは何もありません! したがって、実際には、ループはまったくゼロ回実行され、 and には何も追加されませxkyk

同じ説明が の問題を説明していoffsetます。ループが実行されない場合は offset、yout プロット コマンド ( xk+offset) で定義されていないため、NameError.


これは単純な部分でした。しかし、私はあなたのコードをよく理解していません。特に、order0..19 からループするループは、最後のサイクルの結果のみが使用されるため、奇妙に見えます。たぶん、修正する何かがありますか?

(この分析後もコードに問題がある場合は、可能な限り修正し、コードをできるだけ単純化し、質問を編集してください。その後、これをもう一度調べます!)

于 2014-08-13T19:45:01.543 に答える