2011-12-19 18 views
5

Sto utilizzando la funzione optimize.fsolve di scipy per la prima volta per trovare le radici in un'equazione. Il problema è che qualsiasi numero che uso come valore di stima/stima è quello che ottengo come risposta (entro circa 8 posizioni decimali). Quando si utilizza full_output = True, ottengo che exitflag sia '1', che dovrebbe significare che 'La soluzione convergente', che per quanto mi risulta dovrebbe significare che l'output è davvero una radice dell'equazione.sempre restituendo la stima/stima

So che ci sono un numero finito di radici distinte (che sono distanziate), come quando grafico l'equazione posso vederle. Inoltre, falloff fallisce (dà errore exitflags) quando inserisco il punto di partenza in un intervallo che dovrebbe restituire valori non definiti (dividere per zero, radice quadrata di un valore negativo). Ma oltre a ciò restituisce sempre il punto di partenza come radice.

Ho testato fsolve con un'equazione molto semplice e ha funzionato correttamente, quindi so che sto importando tutto ciò di cui ho bisogno e dovrei utilizzare correttamente fsolve. Ho anche provato a scherzare con alcuni degli argomenti di input, ma non li capisco molto bene e nulla sembrava cambiare).

seguito è riportato il relativo codice (E è l'unica variabile, tutto il resto ha un valore diverso da zero):

def func(E): 
    s = sqrt(c_sqr * (1 - E/V_0)) 
    f = s/tan(s) + sqrt(c_sqr - s**2) 
    return f 

guess = 3 
fsolve(func, guess) 

che ha appena uscite '3' e dice, anche se 'La soluzione convergente.' le soluzioni più vicine dovrebbero essere a circa 2,8 e 4,7.

Qualcuno ha qualche idea su come risolvere questo problema e ottenere una risposta corretta (usando fsolve)?

+3

Forse sei solo un bravo indovino. –

+0

Qual è il valore di 'V_0'? –

+3

Potete fornire i valori per 'V_0' e' c_sqr'?Ho provato a mettere 'c_sqr = 100' e' V_0 = 10', e converge correttamente alla radice 2.90496355. –

risposta

6

Credo che l'equazione doesn fai quello che pensi che faccia Per prima cosa, quando lo provo, non restituisce l'ipotesi; restituisce un numero chiudi alla congettura. È molto instabile e sembra confondere lo fsolve. Ad esempio:

>>> V_0 = 100 
>>> c_sqr = 3e8 ** 2 
>>> guess = 5 
>>> fsolve(func, guess) 
array([ 5.00000079]) 

Questo non è 5. Non è nemmeno 5 all'interno della precisione della macchina. Inoltre non è una radice dell'equazione:

>>> func(5.00000079) 
2114979.3239706755 

Ma il comportamento della equazione è abbastanza imprevedibile in ogni caso:

>>> func(5.0000008) 
6821403.0196130127 
>>> func(5.0000006) 
-96874198.203683496 

Così, ovviamente, c'è un passaggio per lo zero da qualche parte lì intorno. Direi di dare un'occhiata alla tua equazione. Assicurati di specificare l'argomento di tan in radianti, ad esempio.

+2

grazie, ho dimenticato di mettere l'argomento dell'abbronzatura in radianti. – scaevity

1

Hai provato a cambiare la tua funzione in qualcosa di veramente banale? Come questo:

#!/usr/bin/python 
from scipy.optimize import fsolve 

def func(E): 
# s = sqrt(c_sqr * (1 - E/V_0)) 
# f = s/tan(s) + sqrt(c_sqr - s**2) 
    f = E**2 -3. 
    return f 

guess = 9 

sol=fsolve(func, guess) 
print sol, func(sol) 

Per me il codice sopra converge verso dove dovrebbe.

Inoltre, nel codice che hai fornito --- cosa sono c_str e V_0? Se infatti la funzione dipende da più di una variabile, e si sta trattando tutti loro, ma uno come parametri costanti, quindi utilizzare il args argomento del fsolve, in questo modo:

#!/usr/bin/python 
from scipy.optimize import fsolve 
from numpy import sqrt 

def func(E,V_0): 
    #s = sqrt(c_sqr * (1 - E/V_0)) 
    #f = s/tan(s) + sqrt(c_sqr - s**2) 
    f = E**2 -V_0 
    return f 

VV=4. 
guess = 9 
sol=fsolve(func, guess, args=(VV)) 

print sol, func(sol,VV) 
Problemi correlati