Matlab - Como animar varios puntos a la vez?

 
Vista:
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 10/07/2019 21:46:16
En general se trata de ajustar una misma velocidad para un grupo de objetos que se comienzan a desplazar a diferentes velocidades entre sí, se aplican conceptos de álgebra lineal para calcular tal velocidad.
Hasta aquí todo bien.
El problema es que no se como graficar el movimiento de cada objeto.
Al inicio se tienen varios objetos (la cantidad de estos se establece de manera arbitraria), estos objetos se mueven con velocidades iniciales diferentes de cero y diferentes entre sí
La idea que tengo es animar estos objetos (puntos creo que es lo más viable), al inicio se vieran puntos desplazandose a ciertas velocidad hasta que se mueven al parejo. Eso es lo que no se hacer.

Aquí lo que llevo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
%Se define a la matriz Laplaciana
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
L=B*B';

% Cálculo de Valores propios y Núcleo
lambda = eig(L) % Valores propios
Lr = rref(L)  % reduce por Gauss

% Solución numérica de la Ecuación Diferencial 

t = linspace(0,15,1000);    % tiempo de simulacion 0-20s con 1000 divisiones
x0 = [1;2;3;4;5;6] % velocidades iniciales de cada objeto/definición arbitraria implícita cantidad objetos
[t,x] = ode45(@consenso,t,x0);   % solución con ODE45: Manda llamar a la función consenso

%% %Gráficas
subplot(2,1,1)
plot(t,x,'linewidth',1.5)
xlabel('tiempo [s]')
ylabel('Velocidad [m/s]')% gráfica de la velocidad
grid

subplot(2,1,2)
plot (real (lambda), imag (lambda),'bs','linewidth',1.5 ),grid
axis ([-2 10 -2 2]) 
xlabel('eje real')
ylabel('eje imaginario')% gráfica de la velocidad
legend('Valores propios')
1

Ahora bien, lo que quiero es graficar/animar los objetos con las velocidades mostradas, además de generalizar esto para n objetos, es decir dependiendo de lo que se escriba en la línea

1
x0 = [objeto1;objeto2;objeto3;...]

se generen las gráficas con los objetos respectivos en vez de ajustar el código cada vez para un determinado número de objetos

Gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 11/07/2019 00:10:21
te voy a adjuntar un ejemplo básico para que puedas guiarte en tu propósito, recuerda que con el pause puedes regular la velocidad de tu animación:

1
2
3
4
5
6
7
coor =  rand(2,n) ;
figure
for i=1:900
    plot(coor(1,i),coor(2,i),'.r','MarkerSize',15)
    axis([0 1 0 1])
    pause(.1)
end

Preguntas Relacionadas


animación de puntos en plot matlab
movimiento de puntos en matlab
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 11/07/2019 17:58:15
Gracias a las sugerencias de Jesús David, logré el siguiente código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Video = VideoWriter('archivo');
myVideo.FrameRate = 10;
open(Video)
x0 = 0;
y = 0;
v = 2;
for time=1:100
x = x0 + v*time;
plot(x, y,'r*');
axis([-1 250 -10 10])
drawnow();
%pause(0.1)
    frame = getframe(gcf);
    writeVideo(Video, frame);
end
close(Video)
que genera la siguiente animación

1

Pero sigo sin poder
*.-Enlazar las variables para animarlas
En este caso los valores de las velocidades están guardadas en cada columna de la matriz x, dicho de otro modo la primera columna de la matriz x son las velocidades de un objeto, la segunda es del segundo,etc. Es decir el movimiento tiene sería de acuerdo a los valores de una columna
Entonces no se como enlazar esto con la animación supongo que con un for, pero no logro ver que más
Muchas gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 11/07/2019 20:24:15
te dejo un ejemplo con varios objetos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x0 = [0 0 0];
y = [0 0 1];
v = rand(3,100);
figure
x=x0;
for time=1:100
    for k=1:length(x0)%numero de objetos
x(k) = x0(k) + v(k,time)*time;
x0(k)=x(k);
plot(x(k), y(k),'r*');
hold on
    end
    hold off
