<コード code7.3.py>
フィッティングパラメータが2個の場合、カイ自乗は
Δχ2=ΣijBijθiθj
で表されます。
B=[[1,-1],[-1,4]] について計算した結果が図7.5です。このcode7.3.py では、Berendsen氏オリジナルの contour を用いて等高線上の点を求めています。
点は autoplotp でプロットすればよいとありますがそれがみつかりません。そこでポピュラーな plot を使って右図を得ることができました。氏のコードcode7.3.pyに対する主な変更点は
data ではなく xlist, ylist に分けて返すようにしたことです。作画のプログラムを以下にしまします。
- def contour:
- ・・・・・・(元々の code 7.3。ただし 修正点がいくつかあります)
- def fxy(x,y):
- v = np.array([[x,y]])
- w = np.dot(v, matrx @ v.T)
- return w
- plt.xlim(-5., 5.)
- plt.ylim(-3., 3.)
- xycenter= np.array([0.0, 0.0])
- for i in range(1,6):
- z = i
- xlist,ylist = contour(fxy,z,xycenter)
- plt.plot(xlist,ylist,color='blue')
- font1 = {'family':'serif','color':'blue','size':11}
- font2 = {'family':'serif','color':'darkred','size':12}
- plt.title(r"$\Delta \chi^2$ contours (Fig.7.5)", fontdict = font1)
- plt.xlabel(r"$\Delta \theta_1$", fontdict = font2)
- plt.ylabel(r"$\Delta \theta_2$", fontdict = font2)
- plt.grid()
- plt.show()
|
<グラフィックス出力>
<コメント>
fxy(x,y)=v B vT において v は [x,y] という横ベクトル、vTは縦ベクトルです。
B行列を指定し、展開すると
x2-2xy+4y2 ですが、左では練習のためにマトリックス計算で求めています。
元々の code 7.3 への修正点は以下のとおりです。
- import numpy as np を追加
- import matplotlib.pyplot as plt を追加
- return data を削除
- return xlist,ylist を追加
|
<別法: matplotlib.contourf を用いる> こちらを使うと描画までやってくれます。ベクトルvに対してv B vT
を計算しています。
- import numpy as np
- import matplotlib.pyplot as plt
- matrx = np.array([[1.0, -1.0],[-1.0, 4.0]])/3.0
- nxpt = 201; nypt = 121
- x = np.linspace(-5., 5.,nxpt)
- y = np.linspace(-3., 3.,nypt)
- z = np.zeros((nypt,nxpt))
- xx, yy = np.meshgrid(x,y)
- def findz(x,y):
- for i in range(nypt):
- yi = y[i,0]
- for j in range(nxpt):
- xj = x[0,j]
- v = np.array([xj,yi])
- w = matrx @ v.T
- z[i,j] = np.dot(v, w)
- return z
- zz = findz(xx, yy)
- # zz = (xx**2 - 2.*xx*yy + 4.*yy**2)/3.0
- xycenter= np.array([0.0, 0.0])
- figure = plt.contourf(xx,yy,zz,levels=[1.,2.,3.,4.,5.],\
- colors=['#FF6666','#FFB266','#FFFF66','#B2FF66', \
- '#66FF66','#66FFFF'])
- font1 = {'family':'serif','color':'blue','size':11}
- font2 = {'family':'serif','color':'darkred','size':12}
- plt.title(r"$\Delta \chi^2$ contours (Fig.7.5)", fontdict = font1)
- plt.xlabel(r"$\Delta \theta_1$", fontdict = font2)
- plt.ylabel(r"$\Delta \theta_2$", fontdict = font2)
- plt.grid()
- plt.show()
|
<グラフィックス出力>
<コメント>
19行目の#を18行目に移せば展開計算になります。
|