2012-11-13 4 views
6

Ich versuche fsolve zu verwenden, wie hier zitiert: http://glowingpython.blogspot.gr/2011/05/hot-to-find-intersection-of-two.html,Python Kurven Kreuzung mit fsolve() und Funktionsargumenten mit numpy

auf, um die Kreuzung zwischen zwei Kurven zu finden. Beide Kurven sind im Grunde zwei Float-Arrays.

Die erste von ihnen ist ein eindimensional Array Pmech (Pmech(x)) und das zweite ist ein zwei dimensionales Array Pair (Pair(x,y))

der X - Achse für beide Anordnungen gemeinsam ist, so, was ich will für jeden y zu tun ist, wo zu sehen, Pairing und PMech schneiden sich.

Ich bin mir bewusst, dass fsolve() als Argumente Funktionen übernehmen, nicht Arrays so schrieb ich zwei grundlegende Funktionen diese Funktion zu implementieren:

def Pmix(x): 
    return Pmech[x] 

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

So wie ich die findIntersection Funktion implementiert in dem obigen Link demonstriert:

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

aber ich bekomme die folgende Fehlermeldung:

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. 

Antwort

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

Es scheint, dass Sie in Ihrem Beispiel könnte es viel einfacher zu lösen, ohne 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))

ist ein Generator

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

ist eine Liste. Du brauchst letzteres.

Wie jedoch in der anderen Antwort von btel erwähnt, können Sie für Schnittmengen in Arrays nicht einfach den Code wiederverwenden, der zum Auffinden von Schnittpunkten von Funktionen verwendet wird.