Ausgabe
Haben Sie sich gefragt, wie Sie 100 zufällige Punkte innerhalb der Parabel unten generieren und auch sicherstellen können, dass diese Punkte y-Werte kleiner als 15000 haben?
x = np.linspace(-100,100)
y = 2*x**2+10*x
plt.plot(x,y)
plt.show()
Jede Hilfe wäre willkommen. Vielen Dank!
Lösung
Der übliche Boilerplate
import numpy as np
import matplotlib.pyplot as plt
Wir wollen Punkte in einem Rechteck (x0, x0+dx) × (y0, y0+dy) erzeugen und Punkte unter der Parabel verwerfen.
Der y-Bereich ist einfach, y0=0
unddy=15000
y0=ymin=y(-2.5)
, dy=15000-ymin
, für den x-Bereich müssen wir 2 x² + 10 x = 15000 ⇒ x₁ = (-5 – √(5²+2·15000))/2 und x₂ = (-5 + √) lösen (5²+2·15000))/2.
x0, dx = (-5-np.sqrt(30025))/2, np.sqrt(30025)
y0, dy = 2*6.25+10*(-2.5), 15000.0-(2*6.25+10*(-2.5))
Jetzt generieren wir eine Liste von zufälligen Punkten, die zunächst ungültig ist
xy = []
Dann generieren wir die Koordinaten eines Punktes, prüfen, ob sie gültig sind, und wiederholen, bis wir 100 gültige Punkte gesammelt haben.
while len(xy) < 100:
x = x0 + np.random.rand()*dx
y = np.random.rand()*15000
if y<2*x*x+10*x : continue # i.e., start a new iteration w/o appending
xy.append((x,y))
Beim Zeichnen verwende ich nun einen Bereich, der symmetrisch zur Symmetrieachse der Parabel ist, dann zeichne ich die Punkte mit scatter
(beachten Sie *zip(*iterable)
, dass dies zum Transponieren einer 2D-Liste verwendet wird) und zeichne schließlich eine horizontale gestrichelte Linie.
x = np.linspace(-2.5-100, -2.5+100, 801)
y = 2*x*(x+5)
plt.plot(x, y)
plt.scatter(*zip(*xy), s=1)
plt.hlines(15000, x[0]-5, x[-1]+5, linestyles='dashed')
plt.show()
Beantwortet von – gboffi
Antwort geprüft von – Katrina (FixError Volunteer)