2016-01-26 17 views
12

Qui, ho un'equazione parametrica.Python - Tracciare i vettori di velocità e accelerazione in determinati punti

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() 

Quindi ho questa equazione parametrica che crea questo grafico.

![enter image description here

ho definito la mia velocità e l'accelerazione parametrici equazioni sopra nel mio codice.

Quello che voglio fare è tracciare i vettori di accelerazione e velocità nel grafico della mia posizione sopra in punti definiti. (Id est, t = pi/2, 3pi/2, 2pi)

Qualcosa di simile a questo:

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

ma voglio fare qualcosa di più semplice dal momento che ho per definire ogni punto t in due equazioni.

È possibile una cosa del genere? Posso solo trovare campi vettoriali e cosa no.

Qualcosa di simile. enter image description here

Grazie.

Modifica domanda

# 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) 

E mi daranno un errore che dice Tuple out of index

+0

Quanto segue mostra come disegnare frecce. Una volta che calcoli la posizione della coda del vettore, la lunghezza del vettore, la direzione del vettore e decidi lo stile del vettore, puoi usarlo per disegnare il vettore: http://matplotlib.org/examples/pylab_examples/arrow_simple_demo.html – boardrider

+0

così il il primo zero rappresenta la posizione delle code e il prossimo rappresenta la lunghezza dei vettori? 'ax.arrow (0, 0, 0.5, 0.5, head_width = 0.05, head_length = 0.1, fc = 'k', ec = 'k')' – DarthLazar

+0

@DarthLazar - Vedere la [documentazione] (http: // matplotlib .org/api/axes_api.html # matplotlib.axes.Axes.arrow) per quel metodo –

risposta

4

mi sento come questo è vicino ... Anche ha i colori per abbinare l'immagine del campione :)

Non ho molta esperienza con il plottaggio su coordinate polari, tuttavia (per lo più confuso sulla coordinata t della terza dimensione).

Speriamo che questo vi aiuterà e si potrebbe capire come estenderlo

ho preso quello che aveva, ha aggiunto la classe Arrow3D da this answer, e ha aggiunto un semplice ciclo for su alcuni valori di esempio da t.

#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

Gesù, amico, è fantastico. Grazie. Domanda veloce, come andrei a tracciare le frecce in certi punti di t? Ad esempio, seleziono t come numero per tracciare le frecce in. Come potrei andare su questo? – DarthLazar

+0

Inserirò un esempio della mia domanda in una parte modificata del mio post – DarthLazar

+1

I vettori di velocity non sono corretti per 'vel_vecs_pi4' devi zippare i vettori di inizio e fine come ho fatto per' vel_vecs' –