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

Oszillierender Output der atan2 Funktion (Simulink+Matlab)

 

Raketenmaid
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.10.2012, 13:40     Titel: Oszillierender Output der atan2 Funktion (Simulink+Matlab)
  Antworten mit Zitat      
Ab einen bestimmten Zeitpunkt bekomme ich Oszillationen des Outputs der atan2 Funktion, die ich einfach nicht wegbekommen kann.

Ich habe zwar folgendes bereits im Internet gefunden:
http://www.usenetmessages.com/view......728&id=484940&p=0

Komme damit aber irgendwie nicht weiter. Ich habe folgende Funktion gecodet in Simulink:

Code:
function y = fcn(u,v)
%#codegen

err = 1e-6;

if abs(v) <= err
    xi = pi;
else
    if abs(u) <= err
        xi = -pi;
    else
        xi = atan2(v,u);
    end
end


y = xi;


löst mir mein Problem aber nicht. Es oszilliert munter weiter.
Private Nachricht senden Benutzer-Profile anzeigen


Raketenmaid
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2012, 13:42     Titel:
  Antworten mit Zitat      
*schups*
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 23.10.2012, 14:08     Titel:
  Antworten mit Zitat      
Hallo!

atan(y,x) -> atan2(0+-eps,-1) reagiert nun mal sehr sensibel auf Schwankungen von eps. Das ist numerisch die heikelste Stelle dieser Funktion. Wie kann man das lösen? Hm, ist es vielleicht möglich die Genauigkeit von y zu erhöhen? Wenn dies aus einem anderen Verfahren kommt könnte man die Konvergenz durch entsprechende Parameter verbessern.

Ansonsten könnte man sich überlegen, aus welcher Richtung y kommen muss, je nach Fall. Dann setzt man eps eben selbst entsprechend. Ohne nähere Infos über das Problem kann ich dir leider nicht weiterhelfen.

Grüße, Marc
Private Nachricht senden Benutzer-Profile anzeigen
 
Raketenmaid
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2012, 09:43     Titel:
  Antworten mit Zitat      
Die Richtung, aus der y kommt, ist schwer vorherzusagen und kann sich im Laufe der Simulation ändern.

Was ich nicht verstehe, ist, warum es Probleme bei x = -1 gibt.

