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

Umrechnen Grad zu Rad erzeugt Fehler

 

Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 11.08.2010, 12:54     Titel: Umrechnen Grad zu Rad erzeugt Fehler
  Antworten mit Zitat      
Hi,
ich wollt meinen Code schneller machen und cosd und sind rausschmeißen.
Dabei sollten doch die Winkel einfach:
Code:

 Theta=Theta*pi/180;             %Winkel
 thetastep=thetastep*pi/180;  %Winkelschritte
 


so umgerechnet werden können. Dann alle sind und cosds ersetzen und es sollte das gleiche rauskommen. Ich hab aber leider kleine Abweichungen, die nicht toleriert werden können. Muss ich da noch was ändern oder ist die Berechnung zu ungenau?

Danke
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Harald
Forum-Meister

Forum-Meister


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

ich habe das mal ausprobiert, und ich bekomme Abweichungen < 1e-15.
Code:
angles = rand(100,1)*360;
max(abs(sind(angles) - sin(angles*pi/180)))
max(abs(cosd(angles) - cos(angles*pi/180)))


Dass Abweichungen in dieser Größenordnung herauskommen ist vollkommen normal.

Du kannst dir ja den Code von sind und cosd ansehen. Dann siehst du, dass da im Grunde auch nichts anderes drinsteht und nur durch bestimmte Umformungen etwas größere Genauigkeit entsteht.

Es bleibt also nur die Wahl zwischen Genauigkeit und Geschwindigkeit. Wenn bei dir die Abweichungen auch nur im Bereich 1e-15 sind, würde ich Geschwindigkeit wählen. Ich kann mir keine Anwendung vorstellen, wo 15 Stellen Genauigkeit wirklich erforderlich sind.

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

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 11.08.2010, 13:18     Titel:
  Antworten mit Zitat      
Sollte sein, aber ich hier 2 Testbilder einmal mit sind/cosd berechnet und mit sin/cos...

cosd_sind.jpg
 Beschreibung:

Download
 Dateiname:  cosd_sind.jpg
 Dateigröße:  36.45 KB
 Heruntergeladen:  1034 mal
sincos.jpg
 Beschreibung:

Download
 Dateiname:  sincos.jpg
 Dateigröße:  36.93 KB
 Heruntergeladen:  1065 mal
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.08.2010, 14:02     Titel: Re: Umrechnen Grad zu Rad erzeugt Fehler
  Antworten mit Zitat      
Hallo Achi,

Wenn es um Geschwindigkeit geht, ist dies nicht optimal:
Code:

 Theta=Theta*pi/180;             %Winkel
 thetastep=thetastep*pi/180;  %Winkelschritte
 

Falls Theta und thetastep Vektoren sind, spart man sich viele Divisionen, wenn man den skalaren Teil in Klammern setzt:
Code:

 Theta=Theta*(pi/180);             %Winkel
 thetastep=thetastep*(pi/180);  %Winkelschritte
 

Wenn stattdesen "(Theta * pi) / 180" berechnet wird, dauert das deutlich länger. Nebenbei is PI aber auch eine Funktion, deren Aufruf Zeit kosten. Deshalb:
Code:

 Theta=Theta*0.0174532925199433;
 thetastep=thetastep*0.0174532925199433;
 


Woher die Unterschiede in Deinen Ergebnissen kommen, ist mir ein Rätsel. Möchtest Du vielleicht gar nicht "*pi/180" sondern "*180/pi" berechnen??? Dann wäre dies die richtige Konstante:
57.295779513082320876798

Gruß, Jan
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: 11.08.2010, 16:02     Titel:
  Antworten mit Zitat      
Hallo,

die Unterschiede kann ich mir höchstens dadurch erklären, dass irgendwo auf Gleichheit getestet wird - und das grenzt bei errechneten Werten an Unsinn

Code:
x = 0.3;
y = 0.1 + 0.1 + 0.1;
x == y


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

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 11.08.2010, 16:23     Titel:
  Antworten mit Zitat      
Versteh ich nicht.

Ich wollte mein Programm etwa schneller machen.
Da cosd und sind oft benutzt werden-> weg damit

Was ich getan habe:

-also Winkel Theta=0:359 in Rad
Theta=Theta*pi/180
thetastep=thetastep*pi/180
und alle sind und cosd mit sin und cos ersetzt.
Aber leider ist das Ergebnis nicht (ganz) richtig...
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.08.2010, 17:01     Titel:
  Antworten mit Zitat      
Hallo Achi,

was verstehst Du nicht?
Ist es klar, warum "*pi/180" langsamer sein kann als COSD und SIND, "*0.0174" aber schneller?
Wie groß sind bei Dir die Unterschiede zwischen COSD und Deiner Ersetzung? Wenn sie klein sind, wieso erzeugen sie dann so unterschiedliche Ausgaben bei dir?
Wenn Dein Ergbnis kritisch von der 15. Stelle hinter dem Komma abhängt, ist der Algorithmus instabil. Du musst berücksichtigen, dass trigonometrische Funktionen immer nur eine begrenzte Genauigkeit bieten können. Deswegen gibt MathWorks z.B. in der Dokumentation von ACOS an, welche Method denn benutzt wird. Und selbst dann gibt es immer noch kleine Unterschiede, wenn man ACOS der FDLIBM in ein C-Mex-File kopiert und mit unterschiedlichen Compilern compiliert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 11.08.2010, 17:37     Titel:
  Antworten mit Zitat      
Mir ist klar warum das eine und das andere schneller oder langsamer ist.
Einmal wird einfach eine Variable benutzt und das ander mal eine Funktion aufgerufen. Ich versteh halt nicht warum mir ein Fehler produkziert wird wenn ich nicht cosd/sind benutze... Ist ja auch nicht so schlimm. Dann ist es halt etwa langsamer.

Besten Dank Jan

Gruß Achi
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2010, 19:02     Titel:
  Antworten mit Zitat      
Hallo Achi,

siehe mein Kommentar von 13:09.

Code:


Grüße,
Harald
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.