2017-02-23 3 views
-1

私は最終的に各積分はz=np.linspace(1e+9,0)パイソン - 機能は、同じ次元アレイ

enter image description here

import numpy as np 
import matplotlib.pyplab as plt 
import scipy as sp 
import scipy.integrate as integrate 

z = np.linspace(1e+9, 0, 1000) 
mass = 1000 
Omega_m0 = 0.3 
Omega_L0 = 0.7 
h = 0.7 


def FreeStreamLength(z, mass, Omega_m0, Omega_L0, h): 
    kb = 8.617e-5 ## kev K^-1 
    c = 3e+5 ## km/s 
    T0 = 2.7 ## K 
    T_uni = mass/kb 

    a = 1./(z+1.) 

    z_nr = T_uni/T0 - 1. ## redshift at non relativistic 
    a_nr = 1/(z_nr + 1.) ## scale factor at non relativistic 

    Omega_r0 = (4.2e-5)/h/h 
    a_eq = Omega_r0/Omega_m0 
    z_eq = 1/a_eq - 1 

    a1 = a[a <= a_nr] ## scale factor before particles become non-relativistic 
    a2 = a[a_nr <= a.all() <= a_eq] 
    a3 = a[a_eq <= a] 

    integrand = lambda x: 1./x/x/np.sqrt(Omega_m0/x/x/x + Omega_L0) 

epoch_nr = [ c/H0 *integrate.quad(integrand, 0, i)[0] for i in a1] 
epoch_nreq = [c/H0/a_nr * integrate.quad(integrand, a2, a_eq)[0] ] 
epoch_eq = [c/H0/a_eq * integrate.quad(integrand, i, 1)[0] for i in a3] 
return epoch_nr + epoch_nreq + epoch_eq 

za通過べき配列の特定の部分を評価する場合に3つの複合積分をプロットしようとして生成しませんしたがって、これらの値は相互に関連している必要があります。

returnラインでは、すべてのリストを組み合わせて、この新しい配列を作成しました。

FSL = FreeStreamLength(z, mass, Omega_m0, Omega_L0, h) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.plot(z, FSL, color="blue", label=r"$z=0$") 
plt.show() 

私は私の新しいリストは、私が前に持っていたリストと一致していませんどのように来るValueError: x and y must have same first dimension

に戻っていますか?

私は、関数内で被積分関数を定義する前に、渡された配列から要素をどのように反復しているのかについて考える必要があります。

+0

'T_uni'と' T0'が定義されていないのでスクリプトを実行できません – gsmafra

+0

@gsmafraそれを残念にして、私はそれを引き起こしている無関係な部分を編集しました。だからもう一度試してみてください。 – DarthLazar

+0

私は推測と修正を行わずにコードを実行することはできません! – hpaulj

答えて

0

私はあなたがそこで何をしようとしているのか正確には分かりませんが、ブーリアンの配列をPythonの別の配列にインデックスすると、ブール値の配列がTrueの配列を取得します。あなたが(彼ら二人は、長さ1を持っている)3つのリストを追加している、ここで、このラインも

a1 = a[a <= a_nr] ## scale factor before particles become non-relativistic 

epoch_nr + epoch_nreq + epoch_eq 

を何が起こっているかである

>>> import numpy as np 
>>> a = np.asarray([1,2,3]) 
>>> b = np.asarray([True,False,True]) 
>>> print(a[b]) 
array([1, 3]) 

。これを行うと、あなたはこれらのリストには追加取得し、その結果は、これらの3つのリストの長さが加算されています:

>>> a = [1,2,3] 
>>> b = [1] 
>>> c = [1] 
>>> a + b + c 
[1, 2, 3, 1, 1] 
0

あなたは、エラーが発生した場所について明確にしているが、私は推測している中xyことエラーメッセージはzに、FSLplotに入力されています。それらの2つの変数の形を印刷しましたか?あなたがそれにいる間、彼らのdtypeをチェックしてください。

z = np.linspace(1e+9, 0, 1000)から、zは(1000、)浮動小数点数です。

しかし、FSLとは何ですか?あなたの関数のインデントはオフですが、私はそれがepoch_nr + epoch_nreq + epoch_eqだと思います。私は3つの配列の合計を言うだろうが、いいえ、それらはリストです。 3つのリストを連結したものです。

このリストの合計の長さはlen(a1)+1+len(a3)ですか?

各ステップで何が起こるかをコード推測する必要はありません。それがあなたの仕事です。 numpyに寸法問題があると、コード内の疑わしい点で図形を印刷し始めます。どのような形になっているかを推測しないでください!それを確認してください。


OK、私は銃を飛ばしてコードを実行しようとしました。

a_nr <= a.all() <= a_eqとは何ですか? (a2境界で)積分epoch_nreqを台無し

a2 = a[(a_nr <= a) & (a <= a_eq)] 

それはlen(a2) 4とlen(a3) 1になり、。