Обновление:
Проверено предложенные решения, не работает. Однако сузили проблему. Так что публикуем это ниже, если люди могут пролить свет.
def X_he_z3(z):
flag = -1
if z <=3.0 : # z<3
#x_he=1.
flag = 1
else:
flag = 0
#print flag
if flag == 0 :
X_he_z3.Xe_He_II = 1.
else :
X_he_z3.Xe_He_II = 0.
return flag
Бег:
z = np.linspace(0,6,1000)
s = 1000
X = []
X2 = []
f = []
one = np.ones(s)
for i in z:
f.append(X_he_z3(i)) # Returns flag
X.append(X_he_z3.Xe_He_II)
plt.plot(z,X,'*') # He_II
plt.plot(z,f,'*',c='g')
Флаг имеет правильные значения в диапазоне [0]
и [1]
. Так что я думаю, проблема в том, как значения этого флага в переменных создают некоторую путаницу. Есть предложения?
Оригинальный вопрос
Это мой код, функция X_he_z(z)
вызывается для интеграции. Внутри функции есть условие if. под ним находится представление функции шага. if z < 3 ==> X_he_z.Xe_He_II = 0.
else
if z > 3 ==> X_he_z.Xe_He_II = 1.
import pandas as pd
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
def X_he_z(z):
global omega_m
omega_m = 0.3
global Y;global x_he;#global Xe_He_II;global Xe_He_III;
Y = 0.25
X_he_z.x_h = 1. # X_e_H ~ 1 for z<6
if (z - 3.0) < 0.00 : # z<3
#x_he=1.
X_he_z.Xe_He_II = 0. # ** This is the line in question**
X_he_z.Xe_He_III= 1.
x_he = (X_he_z.Xe_He_II + 2.*X_he_z.Xe_He_III)
elif (z - 3.0) > 0.00:
X_he_z.Xe_He_II = 1. # ** This is the line in question**
X_he_z.Xe_He_III= 0.
x_he = (X_he_z.Xe_He_II + 2.*X_he_z.Xe_He_III)
#print 'z = %s, X_He_III = %.2f'%(z,Xe_He_III)
X_he_z.x_he =x_he
X_z = ((1.-Y)*X_he_z.x_h + (1./4.)*(Y)*x_he)
X_he_z.fe=X_z
Num = X_he_z.fe*(1.+z)
Den = (omega_m*((1.+z)**3.)+(1.-omega_m))**(0.5)
I = Num/Den
X_he_z.G = [I,X_he_z.fe,X_he_z.Xe_He_II,X_he_z.Xe_He_III,X_he_z.x_h,X_he_z.x_he]
#print G
#print I
return I
# Running the code + Integration
z = np.linspace(0,6,500)
s = 500
Dm = []
X = []
one = np.ones(s)
for i in z:
#print 'z ',i
t = X_he_z(i)
Dm.append(integrate.quad(X_he_z,0,i))
X.append(X_he_z.G)
# Returns in order :
# I, fe, He_II, He_III, H, He
Dm = pd.DataFrame(Dm,columns=['DM','Int_error'])
Dm['z'] = z
Dm['H']= pd.DataFrame(X)[4]
Dm['He']= pd.DataFrame(X)[5]
Dm['HeII']= pd.DataFrame(X)[2]
Dm['HeIII']= pd.DataFrame(X)[3]
Dm['fe']= pd.DataFrame(X)[1]
Остальная часть не требуется для этого поста. Я ожидал бы, что значение X_he_z.Xe_He_II
будет иметь пошаговую функцию, например, прикрепленный график (игнорируйте значения Y-axis
), Как я ожидаю, что He_II
будет вести себя в z-range
как x-axis
Но вместо этого, если я посмотрю на значения, я увижу, что значения таковы: Черные кружочки в правом нижнем углу меня удивляюти я не могу понять, как.
Соответствующие значения в результате неправильно, входя в вызов интеграции. Мне нужно исправить эти несколько точек внизу.
Результаты можно также проверить в выходном файле:
Если мы проверили line 444,
, мы увидим 3-й столбец, который является zЗначение и z > 3 (= 5.3146)
и столбцы 6th
предназначены для He_II
, который должен быть 1
, поскольку он попадает в условие else в приведенном выше коде, однако он дает 0
, что означает, что это в первом случае, т.е. еслиблок. Почему это происходит?