2017-12-31 125 views
0

Ich schreibe einen Lokta Volterra-Algorithmus in Python.Funktion gibt keine zurück, obwohl keine Werte vorhanden sind

Ich habe die folgende Fehlermeldung anzeigt

File "abeille.py", line 73, in affichage_Lotka_Volterra_TL 
    T,L,Y=Lotka_Volterra(l_0,y_0,tmin,tmax,h) 

TypeError: 'NoneType' object is not iterable 

und hier ist der Code

import numpy as np 
import matplotlib.pyplot as plt 



a,b,c,d=1.5,0.05,0.48,0.05 

'''a=taux de reproduction des proies (constant, indépendant du nombre de prédateurs) 

b=taux de mortalité des proies dû aux prédateurs rencontrés 

c=taux de mortalité des prédateurs (constant, indépendant du nombre de proies) 

d=taux de reproduction des prédateurs en fonction des proies rencontrées et mangées''' 



def lapin(l,y): 
    return 
    a*l-b*l*y 



def lynx(l,y): 
    return 
    d*l*y-c*y 



def Lotka_Volterra(l_0,y_0,tmin,tmax,h): 
    liste_t=[0]  
    liste_l=[l_0] 
    liste_y=[y_0] 
    t=tmin 
    dy=y_0 
    dl=l_0 
    while t<=tmax: 
     t+=h 
     liste_t.append(t) 
     dl+=(a*dl-b*dl*dy)*h 
     dy+=(d*dl*dy-c*dy)*h 
     liste_l.append(dl) 
     liste_y.append(dy) 
    return 
    liste_t,liste_l,liste_y 




def affichage_Lotka_Volterra_TL(l_0,y_0,tmin,tmax,h): 
'''Population de lièvres en fonction du temps''' 
    T,L,Y=Lotka_Volterra(l_0,y_0,tmin,tmax,h) 
    plt.plot(T,L) 
    plt.title('Population de lièvres au cours du temps\nConditions initiales : 4 kilolièvres pour 10 lynx sur une durée de 50 ans') 
    plt.xlabel('Temps d-étude (en année)') 
    plt.ylabel('L = Population de lièvres (en kilo)') 
    plt.show() 
affichage_Lotka_Volterra_TL(4,10,0,50,0.0005) 



def affichage_Lotka_Volterra_TY(l_0,y_0,tmin,tmax,h): 
    '''Population de lynx en fonction du temps''' 
    T,L,Y=Lotka_Volterra(l_0,y_0,tmin,tmax,h) 
    plt.plot(T,Y) 
    plt.title('Population de lynx au cours du temps\nConditions initiales : 4 kilolièvres pour 10 lynx sur une durée de 50 ans') 
    plt.xlabel('T = Temps d-étude (en année)') 
    plt.ylabel('Y = Population de lynx (en unité)') 
    plt.show() 


def affichage_Lotka_Volterra_YL(l_0,y_0,tmin,tmax,h): 
    '''Population de lynx en fonction de la population de lièvres''' 
    T,L,Y=Lotka_Volterra(l_0-2,y_0-2,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=2 et Y0=8") 
    T,L,Y=Lotka_Volterra(l_0,y_0,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=4 et Y0=10") 
    T,L,Y=Lotka_Volterra(l_0+2,y_0+2,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=6 et Y0=12") 
    T,L,Y=Lotka_Volterra(l_0+10,y_0+10,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=14 et Y0=20") 
    T,L,Y=Lotka_Volterra(l_0+50,y_0+50,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=54 et Y0=60") 
    T,L,Y=Lotka_Volterra(l_0+20,y_0+100,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=24 et Y0=110") 
    T,L,Y=Lotka_Volterra(l_0+60,y_0+100,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=64 et Y0=110") 
    T,L,Y=Lotka_Volterra(l_0+100,y_0+100,tmin,tmax,h) 
    plt.plot(L,Y, label="L0=104 et Y0=108") 
    plt.title('Population de lynx en fonction de la population de lièvres\nConditions initiales : L0 kilolièvres pour Y0 lynx sur une durée de 50 ans et des relevés tous les 0.0005 ans') 
    plt.xlabel('L = Population de lièvres (en kilo)') 
    plt.ylabel('Y = Population de lynx (en unité)') 
    plt.legend(loc="upper right")#localisation de l'affichage de la légende sur le graphique 
    plt.show() 
affichage_Lotka_Volterra_YL(4,10,0,50,0.0005) 
+1

Offensichtlich 'Lotka_Volterra' kehrt' None', die nicht über laufen werden können, um mehrere Namen zuweisen. Haben Sie Debugging durchgeführt, um herauszufinden, warum? – jonrsharpe

+1

Mögliches Duplikat von [Funktion, die ein Tupel zurückgibt, gibt TypeError: Objekt 'NoneType' ist nicht iterierbar (https://stackoverflow.com/questions/17974383/function-that-returns-a-tuple-gives-typeerror-nonetype- object-is-not-iterable) – jonrsharpe

Antwort

2

Sie können Ihre return Linie wie das nicht aufgespalten.

return # Implicitly returns None 

# Then you have a pure expression 
# in an impure context after the return 
liste_t,liste_l,liste_y 

solche mit 3 Komma getrennte Werte in der nächsten Zeile nicht Teil des return.

ändern diese Zeilen zu

return liste_t,liste_l,liste_y 
1

Du None Deshalb Rückkehr erhalten Sie None.

return 

entspricht

return None 

Und der Code nach dem return Anweisung ist nur unerreichbar Code.

Sie wollen wahrscheinlich:

return liste_t,liste_l,liste_y 
+0

OOOOOOOps Programmierlektion 1, danke, dass es jetzt funktioniert – Lucos

+0

Wenn Sie eine Antwort erhalten haben, die Sie zufriedenstellt, markieren Sie sie bitte als akzeptiert. Vielen Dank, –

Verwandte Themen