axis([-1 250 -10 10])
drawnow();
pause(0.1)
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 13/07/2019 01:54:21
Me avergüenza mi ignorancia. No me queda el sistema.
Adiciono la función concenso (archivo aparte llamada desde el otro script, resuelve una ecuación diferencial)
1
2
3
4
5
6
7
8
9
%%%Función consenso
 
function [xp] = consenso(t,x)
%se define una matriz laplaciana
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
L=B*B';


xp = -L*x;


La última version de script principal es la que sigue


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
%%%Define (otra vez) a la matriz Laplaciana
 
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
L=B*B';

%% Cálculo de Valores propios y Núcleo
lambda = eig(L) %% Valores propios
Lr = rref(L)  %% reduce por Gauss

%% Solución numérica de la Ecuación Diferencial % % % %

t = linspace(0,20,1000);    % tiempo de simulacion 0-20s con 1000 divisiones
x0 = [1;2;3;4;5;6] % condiciones iniciales, cantidad de objetos (6 pero es arbitrario)
[t,x] = ode45(@consenso,t,x0);   % solución con ODE45: Manda llamar a la función consenso

y = [1;0;0;0;0;0];
%v = x(:,end);
figure(1)
x=x0;
for time=1:t
    for k=1:length(x0)
        for j=1:x(:,end)%segun yo aqui se itera sobre las columnas de la matriz x en donde se guardan  las velocidades
        x(k) = x0(k) + v(k,time)*time;
	    x0(k)=x(k);
	    plot(x(k), y(k),'r*');
	    hold on
        end
    end
  hold off
  axis([-1 250 -10 10])
  drawnow();
  pause(0.1)
end




%% %Gráficas
figure(2)
subplot(2,1,1)
plot(t,x,'linewidth',1.5)
xlabel('tiempo [s]')
ylabel('Velocidad [m/s]')% gráfica de la velocidad
grid

subplot(2,1,2)
plot (real (lambda), imag (lambda),'bs','linewidth',1.5 ),grid
axis ([-2 10 -2 2]) 
xlabel('eje real')
ylabel('eje imaginario')% gráfica de la velocidad
legend('Valores propios')

Pero lo que me da es esto



1

Ojalá me puedan orientar, disculpen las molestias.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 13/07/2019 03:19:50
ten cuidado esa x(:,end) no me convence en el for j=1:x(:,end), debería ser un size(x,1) si quieres obtener el número total de filas o un size(x,2) si quieres obtener el número total de columnas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 14/07/2019 22:28:50
Saludos. muchas gracias sobre todo a Jesús David por su valioso apoyo.
Me falta un pocop todavía ya que no puedo ajustar que los puntos se muevan según los valores guardados en cada columna de la matriz x, la idea es que cada columna representa las velocidades de cada objeto partiendo de un valor arbitrario. Esto se define en la linea
1
x0 = [1;2;3;4;5;6]

Hasta ahora lo que llevo es lo siguiente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
clc
clear
%%%Defina a la matriz Laplaciana
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
L=B*B';


%% Cálculo de Valores propios y Núcleo
lambda = eig(L) %% Valores propios
Lr = rref(L)  %% reduce por Gauss

%% Solución numérica de la Ecuación Diferencial % % % %

t = linspace(0,5,1000);    % tiempo de simulacion 0-20s con 1000 divisiones
x0 = [1;2;3;4;5;6] % condiciones iniciales
%x0 = [1.5;2;10;2.5;6;8]; 
[t,x] = ode45(@consenso,t,x0);   % solución con ODE45: Manda llamar a la función consenso
y = [0;1;2;3;4;5];
px= [0;0;0;0;0;0];
v=1:size(x,1)

Video = VideoWriter('archivo');
myVideo.FrameRate = 10;
open(Video)
figure(1)
for time=1:size(t)
    for k=1:length(x0)%numero de objetos
        for j=1:size(x,2) 
            x(j) = px(j) + v(j)*time;
            x0(k)=x(k);
            plot(x(j), y(k),'r*');
            hold on
        end
    end    
  hold off
  axis([-1 1000 -1 7])
  drawnow();
  pause(0.1)
  frame = getframe(gcf);
  writeVideo(Video, frame);
