2017-05-01 2 views
-1

Je veux vous demander comment faire un film de la fonction tracée en raison du temps pour t = 0: 0.1: 2. Dans le code, j'ai écrit la formule de l'équation différentielle (gif) après avoir écrit la formule du coefficient (a). Dans la formule de gif, j'ai donné (x-v * t) au lieu de (x) pour le rendre dépendant du temps (t). Je l'ai tracé bien sûr, mais juste pour une valeur de temps. Je suis coincé sur la façon de faire le graphique pour différentes valeurs de temps entre 0 et 2 avec step width = 0.1 en tant que film. J'espère que vous pourrez m'aider à ce sujet.Comment est-ce que je peux faire un film de la fonction tracée en raison du temps (pour t = 0: 0.1: 2)?

syms x; 

    a=zeros(110,1); 
    %stage 3 

    v=1; %m/s 
    gif=0; 
    t=0; 
    for i=1:1:110 

    a(i)=(2/50)*(int(x*sin((i*pi*x)/50),x,0,1)+int((2-x)*sin((i*pi*x)/50),x,1,2)); 
    gif =gif + a(i)*sin((i*pi*(x-v*t)/50)); 

    end 

    clear x 
    figure(1) 
    x=[-20 20]; 
    plot=fplot(gif,x); 
    grid on 
    xlabel('space'); 
    ylabel('phi(x)'); 

Répondre

0

Essayez ceci:

syms x; 

a=zeros(110,1); 
%stage 3 

v=1; %m/s 
gif=0; 
t=0; 
for i=1:1:110 

    a(i)=(2/50)*(int(x*sin((i*pi*x)/50),x,0,1)+int((2-x)*sin((i*pi*x)/50),x,1,2)); 
    gif =gif + a(i)*sin((i*pi*(x-v*t)/50)); 

end 

clear x; 
x = -20:20; % your x values 
y = double(subs(gif,x)); % calculate your y values 
figure; hold on; grid on; 
xlabel('space'); 
ylabel('phi(x)'); 
for i = 1:length(x)-1 
    plot(x(i:i+1),y(i:i+1),'b'); 
    pause(0.1) % pause to create a frame. 
end 

L'idée de base est d'avoir une boucle qui trace deux points et une ligne à la fois. utilisez pause(timeIntervalInSecond) pour mettre en pause et créer visuellement une image.

0

Votre solution est très très lente. N'utilisez pas symbolique quand ce n'est pas nécessaire. et n'utilisez pas le nom de la variable qui est le nom de la fonction ('plot'). C'est comment vous devriez le faire:

clear 
syms x k real 
[email protected](f) simplify(f, 'Steps', 100, 'IgnoreAnalyticConstraints', true); 
a=matlabFunction(simp((2/50)*(int(x.*sin((k.*pi.*x)/50),x,0,1)+int((2-x).*sin((k.*pi.*x)/50),x,1,2)))); 

clearvars -except a 

[email protected](v,k,x,t)sum(a(1:k).*sin(((1:k).*pi.*(x-v.*t)/50)),2); 

v=1; 
[email protected](x,t)gif(v,110,x,t); 

figure(1) 
x=[-20:0.1:20]'; 
h=plot(x,gif_110(x,0)); 
grid on;xlabel('space');ylabel('phi(x)'); 

for t=0:0.1:2 
    h.YData=gif_110(x,t); 
    drawnow; 
    pause(0.1); 
end 
0

Les autres réponses joue le film directement, ce qui peut ne pas être en temps réel, en fonction de la vitesse de votre ordinateur et la complexité de votre fonction. Comme alternative, vous pouvez enregistrer le film et play it après, qui jouera le film avec la vitesse désirée.

% record the movie 
F(frameCount) = struct('cdata',[],'colormap',[]); 
for i=1:frameCount 
    plot(.., ..) % plot your data 
    drawnow 
    F(i) = getframe; 
end 

% Play the movie one time with the correct frame speed 
movie(F,1,1/dt);