2016-04-05 4 views
1

Ich verwende die Bisektion-Methode aus dem scipy.optimize-Paket innerhalb einer for-Schleife. Die Idee ist, einen Wert von "sig" mit der Bisektionsmethode für jedes Element (Wert) im "eps_komp" Vektor zu erhalten. Ich habe so viel codiert:Python: Funktion erhält keinen Wert innerhalb einer for-Schleife

import numpy as np 
import scipy.optimize as optimize 

K=300 
n = 0.43 
E = 210000 
Rm = 700 
sig_a = [] 
RO_K = 300 
RO_n = 0.43 

eps_komp =  [0.00012893048999999997, 
0.018839115269999998, 
0., 
0.022996934109999999, 
-0.0037319012899999999, 
0.023293921169999999, 
0.0036927752099999997, 
0.020621037629999998, 
0.0063656587500000002, 
0.020324050569999998, 
-0.0025439530500000001, 
0.018542128209999998, 
0., 
0.019730076449999998, 
0.0045837363899999999, 
0.015275270549999997, 
-0.0040288883499999999, 
0.021215011749999999, 
-0.0031379271699999997, 
0.023590908229999999] 

def eps_f(i): 
    return eps_komp[i] 

for j in range(len(eps_komp)): 
    eps_komp_j = eps_f(j) 
    if j <= len(eps_komp): 
     def func(sig): 
      return eps_komp_j - sig/E - (sig/RO_K)**(1/RO_n) 
     sig_a.append(optimize.bisect(func, 0, Rm)) 
    else: 
     break 

print(sig_a) 

Nun, wenn ich die den Wert von "j" in eps_f (j) auf 0 zu ändern:

eps_komp_j = eps_f(0) 

es funktioniert, und so tut es für alle anderen Werte, die ich von Hand einfüge, aber wenn ich es wie in der for-Schleife behalte, ändert sich der "j" -Wert nicht automatisch und ich erhalte einen Fehler:

f (a) und f (b) müssen haben verschiedene Zeichen

Hat jemand eine Ahnung was das Problem ist und wie könnte das gelöst werden?

Grüße,

L

P. S. Ich habe gestern ein anderes Thema zu diesem Problem gepostet, aber ich war nicht sehr spezifisch mit dem Problem und bekam negative Rückmeldungen. Allerdings muss ich das heute lösen, also wurde ich gezwungen, es erneut zu posten, aber ich schaffte es, etwas weiter mit dem Code zu kommen, als ich es in der früheren Post getan habe, also ist es kein repost ...

+2

Wenn Sie einen Fehler erhalten, fügen Sie bitte die * vollständige * Trace-Back, nicht nur die endgültige Nachricht. –

+0

Ich kann nicht glauben, dass 'j' nicht korrekt von der for-Schleife aktualisiert wird. Was passiert, wenn Sie 'print (j, eps_komp_j)' vor 'sig_a.append (optimize.bisect ...' einfügen? –

+0

Lustig, denn wenn ich diesen Code ausführe, bekomme ich 'NameError: Name 'Emod' ist nicht definiert 'so Vielleicht solltest du dir ansehen, wie man ein [minimales, vollständiges, überprüfbares Beispiel] ( –

Antwort

1

Wenn Sie read the docs Sie werden feststellen, dass:

Basic bisection routine to find a zero of the function f between the arguments a and b. f(a) and f(b) cannot have the same signs. Slow but sure.

In Ihrem Code:

def func(sig): 
     return eps_komp_j - sig/Emod - (sig/RO_K)**(1/RO_n) 
    sig_a.append(optimize.bisect(func, 0, Rm)) 

Sie es func(0) und func(700) vorbei.

Durch das Ersetzen der optimize.bisect Linie mit print(func(0), func(700)) ich folgende Ausgabe:

0.00012893048999999997 -7.177181168628421 
0.018839115269999998 -7.158470983848421 
0.-7.165004699168421 
0.02299693411 -7.15431316500842 
-0.00373190129 -7.1810420004084206 
0.02329392117 -7.154016177948421 
0.0036927752099999997 -7.173617323908421 
0.02062103763 -7.156689061488421 
0.00636565875 -7.17094444036842 
0.02032405057 -7.156986048548421 
-0.00254395305 -7.17985405216842 
0.018542128209999998 -7.15876797090842 
0.-7.165004699168421 
0.019730076449999998 -7.157580022668421 
0.00458373639 -7.172726362728421 
0.015275270549999997 -7.162034828568421 
-0.00402888835 -7.181338987468421 
0.02121501175 -7.156095087368421 
-0.0031379271699999997 -7.1804480262884205 
0.02359090823 -7.153719190888421 

Beachten Sie die mehrere Paare, die die gleichen Vorzeichen haben. optimize.bisect kann nicht mit denen umgehen. Ich weiß nicht, was Sie versuchen zu erreichen, aber das ist der falsche Ansatz.

+0

Wenn Sie den Code ausführen, den ich gerade aktualisiert und den "j" zuweisen tatsächlicher Wert hier: eps_komp_j = eps_f (j) es funktioniert, also funktioniert das ganz sicher, das einzige was nicht richtig funktioniert ist die for loop ... – mcluka

+0

Was meinst du damit "es funktioniert"? Ich habe 'eps_komp_j = eps_f (j) '(was zumindest im Moment nichts nützliches bewirkt) der Code, der diese Ausgaben erzeugt hat.' optimize.bisect' wird niemals funktionieren in dieser besonderen Konfiguration. –

+0

Nun, wenn Sie zum Beispiel 'eps_komp_j = eps_f (3)' einfügen, wird der Vektor mit dem richtigen Wert gefüllt, btu nur für das vierte (j = 3) Element des Vektors eps_komp ... – mcluka