end
close(Video)

%% %Gráficas
subplot(2,1,1)
plot(t,x,'linewidth',1.5)
xlabel('tiempo [s]')
ylabel('Velocidad [m/s]')% gráfica de la velocidad
grid

subplot(2,1,2)
plot (real (lambda), imag (lambda),'bs','linewidth',1.5 ),grid
axis ([-2 10 -2 2]) 
xlabel('eje real')
ylabel('eje imaginario')% gráfica de la velocidad
legend('Valores propios')

que produce la siguiente animación

file
Pero el problema es todos se mueven a la misma velocidad y no toman los valores de las columnas, cosa que según entiendo en
1
v=1:size(x,1)
se efectua.
Además me llama la atención que el primer valor de la primer columna cambia a 100 cuando se supone que debería ser 1 y la otra gráfica también se modifica, tal parece que no se efectuara la funcion concenso o que no arroja nada.

2
Muchas gracias nuevamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 15/07/2019 01:49:45
Después de un pequeño ajuste en en la línea
1
x(j) = px(j) + v(time)*time;
la secuencia animada es la siguiente

animacion.2
Pero sigue sin mostrar las diferentes velocidades.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 15/07/2019 20:21:03
Actualización
Corregí la línea que extrae las velocidades de la matriz x para asignarla a la variable v que va iterando
sobre los objetos

Antes
1
v=1:size(x,1)

Ahora
1
v=x(1:end,:)

Pero ahora genero una animación en la cual se siguen moviendo al parejo desde el inicio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 15/07/2019 22:30:53
si quieres para un análisis más detallado, sube tu archivo principal actualizado incluyendo "consenso" y todos aquellos archivos necesarios para ejecutar el programa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 16/07/2019 06:02:10
gracias por tu ayuda y consejo bro, lo que está en el hilo es todo lo que hay, la función consenso ya la publique un poco más arriba, esa si funciona ya que si calcula las velocidades a las que deberían moverse los puntos, lo que no hace el loop es cargar las columnas dentro de la línea
1
x(j) = px(j) + v(j)*time;

según entiendo (es una expresión nada mas) no estoy definiendo v de manera que se pasen a la línea anterior para que itere sobre las velocidades, por eso lo anima igual porque tengo lo mismo para todos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 16/07/2019 19:01:12
has hecho varias modificaciones a tu código, por eso la importancia de consolidar todo en un mismo mensaje de tal forma que cualquier persona pueda rápidamente copiar y ejecutarlo en su Programa y no tenga que ir cambiando cada línea que has modificado, en eso se basa el soporte.
Así que insisto si deseas anexa en un mismo mensaje lo necesario para ejecutar el código. Así sería más fácil recibir ayuda

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 16/07/2019 19:48:06
Gracias de nuevo Jesús David

El script principal es
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
clc
 
clear
 
%%%Defina a la matriz Laplaciana
 
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
 
L=B*B';



%% Cálculo de Valores propios y Núcleo

lambda = eig(L) %% Valores propios

Lr = rref(L)  %% reduce por Gauss


%% Solución numérica de la Ecuación Diferencial % % % %


t = linspace(0,5,1000);    % tiempo de simulacion 0-20s con 1000 divisiones

x0 = [1;2;3;4;5;6] % condiciones iniciales

%x0 = [1.5;2;10;2.5;6;8]; 

[t,x] = ode45(@consenso,t,x0);   % solución con ODE45: Manda llamar a la función consenso

y = [0;1;2;3;4;5];

px= [0;0;0;0;0;0];

v=x(1:end,:)

 

Video = VideoWriter('archivo');

myVideo.FrameRate = 10;

open(Video)

figure(1)

