Verfasst am: 25.12.2012, 15:34
Titel: Minimalbeispiel gibt Fehlerneldung aus
Ich möchte lernen wie man ein Video erstellt und wollte anhand eines laufenden Minimalbeispiels mich hoch arbeiten zu meinem eigentlich gewünschten Video. Leider klappt selbst das Minimalbeispiel nicht.
Ich bin auf File- New - Script gegangen und hab folgenden Code eingetippt:
Mit diesem clear M hat es nun funktioniert. Deshalb kam ich gar nicht mehr dazu das andere zu testen, also erstmal danke an euch beide. Ich melde mich sicher schon bald mit anderen Problemen.
Ok, ich hab nun versucht dieses Minimalbeispiel in meine eigentliche AUfgabe zu integrieren, hier das Ergebnis:
Code:
% Quadratische Suche % Die Funktion, hier sinc, sowie die Intervallgrenzen a und b werden im % Command Window gewählt. Die beiden Endpunkte des Intervalls sowie der % Mittelpunkt dienen als Startpunkte. clear M
a=2/5;
b=2 ;
x=[ b (a+b)/2 a];
% Nun wird die Funktion an den Startpunkten ausgewertet. for j=1:10
y=sinc(x) ;
% Im nächsten Schritt werden die dividierten Differenzen der % Newtondarstellung berechnet und in einer Matrix DD gesammelt. % In der ersten Spalte werden die Stützstellen gespeichert.
DD(1:length(x),1)=x ;
% In der zweiten Spalte werden die Funktionswerte an den Stützstellen % gespeichert.
DD(1:length(y),2)=y ;
% In der dritten Spalte stehen die dividierten Differenzen in denen zwei % aufeinanderfolgende Stützstellen verbaut wurden, in der vierten Spalte % jene, in denen alle drei verbaut wurden. for k=1:2
DD(k,3)=(DD(k+1,2)-DD(k,2))/(DD(k+1,1)-DD(k,1));
end for k=1
DD(k,4) = (DD(k+1,3)-DD(k,3))/(DD(k+2,1)-DD(k,1));
end % Jetzt wird das Minimum der Parabel berechnet und ein Schaubild mit % der Funktion und der Parabel geplottet.
x(4)=0.5*(x(1)+x(2)-(DD(1,3)/DD(1,4))) ;
q=linspace(a,b) ;
w= [ sinc(q) ; DD(1,4).*(q-x(1)).*(q-x(2))+DD(1,3).*(q-x(1))+DD(1,2)] ;
s=x(4); % Das Minimum der Parabel im Schaubild markieren
d=sinc(x(4)) ;
plot(q,w,s,d,'o');
axis([a b -0.30.7])
M(j)=getframe;
% Die Stützstelle mit dem niedrigsten Index fällt raus damit es wieder % drei Stützstellen sind.
x(1)=[] ;
end movie(M,1,0.5)
1. Der Film läuft nicht direkt in der geforderten Geschwindigkeit ab, sondern ersteinmal sehr schnell, wie krieg ich das weg?
2. Die Achsenbeschriftung ist hier manuell vorgenommen worden, ich möchte aber, dass diese sich automatisch je nach Funktion sinnvoll ergibt.
Wie krieg ich das hin?
3. Wie kann ich in die einzelnen Bilder noch eine Legende einfügen, die erklärt was, was ist?
Falls es jemand selber mal laufen lassen will braucht er noch die sinc funktion
Code:
function[ z ] = sinc( x )
%UNTITLED8 Summary of this function goes here
% Detailed explanation goes here
Es ist Wochenende. Natürlich machen auch mal die Antwortenden mal Pausen. Drängeln ist nicht hilfreich, um Leuten zu motivieren, die in ihrer Freizeiz freiwillig und unentgeltlich helfen.
Zitat:
1. Der Film läuft nicht direkt in der geforderten Geschwindigkeit ab, sondern ersteinmal sehr schnell, wie krieg ich das weg?
Stimmt. Zunächst werden die Bilder erzeugt so schnell wie möglich, danach wird das Movie mit der eingestellten Geschwindigkeit abgespielt. Bei Bedarf könnte ein PAUSE-Befehl hilfreich sein, um auch die Erstellung zu verlangsamen.
Zitat:
2. Die Achsenbeschriftung ist hier manuell vorgenommen worden, ich möchte aber, dass diese sich automatisch je nach Funktion sinnvoll ergibt.
Was bedeutet "sinnvoll ergibt" hier? Das lässt sich weder für Matlab noch für uns erraten.
Zitat:
3. Wie kann ich in die einzelnen Bilder noch eine Legende einfügen, die erklärt was, was ist?
Die Tipps waren schon ziemlich fett. Aber ich hab noch weitere Fragen.
Zu den Achsen:
Ich hätte gerne, dass die Achsen immer so bleiben wie sie im ersten Bild meiner Sequenz von matlab automatisch eingestellt worden sind. Wie mach ich das?
2. Ist es möglich in den Bildern einen Counter sichtbar zu machen, der anzeigt das wievielte Bild gerade zu sehen ist?
Abgesehen von den anderen Problemen finde ich deine sinc Funktion etwas komisch. Sie entspricht zum einen nicht der Definition der sinc Funktion (http://de.wikipedia.org/wiki/Sinc-Funktion) und zum anderen müsste es
@Harald, das mit den Achsen hab ich nun hinbekommen, aber es ist nicht wirklich elegant. Ich hab einfach das erste Bild aus der Schleife genommen, die Achsen gespeichert und dann diesen gespeicherten Wert in eigentliche Schleife wieder eingebaut.
Wie ich Text einfüge weiß ich nun aber ich kapier nicht wie ich einen Laufindex in den Text einfüge.
Code so far:
Code:
% Quadratische Suche % Die Funktion, hier bspfunc, wird in einer seperaten Datei definiert. % Die beiden Endpunkte des Intervalls sowie der Mittelpunkt dienen als % Startpunkte. clear M %anlegen der Matrix für den Film
clear fff %
a=2/5; % Intervallgrenzen müssen je nach Funktion hier eingegeben werden
b=2 ;
x=[ b (a+b)/2 a];
for j=1:1% Schleife zur Erstellung der Bildersequenz. Wenn man hier eine % zu hohe Zahl wählt gibt es Probleme, da dann bei der Berechnung der % dividierten Differenzen irgendwann 0/0 berechnet wird, da "nur" mit % 16 Dezimalstellen rechnet.
y=bspfunc(x) ; % Nun wird die Funktion an den Startpunkten ausgewertet. % Im nächsten Schritt werden die dividierten Differenzen der % Newtondarstellung berechnet und in einer Matrix DD gesammelt. % In der ersten Spalte werden die Stützstellen gespeichert.
DD(1:length(x),1)=x ;
% In der zweiten Spalte werden die Funktionswerte an den Stützstellen % gespeichert.
DD(1:length(y),2)=y ;
% In der dritten Spalte stehen die dividierten Differenzen in denen zwei % aufeinanderfolgende Stützstellen verbaut wurden, in der vierten Spalte % jene, in denen alle drei verbaut wurden. for k=1:2
DD(k,3)=(DD(k+1,2)-DD(k,2))/(DD(k+1,1)-DD(k,1));
end for k=1
DD(k,4) = (DD(k+1,3)-DD(k,3))/(DD(k+2,1)-DD(k,1));
end % Jetzt wird das Minimum der Parabel berechnet und ein Schaubild mit % der Funktion und der Parabel geplottet.
x(4)=0.5*(x(1)+x(2)-(DD(1,3)/DD(1,4))) ;
q=linspace(a,b) ;
w= [ bspfunc(q) ; DD(1,4).*(q-x(1)).*(q-x(2))+DD(1,3).*(q-x(1))+DD(1,2)] ;
s=x(4); % Das Minimum der Parabel im Schaubild markieren
d=bspfunc(x(4)) ;
plot(q,w,s,d,'o');
title('Quadratische Suche');
legend({'zu minimierende Funktion','interpolierende Parabel','Minimum der Parabel'},'Location','EastOutside') axis ;
fff=axis ; % die Achseneinstellung speichern damit das Koordinatensystem % gleich bleibt
M(j)=getframe;
% Die Stützstelle mit dem niedrigsten Index fällt raus damit es wieder % drei Stützstellen sind.
x(1)=[] ;
pause(2) end
for j=2:10% Diesen Split in zwei for Schleifen hab ich gemacht weil ich % anders das mit der Beibehaltung des Koordinatensystems nicht hin- % bekommen habe.
y=bspfunc(x) ; % Nun wird die Funktion an den Startpunkten ausgewertet. % Im nächsten Schritt werden die dividierten Differenzen der % Newtondarstellung berechnet und in einer Matrix DD gesammelt. % In der ersten Spalte werden die Stützstellen gespeichert.
DD(1:length(x),1)=x ;
% In der zweiten Spalte werden die Funktionswerte an den Stützstellen % gespeichert.
DD(1:length(y),2)=y ;
% In der dritten Spalte stehen die dividierten Differenzen in denen zwei % aufeinanderfolgende Stützstellen verbaut wurden, in der vierten Spalte % jene, in denen alle drei verbaut wurden. for k=1:2
DD(k,3)=(DD(k+1,2)-DD(k,2))/(DD(k+1,1)-DD(k,1));
end for k=1
DD(k,4) = (DD(k+1,3)-DD(k,3))/(DD(k+2,1)-DD(k,1));
end % Jetzt wird das Minimum der Parabel berechnet und ein Schaubild mit % der Funktion und der Parabel geplottet.
x(4)=0.5*(x(1)+x(2)-(DD(1,3)/DD(1,4))) ;
q=linspace(a,b) ;
w= [ bspfunc(q) ; DD(1,4).*(q-x(1)).*(q-x(2))+DD(1,3).*(q-x(1))+DD(1,2)] ;
s=x(4); % Das Minimum der Parabel im Schaubild markieren
d=bspfunc(x(4)) ;
plot(q,w,s,d,'o');
title('Quadratische Suche');
legend({'zu minimierende Funktion','interpolierende Parabel','Minimum der Parabel'},'Location','EastOutside') text((a+b)/2,0,'hallo') axis([fff]) ; % Festsetzung der Achsen, so wie matlab sie automatisch für % das erste Bild erstellt hat
M(j)=getframe;
% Die Stützstelle mit dem niedrigsten Index fällt raus damit es wieder % drei Stützstellen sind.
x(1)=[] ;
pause(2) end
% movie(M,1,0.5) %Den Film braucht man nun doch nicht, da die Bilder-
%sequenz ohnehin abgespielt wird. Aber man kann ihn abspielen.
wenn die Veränderungen zwischen j=1 und j>1 relativ gering sind, kann man das vielleicht über eine if-Abfrage in einer Schleife machen, ohne j=1 komplett separat zu behandeln.
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
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.