2016-11-10 9 views
3

Also habe ich eine Funktion für Euler-Methode codiert. Ich möchte jedoch Anfangsbedingungen mit beliebigen Dimensionen verwenden können. So zum Beispiel funktioniert derzeit meine Funktionen mit diesem:mehrdimensionale Euler-Methode Python

>>>Euler(f, x0, t0, h, N) 

wo x0 ist ein float. Aber ich möchte es in der Lage sein, dies zu verwenden:

>>>Euler(f, [x0], t0, h, N) 

wo x0 ist jetzt eine Liste von schwimmt. (multidimensional)

f = Funktion, x0 = Anfangsbedingungen zum Zeitpunkt t0,
t0 = Anfangszeit, h = Schrittweite, N = Anzahl der Schritte.

Ich habe versucht, eine for-Schleife:

def Euler(f,x0,t0,h,N): 
     t = t0 
     y = x0 
     z = [] 
     v = [] 
     for i in y: 
      while t <= N: 
       xval = t 
       yval = [y] 
       t += h 
       y += h * f(t,y[i]) #i have also tried y+= h*f(t, i) 
       z.append(xval) 
       v.append(yval) 
     return z, v 

Der Fehler ich erhalte, ist Typeerror: Liste Indizes ganze Zahlen oder Scheiben sein müssen, nicht schwimmen. Was ich verstehe, was bedeutet, dass ich das y indexieren muss, wie y [0], y [1], etc ... aber wenn ich das tue

y + = h * f (t, y [:])

Es gibt mir einen Fehler in Bezug auf meine anderen Funktion in der Datei: f =>

TypeError: a float is required 
line 22, in <module> vv = -x**3 - x + sin(t) 

Wenn ich versuche, auch

y += h * f(t, y[0]) 

und ich betreten

>>>Euler(f, [0., 1.], 0., 1, 10) 
line 15, in <module> 
y += h * f(t,y[0]) 
builtins.TypeError: 'float' object is not iterable 

Ich möchte im Wesentlichen 2 Listen zurückgeben, erste Liste ist das z, wo es eine Liste der Zeitwerte zurückgibt, und die zweite Liste v, wo es eine Liste der Liste jedes Ergebnisses während jedes Schritts zurückgibt. Bisher hat es funktioniert, wo ich einen Float, aber keine Liste verwendet habe. Also welchen Code vermisse ich?

+0

Es würde wahrscheinlich an mehreren Stellen funktionieren, wenn Sie 'x0' als' numpy.array' definieren würden. – LutzL

Antwort

2

Try this:

def Euler(f,x0,t0,h,N): 
    t = t0 
    z = [] 
    v = [] 
    for y in x0: 
     while t <= N: 
      xval = t 
      yval = [y] 
      t += h 
      y += h * f(t,y) #i have also tried y+= h*f(t, i) 
      z.append(xval) 
      v.append(yval) 
    return z, v 

Ich weiß nicht, ob dies das vorgesehene Verfahren als y += h * f(t,y) zu sehen ist, ist tot Code und nicht irgendwo anders


Ich glaube, der Fehler aufgrund verwendeten nicht auf die Arten Ihrer Variablen achten. y war eine Liste, wenn Sie y = x0 getan haben.

Schnellvorlauf zu dieser Zeile y += h * f(t,y[i]). Hier versuchen Sie, den Operator += unter y zu verwenden und den Inhalt eines anderen iterablen Objekts an y anzufügen.

In der gleichen Anweisung versuchen Sie, in y mit i zu indizieren.Um in eine Liste zu indizieren, müssen Sie eine Ganzzahl verwenden, aber da i ein Element von y ist (das ein Array von Gleitkommazahlen ist), kann i nicht verwendet werden, um in die Liste zu indizieren, und deshalb können Sie den Fehler:

TypeError: list indices must be integers or slices, not float.

auch wenn Sie diesen y+= h* f(t, y[:]) tun, erhalten Sie den Fehler:

TypeError: a float is required

Da y[:] mit allen Elementen von y eine neue Liste erstellt, so werden Sie noch eine Liste an Ihre Funktion übergeben.

Schließlich, wenn Sie dieses y += h * f(t, y[0]) tun, erhalten Sie den Fehler:

builtins.TypeError: 'float' object is not iterable

Denn wie ich schon erwähnt, y ist eine Liste und += auf einer Liste anhängt den Inhalt eines anderen iterable auf die aktuelle Liste. Die Art, wie dies geschieht, besteht darin, über die zweite Liste zu "iterieren" und die Elemente in dieser zweiten Liste an die erste Liste anzuhängen. Da der Wert h * f(t, y[0]) keine Liste ist und auch nicht iterierbar ist, erhalten Sie den Fehler

+0

oh nein, ich benutze das y. yval = [y] und so füge ich das an die Liste an und erstelle so eine Liste von Wertelisten für jeden Schritt. Vielen Dank! Ich verstehe es besser, danke! edit: Ich habe gerade gemerkt, dass mein Fehler sehr schlampig war. Danke nochmal, dass du mir geholfen hast, es zu sehen. –

+0

@AnonEmouse kein Problem – smac89

Verwandte Themen