2013-03-04 8 views
6

Voglio eseguire una ricerca di radice per le seguenti equazioni non lineari, lo faccio in Python ma non funziona. il mio codice è sottoCome eseguire il rilevamento di radici complesse non lineari in Python

from pylab import * 
import scipy 
import scipy.optimize 

def z1(x,y): 
    temp=1+1j+x+2*y; 
    return temp 

def z2(x,y): 
    temp=-1j-2*x+sqrt(3)*y; 
    return temp 

def func(x): 
    temp=[z1(x[0],x[1])-1.0/(1-1.0/(z2(x[0],x[1]))),1-2.0/(z2(x[0],x[1])-4.0/z1(x[0],x[1]))] 
    return temp 

result=scipy.optimize.fsolve(func,[1+1j,1+1j]) 

print result 

quando l'eseguo, mostra gli errori:

---> 30 = risultato scipy.optimize.fsolve (FUNC, [1 + 1 undecies, 1 + 1j])

C: \ Python27 \ lib \ site-packages \ SciPy \ ottimizzare \ minpack.py a fsolve (func, x0, args, fprime, full_output, col_deriv, xtol, maxfev, band, epsfcn, fattore, diag)

123    maxfev = 200*(n + 1) 

124   retval = _minpack._hybrd(func, x0, args, full_output, xtol, 

-> 125 maxfev, ml, mu, epsfcn, fattore, diag)

126  else: 

127   _check_func('fsolve', 'fprime', Dfun, x0, args, n, (n,n)) 
+4

Come funziona? – Blender

+0

è dovuto alla complessa unità di numero "j", sembra che fsolve possa solo cercare root per equazioni reali e restituire radici reali ??! – user2133730

risposta

6

fsolve trova zeri di funzioni da R^n -> R. La funzione simile root constata zeri di funzioni da R^n -> R^m.

Sembra che tu stia cercando gli zeri di una funzione da C^2 -> C^2, che per quanto ne so scipy.optimize non supporta direttamente - ma potresti provare a scriverlo una funzione da R^4 -> R^4 e quindi usando root. Per esempio, qualcosa sulla falsariga di:

def func_as_reals(x): 
    r1, c1, r2, c2 = x 
    a, b = func([complex(r1, c1), complex(r2, c2)]) 
    return [a.real, a.imag, b.real, b.imag] 

dovrebbe funzionare, anche se potrebbe essere significativamente più veloce di farlo direttamente sui numeri reali, invece di avvolgere più volte nel complesso e scartare.

+0

Questo è solo un esempio estremamente semplificato per il mio problema di risoluzione reale. Il vero problema è una frazione di 5000 profondità "Fibonacci", ma in C^2, quindi non sembra alcuna speranza riscrivere quel mostro in R^4 – user2133730

+0

a proposito, perché non c'è .root sotto .optimize? quando I "tab" ottimizza. Riesco a trovare. Fede ma non c'è .root. Io uso Python27, versione accademica – user2133730

+0

Quale versione di scipy hai? 'root' è nuovo in 0.11, come dice la documentazione collegata; dal momento che sembra che tu stia probabilmente usando EPD (dato che non esiste una "versione accademica" di Python), potrebbe comunque avere una vecchia versione. – Dougal

1

Si potrebbe provare findroot di mpmath (sympy):

from mpmath import findroot 

#Your code here 

ans = findroot([z1,z2],(0,0)) 
print(ans) 

Ritorni:

[(-0.302169479251962 - 0.651084739625981j)] 
[(-0.348915260374019 - 0.174457630187009j)] 

che è una soluzione del sistema.
Mpmath è una libreria multiprecision in modo che le routine siano generalmente più lente, ma è possibile provarlo!

+0

Intendi sympy invece di scipy, giusto? – NauticalMile

+0

@NauticalMile Hai ragione. Grazie! –

Problemi correlati