2013-03-04 40 views
6

Tôi muốn thực hiện tìm kiếm gốc cho các phương trình phi tuyến sau đây, tôi làm điều đó bằng Python nhưng nó không hoạt động. mã của tôi là dướiLàm thế nào để thực hiện tìm kiếm gốc phi tuyến phức tạp trong 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 

khi tôi chạy nó, nó cho thấy lỗi:

---> 30 kết quả = scipy.optimize.fsolve (func, [1 + 1J, 1 + 1J])

C: \ Python27 \ lib \ site-packages \ scipy \ optimization \ minpack.py trong fsolve (func, x0, args, fprime, full_output, col_deriv, xtol, maxfev, band, epsfcn, hệ số, diag)

123    maxfev = 200*(n + 1) 

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

-> 125 maxfev, ml, mu, epsfcn, hệ số, đường)

126  else: 

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

Tính năng này hoạt động như thế nào? – Blender

+0

nó là do các đơn vị số phức tạp "j", có vẻ như fsolve chỉ có thể tìm kiếm gốc cho phương trình thực và trở về gốc thực ??! – user2133730

Trả lời

6

fsolve thấy zeros của chức năng từ R^n -> R. Các chức năng tương tự root thấy zeros của chức năng từ R^n -> R^m.

Dường như bạn đang cố gắng tìm số không của hàm từ C^2 -> C^2, theo như tôi biết scipy.optimize không hỗ trợ trực tiếp - nhưng bạn có thể thử viết một hàm từ R^4 -> R^4 rồi sử dụng root. Ví dụ: nội dung nào đó dọc theo các dòng:

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] 

nên hoạt động, mặc dù có thể nhanh hơn để làm trực tiếp trên số thực thay vì lặp đi lặp lại thành phức tạp và không mở.

+0

Đây chỉ là một ví dụ cực kỳ đơn giản cho vấn đề giải quyết thực của tôi. Vấn đề thực sự là một phân đoạn 5000 "giống như", nhưng trong C^2, do đó, dường như không có hy vọng để viết lại con quái vật đó vào R^4 – user2133730

+0

bằng cách này, tại sao không có .root dưới .optimize? khi tôi "tab" tối ưu hóa. Tôi có thể tìm thấy .fsolve nhưng không có .root. Tôi sử dụng Python27, phiên bản học tập – user2133730

+0

Bạn có phiên bản scipy nào? 'root' là mới trong 0,11, như tài liệu liên kết nói; vì có vẻ như bạn đang sử dụng EPD (vì không có điều gì như là một "phiên bản học thuật" của Python), nó vẫn có thể có một phiên bản cũ. – Dougal

1

Bạn có thể thử findroot mpmath của (sympy):

from mpmath import findroot 

#Your code here 

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

Returns:

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

mà là một giải pháp của hệ thống.
Mpmath là thư viện đa thành phần, vì vậy các thói quen thường chậm hơn, nhưng bạn có thể dùng thử!

+0

Bạn có nghĩa là sympy thay vì scipy, phải không? – NauticalMile

+0

@NauticalMile Bạn nói đúng. Cảm ơn! –

Các vấn đề liên quan