WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Erstellen eines Videos mit getframe bringt nur ersten Frame

 

errordynamics
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2014, 22:57     Titel: Erstellen eines Videos mit getframe bringt nur ersten Frame
  Antworten mit Zitat      
Hallo,

ich bin neu in diesem Forum, und habe gleich mal eine Frage mit folgendem Hintergrund:
Ich schreibe ein Programm, dass mir die Wärmeleitgleichung veranschauen soll. Dazu möchte ich ein Video machen mit 3 subplots: Links das ursprüngliche Modell, in der Mitte ein zweites und rechts die Differenz der beiden Modelle.
Das kommt alles in eine figure, dann wird mit getframe abgefragt und dann an das Video übergeben. Wenn ich in der Figure einfach nur ein Modell plote (sagen wir das linke von gerade), funktioniert alles tadellos. Wenn ich nun aber alle drei Modelle plotte, dann zeigt mir das Video durchgängig nur den Anfangszustand, also den ersten Frame.

Was mache ich falsch?

Vielen vielen lieben Dank für eure Hilfe!

(Im Programm ist hier nur der letzte Teil interessant und übrigens auch so markiert. Allerdings sind zum Durchlaufen natürlich die Daten zum Plotten vonnöten)

Code:

close all
clear
clc


%% Angaben

n= 15; % Anzahl der Punkte in einer Reihe

Kochfeld = 0*ones(n,n);

sig=10;

% for i=-n/2:1:n/2-1
%     for j=-n/2:1:n/2-1
%         Kochfeld(i+n/2+1,j+n/2+1) = 50*(exp(-0.5*i^2/sig^2)+exp(-0.5*j^2/sig^2));
%         wert = (-(i*i+j*j)+(n*n)/2)/n;
%         if wert < 100
%             Kochfeld(i+n/2+1,j+n/2+1) = wert;
%         else
%             Kochfeld(i+n/2+1,j+n/2+1) = 100;
%         end
%     end
% end
%Kochfeld

%[X,Y]=meshgrid(1:n,1:n);
%surf(X,Y,Kochfeld);


%% Diskretisierung

laenge = 1; % Länge des quadratischen Feldes
h=laenge/(n+1); % Schrittlänge des Gitters

% Zustand x:
x = zeros(n*n,1); % Gitterdiskretisierung im Ort
x_0 = zeros(n*n,1);

% Matrix in x_0 diskretisieren
for i=n:-1:1
    for j=1:n
        x_0(j+n*(n-i)) = Kochfeld(i,j);
    end
end

% Eingang u


u = [100 100 100 100]';

% A
A1 = diag(ones(n-1,1),-1) + diag(-4*ones(n,1),0) + diag(ones(n-1,1),1);
A2 = diag(ones(n,1),0);
A1s = eye(n);
A2s = diag(ones(n-1,1),-1) + diag(ones(n-1,1),1);
A = kron(A1s,A1) + kron(A2s, A2);
A = A /h/h; %irgendwas zerhauts hier...., A wird dadurch instabil...
clear A1 A2 A1s A2s;

% B
B = zeros(n*n,4);
for i=1:n
    B(i,1) = 1;
    B(i*n,2) = 1;
    B(n*n-n+i,3) = 1;
    B((i-1)*n+1,4)=1;
end
B=B/h/h;

% C
%C=eye(n*n,n*n);
C=ones(1,n*n);

% Ausgang y
%y = zeros(size(C,1),1);
y=C*x_0;



%% Feedback errechnen
%F = eye(4,n*n); % nur mal so
% F=zeros(4,n*n);

%% Balanced Truncation

