2016-01-26 5 views
12

Hier habe ich eine parametrische Gleichung.Python - Plotten Geschwindigkeit und Beschleunigungsvektoren an bestimmten Punkten

import matplotlib.pyplot as plt 
import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 

t = np.linspace(0,2*np.pi, 40) 

# Position Equation 
def rx(t): 
    return t * np.cos(t) 
def ry(t): 
    return t * np.sin(t) 

# Velocity Vectors 
def vx(t): 
    return np.cos(t) - t*np.sin(t) 
def vy(t): 
    return np.sin(t) + t*np.cos(t) 

# Acceleration Vectors 
def ax(t): 
    return -2*np.sin(t) - t*np.cos(t) 

def ay(t): 
    return 2*np.cos(t) - t*np.sin(t) 

fig = plt.figure() 
ax1 = fig.gca(projection='3d') 

z = t 
ax1.plot(rx(z), r(z), z) 
plt.xlim(-2*np.pi,2*np.pi) 
plt.ylim(-6,6) 
ax.legend() 

Also ich habe diese parametrische Gleichung, die diese Grafik erstellt. in meinem Code

![enter image description here

Ich habe über meine Geschwindigkeit und Beschleunigung parametrische Gleichungen definiert.

Was ich tun möchte, ist die grafische Darstellung der Beschleunigungs- und Geschwindigkeitsvektoren in meinem obigen Positionsdiagramm an definierten Punkten. (Id est, t = pi/2, 3pi/2, 2 pi)

Etwas wie folgt aus:

Python/matplotlib : plotting a 3d cube, a sphere and a vector?

aber ich möchte etwas mehr geradeaus tun, da ich jeden Punkt t definieren müssen in zwei Gleichungen.

Ist so etwas möglich? Ich kann nur Vektorfelder finden und was nicht.

So etwas wie das. enter image description here

Vielen Dank.

Frage bearbeiten

# t = pi/4 

t_val_start_pi4 = np.pi/4 
vel_start_pi4 = [rx(t_val_start_pi4), ry(t_val_start_pi4), t_val_start_pi4] 

vel_end_pi4 = [rx(t_val_start_pi4) + vx(t_val_start_pi4), ry(t_val_start_pi4)+vy(t_val_start_pi4), t_val_start_pi4 ] 

vel_vecs_pi4 = (t_val_start_pi4 , vel_end_pi4) 

vel_arrow_pi4 = Arrow3D(vel_vecs_pi4[0],vel_vecs_pi4[1], vel_vecs_pi4[2], mutation_scale=20, lw=1, arrowstyle="-|>", color="b") 

axes.add_artist(vel_arrow_pi4) 

Es gibt mir eine Fehlermeldung, Tuple out of index

+0

Die folgenden wird gezeigt, wie die Pfeile zu ziehen. Sobald Sie die Position des Vektor-Tails, die Länge des Vektors, die Richtung des Vektors und die Art des Vektors berechnet haben, können Sie den Vektor verwenden: http://matplotlib.org/examples/pylab_examples/arrow_simple_demo.html – boardrider

+0

stellt die erste Null die Position der Schwänze dar und die nächste die Länge der Vektoren? 'ax.arrow (0, 0, 0.5, 0.5, head_width = 0.05, head_length = 0.1, fc = 'k', ec = 'k')' – DarthLazar

+0

@DarthLazar - Bitte beachten Sie die [Dokumentation] (http: // matplotlib .org/api/axes_api.html # matplotlib.axes.Axes.arrow) für diese Methode –

Antwort

4

ich so das Gefühl der Nähe ist ... bekam auch die Farben das Beispielbild entsprechen :)

Ich bin nicht allzu erfahren mit dem Plotten auf Polarkoordinaten, obwohl (meist auf der dritten Dimension t Koordinate verwechselt).

Hoffentlich helfen und Sie könnten herausfinden, wie es zu erweitern

Ich nahm, was man hatte, fügte der Arrow3D Klasse von this answer, und fügte hinzu, von t eine einfache for-Schleife über einige Beispielwerte.

#draw a vector 
from matplotlib.patches import FancyArrowPatch 
from mpl_toolkits.mplot3d import proj3d 

class Arrow3D(FancyArrowPatch): 
    def __init__(self, xs, ys, zs, *args, **kwargs): 
     FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs) 
     self._verts3d = xs, ys, zs 

    def draw(self, renderer): 
     xs3d, ys3d, zs3d = self._verts3d 
     xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) 
     self.set_positions((xs[0],ys[0]),(xs[1],ys[1])) 
     FancyArrowPatch.draw(self, renderer) 

axes = fig.gca(projection='3d') 

t_step = 8 
for t_pos in range(0, len(t)-1, t_step): 
    t_val_start = t[t_pos] 
#  t_val_end = t[t_pos+1] 

    vel_start = [rx(t_val_start), ry(t_val_start), t_val_start] 
    vel_end = [rx(t_val_start)+vx(t_val_start), ry(t_val_start)+vy(t_val_start), t_val_start] 
    vel_vecs = list(zip(vel_start, vel_end)) 
    vel_arrow = Arrow3D(vel_vecs[0],vel_vecs[1],vel_vecs[2], mutation_scale=20, lw=1, arrowstyle="-|>", color="g") 
    axes.add_artist(vel_arrow) 

    acc_start = [rx(t_val_start), ry(t_val_start), t_val_start] 
    acc_end = [rx(t_val_start)+ax(t_val_start), ry(t_val_start)+ay(t_val_start), t_val_start] 
    acc_vecs = list(zip(acc_start, acc_end)) 
    acc_arrow = Arrow3D(acc_vecs[0],acc_vecs[1],acc_vecs[2], mutation_scale=20, lw=1, arrowstyle="-|>", color="m") 
    axes.add_artist(acc_arrow) 

axes.plot(rx(t), ry(t), t) 
plt.xlim(-2*np.pi,2*np.pi) 
plt.ylim(-6,6) 

vectors

+0

Jesus Kumpel, das ist erstaunlich. Vielen Dank. Schnelle Frage, wie würde ich die Pfeile an bestimmten Punkten von t zeichnen? Zum Beispiel wähle ich t als Nummer, um die Pfeile zu zeichnen. Wie würde ich darüber gehen? – DarthLazar

+0

Ich gebe ein Beispiel meiner Frage in einen bearbeiteten Teil meines Beitrags ein – DarthLazar

+1

Ihre Velocity Vektoren sind falsch für 'vel_vecs_pi4' Sie müssen die Start- und Ende Vektoren wie für' vel_vecs' zippen –

Verwandte Themen