Hallo!
Bin noch recht unbeholfen was Matlab angeht, daher stellt mich das Verhalten meiner entworfenen Funktion vor Rätsel.
Es geht um die Definition eines Bewegungsgesetzes, das zu unterschiedlichen zeiten t, unterschiedliche Verläufe annimmt. Hier der Code:
Code:
function s=Trapez(t)
T=0.4;
h_ges=150;
h_max=200;
if t<=0
s=200;
elseif t<=0.05
s=h_max-h_ges*(2/(pi+2)*(t/T-1/(4*pi)*sin(4*pi*t/T)));
elseif t<=0.15
s=h_max-h_ges*(1/(pi+2)*(4*pi*(t/T)^2+(2-pi)*t/T+(pi^2-8)/(16*pi)));
elseif t<=0.2
s=h_max-h_ges*(2/(pi+2)*((pi+1)*t/T-1/(4*pi)*sin(4*pi*(t/T-1/4))-pi/4));
elseif t<=0.25
s=h_max-h_ges*(1-(2/(pi+2)*((pi+1)*(1-t/T)-1/(4*pi)*sin(4*pi*((1-t/T)-1/4))-pi/4)));
elseif t<=0.35
s=h_max-h_ges*(1-(1/(pi+2)*(4*pi*((1-t/T))^2+(2-pi)*(1-t/T)+(pi^2-8)/(16*pi))));
elseif t<=0.4
s=h_max-h_ges*(1-(2/(pi+2)*((1-t/T)-1/(4*pi)*sin(4*pi*(1-t/T)))));
end end
Folgendes Problem stellt sich ein: lasse ich mir die Funktion mittels fplot(...,[0 0.4]) darstellen, zeigt sich der erwünschte Verlauf.
Rufe ich einzelne Werte mittels Trapez(...) (z.B. Trapez(0.01)) auf, so stimmen diese ebenfalls.
Möchte ich mir allerdings mittels Trapez([0 : 0.01 : 0.4]) mehrere Werte ausgeben lassen, so stimmen diese nicht mehr.
Könnte mir vorstellen, dass Ganze liegt an den if-Unterscheidungen, bin mir aber nicht sicher. Weis einer Rat?
Thomas84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.12.2009, 09:49
Titel:
ich glaube if darf man keinen vektor übergeben.
du kannst die funktion aber auch in der form schreiben:
f = f1(t) .* (t<0.05) + f2(t) .* (t<0.15) ...........
Dann kannst du für t auch einen vektor verwenden
Matthias
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.12.2009, 12:58
Titel:
Hallo Thomas!
danke für deine Antwort.
Allerdings funktioniert deine Lösung nicht, weil die Multiplikationen mit der Bool'schen-Auswertung (0 oder 1) dazu führt, dass bei kleinen t der Funktionswert der höheren Funktionen (f2, f3, f4 usw.) jeweils auf die davor stehende Funktion addiert wird, da die Auswertung der unteren Bedignungen ebenfalls wahr ist. So sind z.B. bei t=0.01 alle Bedingungen wahr. Das Ergebnis sind überzogene Werte und Sprünge in der Funktion, wie man in dem Angehängten Bild erkennt.
Komme ich also um die if-Formulierung nicht herum? Weis jemand anders rat?
Ja, das liefert wieder die gewünschten Werte. Allerdings stehe ich damit wieder da, wo ich schon mit den if_formulierungen war, da die Vektoren hier Potenziert werden (t*t usw.), was zu einem Fehler
??? Error using ==> mpower
Matrix must be square.
bei der Ausgabe führt.
Thomas84
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.12.2009, 14:26
Titel:
du darfst auch den punkt für die elementweise multiplikation nicht vergessen.
Wunderbar, besten Dank!
Du hattest zwar den t=0.2 Schritt vergessen, aber das hat mir geholfen noch mal alles nachzuvollziehen. Wen es interessiert, hier noch mal die entgültige Funktion:
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.