% A*W_c + W_c*A^T + B*B^T = 0
% A^T*W_o + W_o*A + C^T*C = 0
W_c = lyap(A,B*B');
W_o = lyap(A',C'*C);

% W_c = S^T * S, Cholesky
% W_o = R^T * R,    "
S = chol(W_c+(10^5)*eps*eye(size(W_c)));
R = chol(W_o+(10^5)*eps*eye(size(W_c)));

% SVD
[U,Sig,V] = svd(S*R');

% r
r=5;
U1 = U(:,1:r);
Sig1 = Sig(1:r,1:r);
V1 = V(:,1:r);

% Transformationsmatrizen
Tl = Sig1^(-1/2) * V1' * R;
Tr = S' * U1 * Sig1^(-1/2);

% neues System _b Balanced Trancated. Wink
Ab = Tl * A * Tr;
Bb = Tl * B;
Cb = C*Tr;


%% Iteration mit Feedback

delta_t = 5.e-3;
ATilde = eye(n*n)+A*delta_t;
BTilde = B*delta_t;


xb = Tl* x_0;

%% Diskretisierung in der Zeit

Ad = (1/delta_t) * inv((1/delta_t) * eye(n*n,n*n) - A);
Bd = ((1/delta_t) * eye(n*n,n*n)-A)\B;


Abd = (1/delta_t) * inv((1/delta_t) * eye(r,r) - Ab);
Bbd = ((1/delta_t) * eye(r,r)-Ab)\Bb;

xx=[];
yy=[];
xx=x_0;
yy=C*x_0;

for i=1:100
    %if i<20
    xneu=Ad*xx(:,end)+Bd*u;
    %else
    %    xneu = Ad*xx(:,end)+Bd*[0 0 0 0]';
    %end
    xx=[xx xneu];
    yy=[yy C*xneu];
end

xxb=[];
yyb=[];
xxb = Tl *x_0;
yyb = Cb * xxb;

for i=1:100
    %if i<20
    xbneu = Abd*xxb(:,end)+Bbd*u;
    %else
    %    xbneu = Abd*xxb(:,end)+Bbd*[0 0 0 0]';
    %end
    xxb = [xxb xbneu];
    yyb = [yyb Cb*xbneu];
end


err=[0];
err_u=[0];
time=[0];


for i=1:length(yy)
    tmp=0;
    tmpu=0;
    for j=1:i
      tmp=tmp+(yy(j)-yyb(j))'*(yy(j)-yyb(j));
      tmpu=tmpu+(u)'*(u);
    end
    err=[err sqrt(tmp)*delta_t];
    err_u=[err_u sqrt(tmpu)*delta_t];
    time=[time time(end)+delta_t];
end

sumSigma = 0;
for i=r+1:n
    sumSigma = sumSigma + Sig(i,i);
end

errBound = err_u * sumSigma;

%%
figure(4)
plot(time,err,'linewidth',2);
hold on
plot(time,errBound,'color','red','linewidth',2);
% TODO hier noch mal sigma-Werte Summe

     
 
   
%
% error_y=yy(1)-yyb(1);
% for i=2:length(yy)
%    error_y=[error_y error_y(end)+yy(i)-yyb(i)];
% end
% error_y=error_y.^2;
%
% error_sum=error_y(1);
% for i=2:length(yy)
%    error_sum=[error_sum error_sum(end)+error_y(i)];
% end
% error_sum=sqrt(error_sum);
%
% plot(error_sum);



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Ab hier ist der Code hierfür interessant Wink
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


figure(1);

% Video vorbereiten
writerObj = VideoWriter('video.avi');
open(writerObj);


[X,Y]=meshgrid(h:h:1-h,h:h:1-h);

for k=1:20
    Z=eye(n,n);
    for i=n:-1:1
        for j=1:n
            Z(i,j)=xx(j+n*(n-i),k);
            xt = Tr*xxb(:,k);
            Z1(i,j)=xt(j+n*(n-i));
        end
    end
   

   
    pause(delta_t)
%    figure(1)
    subplot(1,3,1)
    surf(X,Y,Z);
    zlim([0 max(u)])
%     figure(2)
    subplot(1,3,2)
    surf(X,Y,Z1);
    zlim([0 max(u)])
%     figure(3)
    subplot(1,3,3)
    surf(X,Y,Z1-Z);
    zlim([-10 10])
    k
    if k==1
        pause
    end
   
    % Video bauen
    %colormap hsv
    frame = getframe(figure(1));
    writeVideo(writerObj,frame);
    FF(k) = getframe(figure(1));

end

% Video schreiben
close(writerObj);
movie2avi(FF, 'film.avi', 'Compression', 'none');

 disp('Done')
 
Private Nachricht senden Benutzer-Profile anzeigen


errordynamics
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2014, 02:00     Titel:
  Antworten mit Zitat      
Hallo,

möchte es euch nicht vorenthalten, habe des Rätsels Lösung gefunden. Es reicht, nach dem figure(1) ein
Code:
set(gcf,'Renderer','zbuffer');
zu schreiben.

Viele Grüße!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.