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

if-Funktion liefert unterschiedliche Werte

 

Matthias

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.12.2009, 21:34     Titel: if-Funktion liefert unterschiedliche Werte
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 04.12.2009, 09:49     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 04.12.2009, 12:58     Titel:
  Antworten mit Zitat      
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?

trapez.jpg
 Beschreibung:

Download
 Dateiname:  trapez.jpg
 Dateigröße:  18.82 KB
 Heruntergeladen:  463 mal
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2009, 13:18     Titel:
  Antworten mit Zitat      
Dann ebend so:

f = f1(t) .* (t<0.05) + f2(t) .* (t<0.15).*(t>0.05) ...........
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 04.12.2009, 13:25     Titel:
  Antworten mit Zitat      
oder so:
Code:

function sE=Trapez(tE)
T=0.4;
h_ges=150;
h_max=200;
for i=1:length(tE)
t=tE(i);
... ....
sE(i)=s;
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Matthias

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2009, 13:46     Titel:
  Antworten mit Zitat      
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: ---
     Beitrag Verfasst am: 04.12.2009, 14:26     Titel:
  Antworten mit Zitat      
du darfst auch den punkt für die elementweise multiplikation nicht vergessen.




Code:

s = Trapez(-1:0.01:0.5);

plot(s);


function s=Trapez(t)

T=0.4;
h_ges=150;
h_max=200;

s = zeros(size(t));
grenzen = [-inf,0,0.05,0.15,0.25,0.35,0.4,inf];

f = zeros(7,length(t));

f(1,:) = 200*ones(size(t));
f(2,:) = h_max-h_ges*(2/(pi+2)*(t/T-1/(4*pi).*sin(4*pi*t/T)));
f(3,:) = h_max-h_ges*(1/(pi+2)*(4*pi*(t/T).^2+(2-pi).*t/T+(pi^2-8)/(16*pi)));
f(4,:) = h_max-h_ges*(2/(pi+2)*((pi+1)*t/T-1/(4*pi).*sin(4*pi*(t/T-1/4))-pi/4));
f(5,:) = 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)));
f(6,:) = h_max-h_ges*(1-(1/(pi+2)*(4*pi*((1-t/T)).^2+(2-pi)*(1-t/T)+(pi^2-8)/(16*pi))));
f(7,:) = h_max-h_ges*(1-(2/(pi+2)*((1-t/T)-1/(4*pi)*sin(4*pi*(1-t/T)))));

for k = 1:length(grenzen)-1
    s = s + (t>grenzen(k)).*(t<grenzen(k+1)).*f(k);
end
 
 
Matthias

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2009, 17:48     Titel:
  Antworten mit Zitat      
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:
Code:
function s=Trapez(t)

T=0.4;
h_ges=150;
h_max=200;

s = zeros(size(t));
grenzen = [-inf,0,0.05,0.15,0.2,0.25,0.35,0.4,inf];

f = zeros(8,length(t));

f(1,:) = 200*ones(size(t));
f(2,:) = h_max-h_ges*(2/(pi+2)*(t/T-1/(4*pi).*sin(4*pi*t/T)));
f(3,:) = h_max-h_ges*(1/(pi+2)*(4*pi*(t/T).^2+(2-pi).*t/T+(pi^2-8)/(16*pi)));
f(4,:) = h_max-h_ges*(2/(pi+2)*((pi+1)*t/T-1/(4*pi).*sin(4*pi*(t/T-1/4))-pi/4));
f(5,:) = 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)));
f(6,:) = h_max-h_ges*(1-(1/(pi+2)*(4*pi*((1-t/T)).^2+(2-pi)*(1-t/T)+(pi^2-8)/(16*pi))));
f(7,:) = h_max-h_ges*(1-(2/(pi+2)*((1-t/T)-1/(4*pi)*sin(4*pi*(1-t/T)))));
f(8,:) = 50*ones(size(t));

for k = 1:length(grenzen)-1
    s = s + (t>=grenzen(k)).*(t<grenzen(k+1)).*f(k);
end
 
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.