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

Problem mit der Event-Funktion

 

gdow86
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 20.07.12
Wohnort: ---
Version: 7.9.0 (R2009b)
     Beitrag Verfasst am: 27.07.2012, 11:15     Titel: Problem mit der Event-Funktion
  Antworten mit Zitat      
Guten Morgen zusammen,
ich mal wieder Embarassed Embarassed Embarassed

Mein Problem liegt darin, dass ich zwei Werte vergleichen möchte die während des Ablauf des Lösers "generiert" werden.

Für den Fall das die Werte gleich sind soll der Integrationsvorgang abgebrochen werden.

Nun bekomme ich aber die folgende Fehlermeldung:
Code:
??? Undefined function or method 'sign' for input arguments of type 'logical'.

Und hier folgt ein Teil des restlichen Codes:

ereignis.m:
Code:
function [ value, isterminal, direction ] = ereignis( t,u,m )
value = abs(u(1,1)) == u(5,1);
isterminal = 1;
direction = 0;
end

myfun:
Code:
function du = myfun(t,u,m)
if (t<0.1)
    F=[10;0;0;0];
else
    F=[0;0;0;0];
end
%Berechnung der Ableitungen
du(1) = u(3);   %Ableitung von u(1) ist gleich u(3)...
du(2) = u(4);
du(3) = F(1,1)/m;
du(4) = F(2,1)/m;
du(5) = u(7);
du(6) = u(8);
du(7) = F(3,1)/m;
du(8) = F(4,1)/m;
du=du';
end

main.m:
Code:
u=[1;1;0;0;5;1;0;0];
tend=10; tspan=[0 tend];
options=odeset('Events',@ereignis);
t=[]; y=[];
while 1
    [tout,yout]=ode45(@myfun,tspan,u,options,m);
    n=length(tout);
    t=[t;tout];
    y=[y;yout];
    u=[yout(n,1);1;yout(n,3);0;yout(n,5);1;yout(n,7);0];
    tstart=tout(n);
    tspan=[tstart tend];
    if tstart>=tend
        break;
    end
end
 

Ich hoffe das Ihr mir auch bei diesem Problem so kompetent helfen könnt, wie bei meinen anderen Problemen auch Smile

Gruß, Guido
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 27.07.2012, 11:28     Titel:
  Antworten mit Zitat      
Diese Fehlermeldung deutet auf ein Problem mit der Funktion sign hin...

Zitat:
??? Undefined function or method 'sign' for input arguments of type 'logical'.


sign ist eine vorhandene Matlab Funktion...hast du eine eigene Funktion Namens sign als m-file vorliegen? Dann diese unbedingt umbenennen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.07.2012, 11:29     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist schlicht, dass SIGN für Argumente vom Typ LOGICAL nicht definiert ist.

Lösung: in Double umwandeln.

Code:
value = doube(abs(u(1,1)) == u(5,1));

Bist du sicher, dass es sinnvoll ist, auf Gleichheit zu testen? Sollte man nicht eher testen, ob die Abweichung klein ist, oder ob ein Wert größer als der andere ist?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
gdow86
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 20.07.12
Wohnort: ---
Version: 7.9.0 (R2009b)
     Beitrag Verfasst am: 27.07.2012, 11:36     Titel:
  Antworten mit Zitat      
Erstmal Danke für die schnellen Antworten Smile

@DSP:
Nein, es liegt kein *.m File mit der Bezeichnung sign vor.

@Harald:
1) Jetzt läuft zwar MATLAB, allerdings bis zum Ende
2) Naja ich denke schon, da ich ja das eine Teilchen dann an dieser Position "anhalten" und plotten möchte
3) Wie wäre denn eine Lösung für die Näherung und warum wäre das evtl. besser?

Schöne Grüße, Guido
Private Nachricht senden Benutzer-Profile anzeigen
 
gdow86
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 20.07.12
Wohnort: ---
Version: 7.9.0 (R2009b)
     Beitrag Verfasst am: 27.07.2012, 11:39     Titel:
  Antworten mit Zitat      
Oder liegt bei dem plot ein Denkfehler meinerseits vor?
Code:
subplot(2,2,2);
plot(yout(n,1),yout(n,2),'o','MarkerSize',10);
grid on;

Weil doch hier immer die letzten Stellen genommen werden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.07.2012, 11:54     Titel:
  Antworten mit Zitat      
Hallo,

Numerisch ist Gleichheit immer etwas schwieriges.

Sagen wir z.B. u(1,1) wäre konstant 1.
u(5,1) wäre in den einzelnen Zeitschritten ..., 0.99997, 1.00003, ...

Dann liegt ja der Schluss nahe, dass dazwischen mal u(5,1) = 1 war, nur dass das nicht fein genug aufgelöst wurde.

Ich würde hier als Event-Funktion eher
Code:
value = abs(u(1,1)) - u(5,1);  
nehmen, da ja ohnehin die Stelle des Nulldurchgangs gefunden wird.

Was das plotten angeht: ich habe nicht die geringste Ahnung, was dieser Code-Ausschnitt nun mit dem Rest zu tun hat.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
gdow86
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 20.07.12
Wohnort: ---
Version: 7.9.0 (R2009b)
     Beitrag Verfasst am: 27.07.2012, 12:07     Titel:
  Antworten mit Zitat      
Ok, damit wird das wohl schon mal abgebrochen.

Der plot hat folgendes damit zu tun:
Es sollen 4 plots ausgegeben werden. Plot 1 stellt die Position von Teilchen 1 zu Beginn dar. Plot 2 soll die Position zum Zeitpunkt des Events darstellen, also wenn die Werte "gleich" sind.
Plot 3 stellt dann die Position von Teilchen 2 dar, also ist im Prinzip Plot 2 gleich Plot 3. Zum Schluss soll Plot 4 die Position von Teilchen 2 nach Ablauf der Zeit darstellen.

Ich hoffe das war verständlich formuliert.

Die Plots befinden sich allesamt außerhalb der while-Schleife, am Ende des main.m-Files.
Code:
subplot(2,2,1);
plot(yout(1,1),yout(1,2),'o','MarkerSize',10);
title('Position von Teilchen 1 zu Beginn');
grid on;

subplot(2,2,2);
plot(yout(n,1),yout(n,2),'o','MarkerSize',10);
title('Position von Teilchen 1 beim Event');
grid on;

subplot(2,2,3);
plot(yout(1,5),yout(1,6),'o','MarkerSize',10);
title('Position von Teilchen 2 beim Event');
grid on;

subplot(2,2,4);
plot(yout(n,5),yout(n,6),'o','MarkerSize',10);
title('Position von Teilchen 2 nach Ablauf der Zeit');
grid on;


EDIT:::::
Hatte einen Denkfehler bei den Plots Smile Ich habe die falschen Matrizen abgefragt.
Dankeschön für die Hilfe.
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.