2013-03-04 12 views
6

Chcę wykonać wyszukiwanie roota dla następujących równań nieliniowych, robię to w Pythonie, ale to nie działa. my kod jest poniżejJak wykonać nieliniowe, kompleksowe odnajdywanie roota w Pythonie

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 

po uruchomieniu go, wykazuje błędy:

---> 30 wynik = scipy.optimize.fsolve (func [1 + 1j, 1 + 1j])

C: \ Python27 \ lib \ site-pakiety \ scipy \ optymalizacji \ minpack.py w fsolve (func, x0, arg, fprime, full_output, col_deriv, xtol, maxfev, zespół, epsfcn, czynnik Diag)

123    maxfev = 200*(n + 1) 

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

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

126  else: 

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

Jak to działa? – Blender

+0

to ze względu na złożoną jednostkę liczby "j", wydaje się, że fsolve może wyszukiwać tylko root dla prawdziwych równań i zwracać prawdziwe korzenie ??! – user2133730

Odpowiedz

6

fsolve znajduje zerowe funkcji z R^n -> R. podobną funkcję root znajdzie zerowe funkcji z R^n -> R^M.

Wygląda na to, że próbujesz znaleźć zera funkcji z C^2 -> C^2, co, o ile wiem, scipy.optimize nie obsługuje bezpośrednio - ale możesz spróbować wypisać ją jako funkcję z R^4 -> R^4, a następnie używając root. Na przykład coś wzdłuż linii:

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] 

powinny działać, choć może to być znacznie szybciej to zrobić bezpośrednio na liczbach rzeczywistych, a nie wielokrotnie owijania w skomplikowane i rozpakowaniu.

+0

To tylko wyjątkowo uproszczony przykład mojego realnego rozwiązania problemu. Prawdziwym problemem jest frakcja typu "fibonaccy" o głębokości 5000, ale w C^2, więc nie ma żadnej nadziei na przepisanie tego potwora na R^4 – user2133730

+0

przy okazji, dlaczego nie ma .root pod .optimize? kiedy "zakładkę" optymalizuję. Mogę znaleźć .fsolve, ale nie ma .root. Używam Python27, wersja akademicka – user2133730

+0

Jaką wersję scipy masz? "root" jest nowy w wersji 0.11, jak mówi powiązana dokumentacja; ponieważ wydaje się, że prawdopodobnie używasz EPD (ponieważ nie ma czegoś takiego jak "wersja akademicka" Pythona), może on nadal mieć starą wersję. – Dougal

1

można spróbować findroot mpmath'S (sympy):

from mpmath import findroot 

#Your code here 

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

Powroty:

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

który jest rozwiązaniem systemu.
Mpmath jest biblioteką wielowątkową, więc jej procedury są zwykle wolniejsze, ale możesz spróbować!

+0

Masz na myśli sympy zamiast scipy, prawda? – NauticalMile

+0

@NauticalMile Masz rację. Dzięki! –

Powiązane problemy