2016-12-04 6 views
2

私はここにいくつかの同様の質問があることを知っていますが、それらのどれも私の問題に実際には達していないようです。Python:積分をプロットする

私のコードは次のようになります。

import numpy 

import matplotlib.pyplot as plt 

from scipy import integrate as integrate 

def H(z , omega_m , H_0 = 70): 

    omega_lambda=1-omega_m 
    z_prime=((1+z)**3) 
    wurzel=numpy.sqrt(omega_m*z_prime + omega_lambda) 

    return H_0*wurzel 



def H_inv(z, omega_m , H_0=70): 

    return 1/(H(z, omega_m, H_0=70)) 

def integral(z, omega_m , H_0=70): 

    I=integrate.quad(H_inv,0,z,args=(omega_m,)) 
    return I 


def d_L(z, omega_m , H_0=70): 

    distance=(2.99*(10**8))*(1+z)*integral(z, omega_m, H_0=70) 

    return distance 

機能は、仕事を、私の問題:どのように私は、z対D_Lをプロットすることができますか?私のd_Lの定義にこの積分関数があり、zといくつかのargs =(omega_m、)に依存することは明らかに問題です。

+0

'z 'の例と' d_L'でその使い方を教えてもらえますか? –

+0

最後に、zは十分なステップ(500+)で0から2まで実行する必要があります。 – user7248647

答えて

0

@のeyllanescのソリューションの上に構築するには、ここにあなたがオメガのいくつかの値をプロットしたい方法は次のとおりです。

import numpy 

import matplotlib.pyplot as plt 

from scipy import integrate 


def H(z, omega_m, H_0=70): 
    omega_lambda = 1 - omega_m 
    z_prime = ((1 + z) ** 3) 
    wurzel = numpy.sqrt(omega_m * z_prime + omega_lambda) 

    return H_0 * wurzel 


def H_inv(z, omega_m, H_0=70): 
    return 1/(H(z, omega_m, H_0=70)) 


def integral(z, omega_m, H_0=70): 
    I = integrate.quad(H_inv, 0, z, args=(omega_m,))[0] 
    return I 


def d_L(z, omega_m, H_0=70): 
    distance = (2.99 * (10 ** 8)) * (1 + z) * integral(z, omega_m, H_0) 
    return distance 

z0 = -1.8 
zf = 10 
zs = numpy.linspace(z0, zf, 1000) 

fig, ax = plt.subplots(nrows=1,ncols=1, figsize=(16,9)) 

for omega_m in np.linspace(0, 1, 10): 
    d_Ls = numpy.linspace(z0, zf, 1000) 
    for index in range(zs.size): 
     d_Ls[index] = d_L(zs[index], omega_m=omega_m) 
    ax.plot(zs,d_Ls, label='$\Omega$ = {:.2f}'.format(omega_m)) 
ax.legend(loc='best') 
plt.show() 

Plot with multiple lines

+1

あなたの努力に本当に感謝します。これは私が欲しかったものです! このような迅速で正確なフィードバックは期待していませんでした – user7248647

1

私の解決策を試してください:

import numpy 

import matplotlib.pyplot as plt 

from scipy import integrate 


def H(z, omega_m, H_0=70): 
    omega_lambda = 1 - omega_m 
    z_prime = ((1 + z) ** 3) 
    wurzel = numpy.sqrt(omega_m * z_prime + omega_lambda) 

    return H_0 * wurzel 


def H_inv(z, omega_m, H_0=70): 
    return 1/(H(z, omega_m, H_0=70)) 


def integral(z, omega_m, H_0=70): 
    I = integrate.quad(H_inv, 0, z, args=(omega_m,))[0] 
    return I 


def d_L(z, omega_m, H_0=70): 
    distance = (2.99 * (10 ** 8)) * (1 + z) * integral(z, omega_m, H_0) 
    return distance 

z0 = -1.8 
zf = 10 
zs = numpy.linspace(z0, zf, 1000) 
d_Ls = numpy.linspace(z0, zf, 1000) 
omega_m = 0.2 

for index in range(zs.size): 
    d_Ls[index] = d_L(zs[index], omega_m=omega_m) 
plt.plot(zs,d_Ls) 
plt.show() 

出力:

enter image description here

+1

ありがとう、これは実際に私がプロットしたいもののように見えます! 私はPythonに本当に新しいので、変更を理解するために数分/時間が必要になります。 これをomega_mのさまざまな値について同じ数字にプロットすると、どのようにすればよいでしょうか? – user7248647

+0

@ user7248647 まず、私の答えが正しいと表示されたら – eyllanesc

関連する問題