Если условие, присвоение неправильных значений в Python - PullRequest
0 голосов
/ 07 октября 2019

Обновление:

Проверено предложенные решения, не работает. Однако сузили проблему. Так что публикуем это ниже, если люди могут пролить свет.

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

enter image description here

plt.plot(z,f,'*',c='g')

enter image description here Флаг имеет правильные значения в диапазоне [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), How I expect the He_II to behave in the z-range as x-axis Как я ожидаю, что He_II будет вести себя в z-rangeкак x-axis

Но вместо этого, если я посмотрю на значения, я увижу, что значения таковы: The black marked dots in the lower right are a surprise to me and I can't understand how. Черные кружочки в правом нижнем углу меня удивляюти я не могу понять, как.

Соответствующие значения в результате неправильно, входя в вызов интеграции. Мне нужно исправить эти несколько точек внизу.

Результаты можно также проверить в выходном файле:

enter image description here Если мы проверили line 444,, мы увидим 3-й столбец, который является zЗначение и z > 3 (= 5.3146) и столбцы 6th предназначены для He_II, который должен быть 1, поскольку он попадает в условие else в приведенном выше коде, однако он дает 0, что означает, что это в первом случае, т.е. еслиблок. Почему это происходит?

1 Ответ

1 голос
/ 07 октября 2019

Измените строку elif ...: на else:, и вы больше не увидите возникшую проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...