Autor |
Beitrag |
madmax4g
Hält's aus hier
Beiträge: 4
|
Verfasst: So 30.05.10 14:02
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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 30.05.10 14:55
Hallo und  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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
madmax4g 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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. 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
madmax4g 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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"
Zuletzt bearbeitet von madmax4g am So 30.05.10 19:12, insgesamt 1-mal bearbeitet
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
madmax4g 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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: www.delphipraxis.net...amp;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
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: 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.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 31.05.10 09:01
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: 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? 
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 31.05.10 10:45
Nach süden. aber das halt dafür etwas länger. 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|