Wenn Sie Ihre Abhör Markern beliebige Daten (was auch immer Ihre Funktionen und vertikale Linien zeichnen könnte) Ich würde empfehlen, dass Sie die Schnittpunkte berechnen (wo sie existieren). Vor ein paar Monaten habe ich eine Antwort gegeben, die dir vielleicht nützlich sein könnte. Sie können es überprüfen here.
eine ähnliche Lösung für Ihr Problem anpassen:
import numpy as np
import matplotlib.pyplot as plt
def line_intersection(line1, line2):
xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) #Typo was here
def det(a, b):
return a[0] * b[1] - a[1] * b[0]
div = det(xdiff, ydiff)
if div == 0:
return None
d = (det(*line1), det(*line2))
x = det(d, xdiff)/div
y = det(d, ydiff)/div
return x, y
def near(a, b, rtol=1e-5, atol=1e-8):
return abs(a - b) < (atol + rtol * abs(b))
def crosses(line1, line2):
"""
Return True if line segment line1 intersects line segment line2 and
line1 and line2 are not parallel.
"""
(x1,y1), (x2,y2) = line1
(u1,v1), (u2,v2) = line2
(a,b), (c,d) = (x2-x1, u1-u2), (y2-y1, v1-v2)
e, f = u1-x1, v1-y1
denom = float(a*d - b*c)
if near(denom, 0):
# parallel
return False
else:
t = (e*d - b*f)/denom
s = (a*f - e*c)/denom
# When 0<=t<=1 and 0<=s<=1 the point of intersection occurs within the
# line segments
return 0<=t<=1 and 0<=s<=1
for Fs in np.linspace(70e3,200e3,4):
Vo_sweep = np.linspace(0,1,1000)
delta_I = [i*Fs*np.log((i+1.1)/10) for i in range(len(Vo_sweep))] #[I_max(Vo) for Vo in Vo_sweep]
plt.plot(Vo_sweep,delta_I)
plt.vlines(0.71,min(delta_I),max(delta_I))
for Fs in np.linspace(70e3,200e3,4):
x = np.linspace(0,1,1000)
y = [i*Fs*np.log((i+1.1)/10) for i in range(len(Vo_sweep))]
for i in range(1,len(delta_I)):
p1 = np.array([x[i-1],y[i-1]],dtype='float')
p2 = np.array([x[i],y[i]],dtype='float')
k1 = np.array([0.71,min(delta_I)],dtype='float')
k2 = np.array([0.71,max(delta_I)],dtype='float')
if crosses((p2,p1),(k1,k2)):
seg = line_intersection((p2,p1),(k1,k2))
plt.scatter(seg[0],seg[1],c='red',s=90)
print(seg)
plt.ylim(min(delta_I),max(delta_I))
plt.xlim(0,1)
plt.show()
, die dazu führt:
Diese besondere Rezeptur auch druckt das Abhören koordinieren, wenn das von Interesse sein könnte, Sie:
(0.70999999999999985, 211670610.06954533)
(0.70999999999999985, 342704797.25546497)
(0.70999999999999985, 473738984.44138455)
(0.70999999999999985, 604773171.62730408)
Sin Wenn Sie die Daten nicht zur Verfügung gestellt haben, musste ich eine schnelle synthetische erstellen, aber es sollte so einfach sein wie durch Ihre I_max()
Funktion in der Definition von delta_I
ersetzen.
Dies ist vielleicht eine blöde Frage, aber wenn Ihre x-Achse alle ganzzahligen Werte von 0 bis 1000 hat (die Sie irgendwie als 0 bis 1.0 plotten), ist nicht der y-Wert von 'x = 0,71'just' I_max (709) '? Dann könnten Sie eine Anmerkung (zum Beispiel) verwenden, um diesen Wert in die Grafik zu schreiben. Siehe hier: http://matplotlib.org/users/annotations_intro.html – StefanS
Ich stimme @StefanS zu. Durch die Konstruktion kennen Sie bereits den Wert jeder Funktion bei x = 0,71 oder dem nächsten x. Mein Vorschlag wäre also, I_max (0.71) in einer Liste zu speichern und dann ein kleines Feld darunter hinzuzufügen, das I_max (0.71) als Funktion der Frequenz anzeigt. Wenn Sie viele verschiedene Kurven haben, erhalten Sie eine ruhige, leicht verständliche Funktion. – Alejandro