2012-11-13 26 views
6

Tôi cố gắng để sử dụng fsolve như trích dẫn ở đây: http://glowingpython.blogspot.gr/2011/05/hot-to-find-intersection-of-two.html,Python đường cong giao nhau với fsolve() và đối số chức năng sử dụng NumPy

On để tìm ra ngã tư giữa hai đường cong. Cả hai đường cong cơ bản là hai mảng nổi.

Việc đầu tiên của họ là một mảng một chiều Pmech (Pmech(x)) và thứ hai là một mảng hai chiều Pair (Pair(x,y))

x - trục là chung cho cả hai mảng, vì vậy những gì tôi muốn làm là dành cho tất cả các y để xem nơi Cặp và Pmech cắt nhau.

Tôi nhận thức được thực tế là fsolve() mất như các đối số chức năng, không phải mảng vì vậy tôi đã viết hai chức năng cơ bản để thực hiện tính năng này:

def Pmix(x): 
    return Pmech[x] 

def Paera(x,y): 
    return Pair[x,y] 

Vì vậy, như thể hiện trong liên kết ở trên tôi thực hiện các findIntersection chức năng:

def findIntersection(fun1,fun2,x0): 
    return fsolve(lambda x: (fun1(x) - fun2(x,y) for y in range(1,100)),x0) 

nhưng tôi nhận được lỗi sau:

TypeError: float() argument must be a string or a number 
Traceback (most recent call last): 
    File "batteries.py", line 261, in <module> 
    findIntersection(Pmix,Paera,0) 
    File "batteries.py", line 238, in findIntersection 
    fsolve(lambda x: (fun1(x) - fun2(x,y) for y in range(1,100)),x0) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 125, in fsolve 
    maxfev, ml, mu, epsfcn, factor, diag) 
minpack.error: Result from function call is not a proper array of floats. 

Trả lời

3
from scipy.optimize import fsolve 

def pmix(x): 
    return x 

def paera(x, y): 
    return x**2 - y**2 

def findIntersection(fun1, fun2, x0): 
    return [fsolve(lambda x:fun1(x)-fun2(x, y), x0) for y in range(1, 10)] 

print findIntersection(pmix, paera, 0) 
3

Dường như trong ví dụ của bạn, bạn có thể giải quyết dễ dàng hơn mà không fsolve:

import numpy as np 
pair = np.array(pair) 
pmech = np.array(pmech) 

intersect_x=np.abs(pair-pmech[:,None]).argmin(0) 
1

(fun1(x) - fun2(x,y) for y in range(1,100))

là một máy phát điện

[fun1(x) - fun2(x,y) for y in range(1,100)]

là một danh sách. Bạn cần cái sau.

Tuy nhiên, như btel đề cập trong câu trả lời khác, đối với giao lộ trong mảng, bạn không thể chỉ sử dụng lại mã được sử dụng để tìm giao điểm của hàm.

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