2016-05-23 10 views
1

Ich zeichne einige Kurven Imax vs Ciclo de servicio für mehrere Frequenzen.Interceptionwerte anzeigen, Matplotlib

zu tun, dass ich zwei verschachtelte Sweeps für die unabhängigen Variablen mache, Fs und Vo

Obwohl Gleichungen ein wenig komplexer sind ich dies im Grunde tun:

for Fs in np.linspace(70e3,200e3,4): 
    Vo_sweep = np.linspace(0,1,1000) 
    delta_I = [I_max(Vo) for Vo in Vo_sweep] 
    plt.plot(Vo_sweep,delta_I) 

enter image description here

Und ich bin besonders interessiert an dem Punkt, wo "ciclo de servicio" 0,71 ist.

Wie kann ich den Wert 0,71 in den X-Achsen und Y-Wert des Abhörens von der blauen Linie mit jeder Kurve zeigen

+0

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

+0

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

Antwort

1

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:

Plots markers intercepts matplotlib

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.