3

さまざまな高さ(Velocity Azimuth Display)で風の方向と速度を推定するために、いくつかの水平風データをコサインカーブに合わせようとしていますが、私は> 1の値でそうしようとすると、カーブが平坦すぎるように見え、フィットの出力が予想よりも低くなります。私はIDLの組み込みを使用して同様のcurvefitを行った大きな値でカーブにフィッティングするとscipy curve_fitが失敗する

パイソンCurveFit

:[1、0、0.13705066]プロット取り付け:coeffs出力された状態で

import numpy as np 
import scipy.optimize as sc 

azimuth = np.full((8), 60) #All values = 60 deg. 
velocity = [5.6261001,6.6962662,3.9316666,-0.88413334,-5.4323335,-6.5153003,-3.2538002,1.0269333] 
#Function that defines curve that data will be fitted to 
def cos_Wave(x,a, b, c): 
    return a * np.cos(x-b) + c 

azimuthData = np.deg2rad(azimuth) 
coeffs, matcov = sc.curve_fit(cos_Wave, azimuthData, velocity, p0 = (1,0,0) 

plt.scatter(azimuthData, velocity) 
plt.plot(azimuthData, cos_Wave(azimuthData, *coeffs)) 
plt.show() 
print(coeffs) 

curvefit関数を使用し、[7.0348234,0.59962606,0.079354301]を生成し、適切なフィットを提供するより現実的な値を受け取りました。このような理由がありますか?私はそれが最初の推定値(P0)と何らかの関係があると想定していますが、IDL実装での最初の初期推定値を利用することで、さらに合理的な結果が得られます。

+0

'方位= [0:8]'有効なPythonではありませんが。質問のコードを簡略化しようとしているのかもしれませんが、それは良い方法ではありません。理想的には、コードはコピーして実行できるものです。 –

+0

申し訳ありませんが、修正済み – bgoudeau

+0

修正する必要があります。 'curve_fit'への呼び出しを含む行に、閉じ括弧がありません。もっと重要なのは、 'azimuth'(したがって' azimuthData')はすべて同じ値を含む配列です。これらがあなたのデータの* x *座標であれば、もちろん 'curve_fit'は動作しません。しかし、私はこのコードはあなたが示すプロットを生成したコードではないと思います。コードを修正して、質問に含めるコードがあなたの質問に関するコードであることを確認してください。つまり、このコード*を実行して、問題があることを確認してください。 –

答えて

2

あなたはいくつか修正する必要があります。

import numpy as np 
import scipy.optimize as sc 
import matplotlib.pyplot as plt 

azimuth = np.linspace(0, 360, 8) # deg values from 0 to 360 
velocity = [5.6261001, 6.6962662, 3.9316666, -0.88413334, -5.4323335, 
      -6.5153003, -3.2538002, 1.0269333] 


def cos_Wave(x, a, b, c): 
    """Function that defines curve that data will be fitted to""" 
    return a * np.cos(x-b) + c 


azimuthData = np.deg2rad(azimuth) 
coeffs, matcov = sc.curve_fit(cos_Wave, azimuthData, velocity, p0=[1, 0, 0]) 

plt.scatter(azimuthData, velocity) 
nx = np.linspace(0, 2 * np.pi, 100) 
plt.plot(nx, cos_Wave(nx, *coeffs)) 
plt.savefig("plot.png") 
print(coeffs) 

[6.63878549 1.03148322 -0.27674095]

enter image description here

+0

ああ、私は非常に馬鹿だと感じます。私は方位と仰角を混同して、今どこが間違っているのかを見ます。長い月曜日だった...助けてくれてありがとう! – bgoudeau

+1

@bgoudeau「方位角」の値は8つのコンパスポイント(つまり[0,45,90,135,180,225,270,315])であるとしますか?もしそうなら、 'azimuth = np.linspace(0,360,8、endpoint = False)'のように配列 'azimuth'を作成する必要があります。現在、この答えでは、「方位角」には0 *と* 360が含まれており、角度の間隔は51.43です。 –

+0

はい、そうです。それはDavidが提出した解決策を見て間違っていたことを理解した後に私のコードで修正したものです。ウォーレンの助けてくれてありがとう、申し訳ありませんが、完全なコードも投稿しています。私はかなりこのことが解決されていると確信しています。 – bgoudeau

関連する問題