Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Von Sinus, Deg, Rad und weiteren Problemen //erbitte Hilfe
madmax4g - So 30.05.10 14:02
Titel: Von Sinus, Deg, Rad und weiteren Problemen //erbitte Hilfe
Guten Mittag (=
schon seit längerer Zeit lese ich in diesem Forum immer fleißig mit. Nun habe ich mich endlich einmal angemeldet, um auch mal um Hilfe fragen zu können, oder anderen Hilfe zu geben. ;)
Nun zu meinem Problem..
Ich schreibe zur Zeit an einem etwas komplexeren Programm. Es soll ein Flugnavigator werden, welcher aus dem eingegebenem Kurs, der Gewünschten Reisefluggeschwindigkeit, und der Windrichtung, und -stärke, der nachzusteurernden Kurs, und die Daraus resultierende Geschwindigkeit berechnen soll.
Außerdem soll er den Flug noch in Form einer Tabelle, oder ähnlichem, simulieren.. Aber das ist zur Zeit nicht das Problem.
Um den Kurs, welchen ich nachsteuern muss auszurechnen brauche ich folgende Formel:
alpha= arcsin( (Windgeschwindigkeit/Eigengeschwindigkeit) * sin(Windrichtung+Steuerkurs) )
mein erstes Problem ist: Delphi rechnet ja bekanntlich im Bogenmaß (RAD) und nicht im Gradmaß (DEG) was hierfür von Nöten währe. Wie realisiere ich das am besten?
mein erster Gedanke war, das ich nach der eigendlichen Rechnung umwandle: steuerkurs:=steuerkurs/180 * PI; . Funktioniert das so?
mein 2. Problem währe folgendes: (quelltext zu Veranschaulichung ;) )
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var sK, gV, wV, wR, lv: extended;
begin sk:=STRTOFloat(ekurs.text); gv:=STRTOFLOAT(eReiseV.text); wr:=STRTOFloat(eWindR.text);
wv:=STRTOFLOAT(eWindV.text);
lv:=ArcSin((wR/gV)*sin(wR-sK)); lv:=lv/180 * PI; eKursAnderung.Text:=FLOATTOSTR(lv); |
wr=windrichtung
sk=steuerkurs
wV=windgeschwindigkeit
gV=EIgengeschwindigkeit
lv=luvwinkel
Leider stört sich das Program am an dem ARCSIN..(undeklarierter Bezeichner) Habe ich mich da beim Datentyp geirrt? oder woran liegt das?
ich hoffe ihr könnt mir helfen (=
Mit freundlichen Grüßen
Max (:
PS: ich benutze Delphi 2010 (2 Wochen-Testversion) oder alternativ Delphi 2005
Moderiert von
Narses: Quote- durch Delphi-Tags ersetzt
elundril - So 30.05.10 14:55
Hallo und :welcome: im Delphi-Forum!
Du könntest für dein erstes Problem die Funktion DegToRad und RadToDeg verwenden, dann brauchst du den Winkel nicht mehr selbst umwandeln.
ArcSin sollte der Compiler eigentlich kennen, probier mal entweder Math oben bei uses dazuzuschreiben oder Math.ArcSin zu schreiben.
lg elundril
madmax4g - So 30.05.10 17:41
vielen Danke für die schnelle ANtwort (=
ich musste math noch bei uses hinzufügen ;) währe ich nicht von allein draufgekommen.. vielen dank (=
jetzt läuft das Program soweit.
Allerdings gibt es einen weiteren Fehler... =/
wenn ich überall gleiche Werte einsetzte kommt es zu einem Fehler. >>Ungültiger Gleitkommaoperator
dieser Fehler tritt in folgernder Zeile auf:
Delphi-Quelltext
1:
| eV:=wV*((sin(Wr-Sk-LV))/(sin(lv))); |
das entspricht mathematisch x=a*(sin(b-c-d)/sin(d))
müsste also kein Problem sein..
wieso tritt dieser Fehler denoch auf? O.o
---
Moderiert von
Narses: Beiträge zusammengefasst---
mein quelltext sieht zur Zeit so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.bberechnenClick(Sender: TObject);
var sK, gV, wV, wr, lv, eV: extended;
begin sk:=STRTOFloat(ekurs.text); gv:=STRTOFLOAT(eReiseV.text); wr:=STRTOFloat(eWindR.text); wv:=STRTOFLOAT(eWindV.text); lv:=arcsin((wR/gV)*(sin(wR-sK))); lv:=180/PI*lv; eV:=wV*((sin(Wr-Sk-LV))/(sin(lv))); eV:=180/PI*eV; eKursAnderung.Text:=FLOATTOSTR(lv); eGeschwindigkeitRes.Text:=FLOATTOSTR(eV); end; |
nur falls wer fragt ;)
MfG
Moderiert von
Narses: Quote- durch Delphi-Tags ersetzt
elundril - So 30.05.10 18:07
ersten, bitte verwende die [delphi][/
delphi]-Tags für deinen Quelltext, dann kann man ihn besser lesen.
zweitens, bitte immer die genaue Fehlermeldung schreiben, möglichst mit angabe in welcher Zeile dieser Fehler auftritt.
madmax4g hat folgendes geschrieben : |
das entspricht mathematisch x=a*(sin(b-c-d)/sin(d))
|
drittens, wenn du d = 0 setzt ist es sin(0), was wiederum 0 entspricht. Eine Division durch null ist aber böse und erzeugt schwarze löcher. ;)
madmax4g - So 30.05.10 18:18
Zitat: |
ersten, bitte verwende die -Tags für deinen Quelltext, dann kann man ihn besser lesen.
zweitens, bitte immer die genaue Fehlermeldung schreiben, möglichst mit angabe in welcher Zeile dieser Fehler auftritt |
okay.. werde ich beherzigen
Zitat: |
drittens, wenn du d = 0 setzt ist es sin(0), was wiederum 0 entspricht. Eine Division durch null ist aber böse und erzeugt schwarze löcher. ;) |
das mit Null ist klar.. aber es tritt ja auch bei 1, 20, oder 732 auf^^
und da ist definitiv keine division durch null ;)
---
Moderiert von
Narses: Beiträge zusammengefasst---
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var sK, gV, wV, wr, lv, eV: extended;
begin
sk:=STRTOFloat(ekurs.text); gv:=STRTOFLOAT(eReiseV.text); wr:=STRTOFloat(eWindR.text); wv:=STRTOFLOAT(eWindV.text); lv:=arcsin((wV/gV)*(sin(wR-sK))); eV:=wV*((sin(Wr-Sk-LV))/(sin(lv))); lv:=180/PI*lv; eV:=180/PI*eV; eKursAnderung.Text:=FLOATTOSTR(lv); eGeschwindigkeitRes.Text:=FLOATTOSTR(eV); end |
in Zeile 12 tritt der Fehler auf..
und der FEhler lautet, iwe schon gesagt: "Ungültiger Gleitkommaoperator"
elundril - So 30.05.10 18:32
Kann es sein das dieser Term (wR/gV)*(sin(wR-sK)) manchmal größer als 1 bzw kleiner als -1 ist? Wenn ArcSin verträgt nur werte zwischen -1 und 1.
madmax4g - So 30.05.10 18:53
elundril hat folgendes geschrieben : |
Kann es sein das dieser Term (wR/gV)*(sin(wR-sK)) manchmal größer als 1 bzw kleiner als -1 ist? Wenn ArcSin verträgt nur werte zwischen -1 und 1. |
ja das ist ist möglich. Jedoch gibt es für diese Problematik keine andere Formel.. aber vielen Danke für den Hinweis
desweiteren habe ich mich in der Formel auch vertippt.. es muss (wV/gV) heißen.. was aber nichts an der tatsache ändert das es für einige Zhalen nicht geht. >_>
allerding ist es sehr selten das die Windgeschwindigkeit > Fluggeschwindigkeit ist..
muss ich in der Read Me darauf hinweisen
Das Problem was ich habe ist: die Formel und alles stimmt ja.. bloß mit dem Grad-Bodenmaß kommt Blödsinn raus..(dh im bogenmaß gerechnet, und hinterher umgewandelt <> im gradmaß gerechnet) Gibts da nicht iwas damit man den SINUS im Gradmaß rechnet? sowas wie DegSin? das Habe ich mal iwo gelesen, leider funktioniert es nicht. Gibts da nochsowas schlaues was man bei uses hineinschreiben kann?
jfheins - So 30.05.10 23:29
madmax4g hat folgendes geschrieben : |
Das Problem was ich habe ist: die Formel und alles stimmt ja.. bloß mit dem Grad-Bodenmaß kommt Blödsinn raus..(dh im bogenmaß gerechnet, und hinterher umgewandelt <> im gradmaß gerechnet) |
Dürfte eigentlich nicht sein. Hast du auch wirklich bei ALLEN Sachen die Umwandlung gemacht?
Also bei jedem Sinus und bei jedem arcus Sinus?
Zur Not kannst du die die ja selber schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function DegSin(i: Real): Real; begin Result := Sin(DegToRad(i)); end;
function DegArcSin(i: Real): Real; begin Result := RadToDeg(ArcSin(i)); end; |
Siehe auch hier:
http://www.delphipraxis.net/topic113859_winkelfunktionen+im+gradmass.html&highlight=degsin
madmax4g hat folgendes geschrieben : |
Gibts da nicht iwas damit man den SINUS im Gradmaß rechnet? sowas wie DegSin? das Habe ich mal iwo gelesen, leider funktioniert es nicht. Gibts da nochsowas schlaues was man bei uses hineinschreiben kann? |
Man könnte natürlich auch alle Winkel intern im Bogenmaß vorhalten und nur für die Ein-/Ausgabe umwandeln ;)
Gammatester - So 30.05.10 23:47
Kann es sein, daß Du einen Tippfehler gemacht hast? In lv:=ArcSin((wR/gV)*sin(wR-sK)) ist der Quotient (wR/gV) nicht dimensionslos. Mit Deinen Angaben würde ich auf Grund einer Dimensionsbetrachtung den Quotienten (wV/gV) (oder den Kehrwert) erwarten, dieser ist als Verhältnis zweier Geschwindingkeiten eine reine Zahl.
jfheins - Mo 31.05.10 10:34
Andererseits kann es ja durchaus sein, dass es keine Lösung gibt: Ich will 3km nach Norden fliegen. Es weht ein Wind von Norden, mit 20 m/s - mein Flugzeug kann aber höchstens 15 m/s Sekunde fliegen. In welche Richtung muss ich fliegen und wann komme ich an meinem Ziel an? :mrgreen:
elundril - Mo 31.05.10 10:45
Nach süden. aber das halt dafür etwas länger. :rofl:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!