Nach meinem Verständnis entspricht die atan2(y,x) doch der Funktion atan(y/x), außer, dass der Winkel halt anders dargestellt wird (normalerweise ergäbe der atan(y/x) wohl nur Winkel zwischen -90 und +90°, wenn ich den Help Text richtig gelesen habe. Oder habe ich da was falsch verstanden?

Nun wieso muckt die atan2 Funktion bei einem Winkel von 180?

Ich konnte im Netz leider keine genauere Beschreibung dieser spezifischen Funktion finden und je nach Quelle verstehen die was anderes unter der atan2 Funktion.
Private Nachricht senden Benutzer-Profile anzeigen
 
Raketenmaid
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2012, 14:15     Titel:
  Antworten mit Zitat      
So ganz klar ist mir die Sache noch nicht. Mir fällt auch dazu keine sinnvolle Lösung ein.

Ich habe mal folgenden Code probiert, der kaum verbesserung gebracht hat:

Code:
function y = fcn(Ve)
%#codegen

err = 1e-20;

if Ve(1) < 0
    if Ve(2) <= err && Ve(2) >= 0
        xi = pi;
    elseif Ve(2) >= -err && Ve(2) < 0
        xi = -pi;
    else
        xi = atan2(Ve(2),Ve(1));
    end
else
    xi = atan2(Ve(2),Ve(1));
end

y = xi;


Ganz konkret werden in diesem Fall sowohl Ve(1) als auch Ve(2) sehr sehr klein und der Kram will einfach nicht aufhören zu oszillieren ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2012, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

bitte einen Testvektor zur Verfügung stellen, bei dem das Problem auftritt, damit man selbst damit herumspielen kann.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2012, 15:09     Titel:
  Antworten mit Zitat      
würde ich gerne, weiß aber nicht, wie ich es machen soll. Wenn ich einen konstanten Wert einleite, kommt natürlich was konstanten raus (habs ausprobiert). Das Problem ist wohl, dass das ganze per se einfach dynamisch gekoppelt ist und es durch numerische Ungenauigkeiten zu diesen Schwingungen kommt. Mir ist nicht klar, wie ich das mit einem einfachen Vektor reproduzieren könnte. Ich habe mich jetzt auch mal hingesetzt und versucht, das irgendwie zu reproduzieren, obwohl ich skeptisch bin, dass ich das ohne das ganze vorliegende System überhaupt kann. Ergebnislos.

Also der Eingangsvektor des Funktionsblocks hängt vom Ausgang desselbigen über einie Ecken ab. So findet sich wohl aufgrund numerischer Ungenauigkeiten ein Oszillieren der Eingangswerte um den Nullpunkt wieder. Nur kann ich gar nicht sagen, ob dieses Oszillieren des Eingangs durch das Oszillieren des Ausgangs verursacht wird oder oszilliert der Ausgang, weil der Eingang oszilliert. Ideal wäre es, wenn ich durch den Code in der Funktion den Ausgang glätten könnte.

EDIT: Ich habe spaßeshalber mal folgenden Code ausprobiert:

Code:
err = 1e-2;

if Ve(1) <= err && Ve(1) >= -err
    Ve(1) = 0;
end

if Ve(2) <= err && Ve(2) >= -err
    Ve(2) = 0;
end

xi = atan2(Ve(2),Ve(1));


D.h. sind die Eingangswerte nur ausreichend klein, werden sie schlicht und ergreifend zu Null gesetzt. Was passiert? atan2 oszilliert fröhlich weiter ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2012, 16:27     Titel:
  Antworten mit Zitat      
Hallo,

du scheinst das ja unter Simulink laufen zu lassen. Lasse dir doch das Eingangssignal des Blocks, in dem du atan2 verwenden willst, in den Workspace ausgeben.

Ich fürchte, man wird nicht umhinkommen, die vorherigen Werte des Signals zu betrachten. Man muss ja schließlich sehen, wann ein Vorzeichenwechsel vorliegt.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2012, 10:07     Titel:
  Antworten mit Zitat      
Also das habe ich natürlich getan. Und, ich glaube, ich schrieb es bereits, das Eingangssignal oszilliert so ein wenig um den Nullpunkt, das bedeutet natürlich, dass hier ein mehrfacher Vorzeichenwechsel vorliegt.

Wie ich aber auch bereits schrieb, weiß ich nicht, ob diese Oszillationen im Eingang nicht von den Oszillationen im Ausgang verursacht werden, weil ja das Eingangssignal teilweise vom Ausgangssignal im dynamischen System abhängt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.10.2012, 10:17     Titel:
  Antworten mit Zitat      
Hallo,

ich glaube, dass mir die Eingangssignale reichen würden, um mir das genauer anzusehen. Wenn du die zur Verfügung stellen könntest?

Befindet sich das ganze in einem diskreten oder einem kontinuierlichen System? Da es um Vorzeichenwechsel geht, reicht es nämlich nicht, jeden Zeitschritt für sich zu betrachten, sondern man muss die Historie (zumindest den vorherigen Wert) mit einbeziehen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 12:07     Titel:
  Antworten mit Zitat      
Sorry, wenn ich mich erst jetzt wieder melde. War im Urlaub (und bin nun leider wieder zurück Smile )

Ich habe nun mit einer Kollegin ein wenig nachgeforscht und wir haben folgendes herausgefunden:

Zumindest an einer wesentlichen Stelle kommt es während einer Matrixmultiplikation zu folgendem Verhalten:

Es handelt sich dabei um eine Multiplikation von einer Drehmatrix mit einem Vektor. Der Vektor hat dabei Werte, die im kritischen Bereich zwar monoton steigen und fallen, aber - wohl durch numerische Ungenauigkeiten - um den steigenden bzw. fallenden Wert so leicht schwanken (in etwa wie wenn man eine Sinusfunktion mit einer geraden monoton steigenden oder fallenden Funktion multiplizieren würde, wenngleich das Schwanken eher nicht sinusförmig ist). Durch die Matrixmultiplikation werden diese schwankenden Werte zusammengezählt, mit dem Ergebnis, dass sie im kritischen Bereich im Mittel Null sind, die Schwankungen aber sich nicht aufheben, sodass es wohl zu diesem Oszillieren kommt.

Wir überlegen gerade, ob es eine Möglichkeit gibt, diese Werte einfach zu Null zu setzen, da sie ja eigentlich Null sein sollen. Gibt es eine elegante Möglichkeit, z.B. durch einen vorhandenen Block? Wenn möglich würde ich eine eigene Programmierung gerne vermeiden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Raketenmaid
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2012, 14:32     Titel:
  Antworten mit Zitat      
UPDATE:

Habe mal probeweise eine Funktion eingebaut, die die Ausgabe der Matrixmultiplikation nullt, sobald der Wert unterhalb einer Schwelle liegt. Das Blöde dabei: Die Schwelle muss ich sehr hoch setzen, um das Oszillieren wegzubekommen und selbst das gelingt nicht vollständig. Dies ist also für meine Zwecke ein Holzweg. Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Raketenmaid
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 12:12     Titel:
  Antworten mit Zitat      
UPDATE:

Ich habe mal folgendes gemacht:

Ich habe die durch die atan2 Funktion berechneten Winkel so umgerechnet, dass der Winkelbereich von 0 bis 360° geht anstelle von -180° bis +180°. Dies hat mir die numerischen Schwankungen eliminiert. Nur leider funktioniert nun die ganze Simulation falsch, d.h. die Ergebnisse sind vollkommen verkehrt. Nun dachte ich doch, dass selbst, wenn man den sin von 360° nimmt, das gleiche rauskommen sollte wie wenn man den sin von 0° nimmt. Analog für Winkel 270° anstelle von -90° ... Oder gibt es da Matlab Spezifitäten, derer ich mir nicht bewußt bin?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.11.2012, 12:39     Titel:
  Antworten mit Zitat      
Hallo,

du schreibst nur der Einfachheit halber Dinge wie 90 Grad, meinst aber pi/2, oder? Sonst wäre das das erste Problem.

Wie gesagt: wenn ich einen typischen problematischen Datensatz bekomme, schaue ich mir das gerne mal an. Die von dir gemachten Überlegungen nachzuverfolgen würde sich da wohl schwieriger gestalten.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 28.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2012, 13:50     Titel:
  Antworten mit Zitat      
Ich weiß ja nicht, wie ich Dir die problematischen Datensätze geben soll, wenn ich die Simulation im Problemfall unterbrechen muss per Str+C, so dass nichts rausgeschrieben wird.

Den Grund, warum es nun einen Unterschied macht, ob man 360° (bzw 2pi) statt 0° hat, wüßte ich aber schon gerne.

PS: Und ja, wenn ich von 90° schreibe, meine ich natürlich pi/2, das ich nur umgerechnet habe.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.