2016-08-02 22 views
2

Ich verwende die folgenden Codes, um eine Linie mit zwei Steigungen wie im Bild gezeigt zu zeichnen. Die Steigung sollte nach einer bestimmten Grenze [Limit = 5] sinken sollte. Ich verwende die Vektorisierungsmethode, um die Steigungswerte zu setzen. Gibt es eine andere Methode, um die Steigungswerte einzustellen? Kann mir jemand dabei helfen?Wie zeichne ich eine Linie mit zwei Steigungen mit Python

   import matplotlib.pyplot as plt 
       import numpy as np 

       #Setting the condition 
       L=5 #Limit 
       m=1 #Slope 
       c=0 #Intercept 

       x=np.linspace(0,10,1000) 
       #Calculate the y value 
       y=m*x+c 

       #plot the line 
       plt.plot(x,y) 

       #Set the slope values using vectorisation 
       m[(x<L)] = 1.0 
       m[(x>L)] = 0.75 

       # plot the line again 
       plt.plot(x,y) 

       #Display with grids 
       plt.grid() 
       plt.show() 

enter image description here

Antwort

1

Sie können das Problem überdenken. Es gibt zwei Liniensegmente im Bild:

  1. von (0, 0) bis (A, A ')
  2. Von (A, A') zu (B, B ')

Sie wissen, dass A = 5, m = 1, so A' = 5. Sie wissen auch, dass B = 10. Angesichts dieser (B' - A')/(B - A) = 0.75 haben wir B' = 8.75. Sie können also die Handlung machen, wie folgt:

from matplotlib import pyplot as plt 
m0 = 1 
m1 = 0.75 
x0 = 0  # Intercept 
x1 = 5  # A 
x2 = 10 # B 
y0 = 0     # Intercept 
y1 = y0 + m0 * (x1 - x0) # A' 
y2 = y1 + m1 * (x2 - x1) # B' 

plt.plot([x0, x1, x2], [y0, y1, y2]) 

Hoffentlich sehen Sie das Muster y-Werte für einen bestimmten Satz von Grenzen für die Berechnung. Hier ist das Ergebnis:

enter image description here

Lassen Sie uns jetzt sagen, Sie wirklich Vektorisierung aus unerfindlichen Gründen verwenden wollte. Sie würden alle y-Werte vorne berechnen und einmal grafisch darstellen, sonst werden Sie seltsame Ergebnisse erhalten. Hier sind einige Änderungen an Ihrem ursprünglichen Code:

from matplotlib import pyplot as plt 
import numpy as np 

#Setting the condition 
L = 5 #Limit 
x = np.linspace(0, 10, 1000) 
lMask = (x<=L) # Avoid recomputing this mask 

# Compute a vector of slope values for each x 
m = np.zeros_like(x) 
m[lMask] = 1.0 
m[~lMask] = 0.75 

# Compute the y-intercept for each segment 
b = np.zeros_like(x) 
#b[lMask] = 0.0 # Already set to zero, so skip this step 
b[~lMask] = L * (m[0] - 0.75) 

# Compute the y-vector 
y = m * x + b 

# plot the line again 
plt.plot(x, y) 

#Display with grids 
plt.grid() 
plt.show() 

enter image description here

+0

@ Mad Physicist: Dies ist die numerische Methode, um das Problem [mehr oder weniger wie implizite Methode] zu lösen, wobei der endgültige Wert der ersten Zeile der Anfangspunkt für die zweite Zeile ist.Ihr Code ist numerische Methode Antwort. Genau das habe ich gesucht. – HEMS

+0

Ordentlich. Wenn es half, wäre ein Upvote auch nett :) –

1

Code Folgen, sollten Sie den Hauptteil wie folgt ändern:

x=np.linspace(0,10,1000) 
m = np.empty(x.shape) 
c = np.empty(x.shape) 

m[(x<L)] = 1.0 
c[x<L] = 0 
m[(x>L)] = 0.75 
c[x>L] = L*(1.0 - 0.75) 

y=m*x+c 

plt.plot(x,y) 

Beachten Sie, dass c Bedürfnisse als auch für die Linie kontinuierlich sein zu ändern. Dies ist das Ergebnis: enter image description here

+0

Sind Sie sicher über Ihre Berechnung von 'c'? –

+0

Wenn ja, könnten Sie bitte ein Bild des Ergebnisses posten? –

+0

@ Mad Physicist: Die Linie muss für jeden Wert der Steigung unter 1 kontinuierlich sein. – HEMS

Verwandte Themen