for time=1:size(t)

    for k=1:length(x0)%numero de objetos

        for j=1:size(x,2)

            x(j) = px(j) + v(time)*time;

            x0(k)=x(k);

            plot(x(j), y(k),'r*');

            hold on

        end

    end

  hold off

  axis([-1 1000 -1 7])

  drawnow();

  pause(0.1)

  frame = getframe(gcf);

  writeVideo(Video, frame);

end

close(Video)

 

%% %Gráficas

subplot(2,1,1)

plot(t,x,'linewidth',1.5)

xlabel('tiempo [s]')

ylabel('Velocidad [m/s]')% gráfica de la velocidad

grid

 

subplot(2,1,2)

plot (real (lambda), imag (lambda),'bs','linewidth',1.5 ),grid

axis ([-2 10 -2 2])

xlabel('eje real')

ylabel('eje imaginario')% gráfica de la velocidad

legend('Valores propios')

la función consenso por separado en su propio m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%%%Función consenso
 
 
 
function [xp] = consenso(t,x)
 
%se define una matriz laplaciana
 
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
 
L=B*B';



xp = -L*x;

No logro que los valores tomen los valores almacenados en las columnas de la matriz x, para que se vayan moviendo de acuerod a esto, tal vez esto redunde en que al inicio no se vean todos los puntos ya que se mueven a diferente velocidad, pero eventualmente tendrían que quedarse moviendo a la par, es decir como se ve en la animación anterior.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 28/07/2019 03:18:05
Saludos , aquí dejo lo que pienso es una solución por si es de interés .Gracias.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
%%%Práctica Consenso
clc
clear
%%%Defina a la matriz Laplaciana
 
%L=[2 -1 -1;-1 1 0;-1 0 1] %%ejemplo práctica
 
%L=[3 -2 0 -1 0 0;-2 4 -1 0 -1 0;0 -1 1 0 0 0;-1 0 0 2 -1 0;0 -1 0 -1 3 -1;0 0 0 0 -1 1];
 
%B=[1 0 0 0 0;-1 1 1 0 0;0 0 0 -1 0;0 -1 0 0 1;0 0 -1 1 0;0 0 0 0 -1];
%L=B*B'
B=[1 1 0 0 0;-1 0 1 1 0;0 0 0 -1 0;0 -1 0 0 0;0 0 -1 0 1;0 0 0 0 -1];
L=B*B';
 
 
 
%% Cálculo de Valores propios y Núcleo
lambda = eig(L) %% Valores propios
Lr = rref(L)  %% reduce por Gauss
 
%% Solución numérica de la Ecuación Diferencial % % % %
 
t = linspace(0,5,1000);    % tiempo de simulacion 0-20s con 1000 divisiones
x0 = [1;2;3;4;5;6] % condiciones iniciales
%x0 = [1.5;2;10;2.5;6;8]; 
[t,x] = ode45(@consenso,t,x0);   % solución con ODE45: Manda llamar a la función consenso
y = [0;1;2;3;4;5];
px= [0;0;0;0;0;0];
v=1:size(x,1)
figure(1)
%size(x,1)
%size(x,2)
%size(t,1)
for time=1:size(t)
    for k=1:length(x0)%numero de objetos
        for j=1:size(x,2)
            x(j) = px(j) + v(j)*time;
            x0(k)=x(k);
            plot(x(j), y(k),'r*');
            hold on
        end
    end
  hold off
  axis([-1 250 -1 7])
  drawnow();
  pause(0.1)
end
 
 
 
 
 
 
 
 
%% %Gráficas
subplot(2,1,1)
plot(t,x,'linewidth',1.5)
xlabel('tiempo [s]')
ylabel('Velocidad [m/s]')% gráfica de la velocidad
grid
 
subplot(2,1,2)
plot (real (lambda), imag (lambda),'bs','linewidth',1.5 ),grid
axis ([-2 10 -2 2])
xlabel('eje real')
ylabel('eje imaginario')% gráfica de la velocidad
legend('Valores propios')
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Carlos
Val: 44
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como animar varios puntos a la vez?

Publicado por Juan Carlos (22 intervenciones) el 28/07/2019 22:01:03
Se me olvidaba la animación resultado del código anterior

archivo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar