2012-11-13 23 views
6

Sto cercando di usare fsolve come citato qui: http://glowingpython.blogspot.gr/2011/05/hot-to-find-intersection-of-two.html,Python curve intersezione con fsolve() e argomenti di funzioni utilizzando NumPy

Sulla fine di trovare l'intersezione tra due curve. Entrambe le curve sono fondamentalmente due matrici di galleggianti.

Il primo di questi è un array dimensione Pmech (Pmech(x)) e la seconda è una matrice bidimensionale Pair (Pair(x,y))

La x - asse è comune per entrambe le matrici, quindi quello che voglio fare è per ogni y per vedere dove Coppia e Pmech si intersecano.

Sono consapevole del fatto che fsolve() prendono come funzioni argomenti, non array che così ho scritto due funzioni di base per implementare questa funzione:

def Pmix(x): 
    return Pmech[x] 

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

Così come dimostrato nel link qui sopra ho implementato la funzione findIntersection:

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

ma ottengo il seguente errore:

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. 

risposta

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

Sembra che nel tuo esempio si potrebbe risolvere molto più facile senza 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))

è un generatore di

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

è una lista. Hai bisogno di quest'ultimo.

Tuttavia, come Btel menziona nell'altra risposta, per le intersezioni negli array, non è possibile solo riutilizzare il codice utilizzato per trovare intersezioni di funzioni.