webForumDet fria alternativet

Någon som beräknat den s.k "Vindtriangeln"?

Kontorsprogram

16 svar · 2 268 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej,

Jag håller fnv på att konstruera ett kalkylblad för färdplaneringsberäkningar när jag flyger. Nu skulle jag vilja automatisera beräkningar av vinduppehållningsvinklar och "fart över marken", benämns även GS (Ground speed). När man flyger påverkas flygplanet som sagt alltid av en vind om det inte är vindstilla.

Tänkte höra om det är något som gjort beräkningar för denna effekt?

Uträkning nedan hittade jag på en sida och ska enligt skaparen gå att applicera i olika programmeringsspråk? Går det att få in som en Excel-funktion?

Let CRS=course, HD=heading, WD=wind direction (from), TAS=True airpeed, GS=groundspeed, WS=windspeed.

Units of the speeds do not matter as long as they are all the same.

  (1) Unknown Wind:

 WS=sqrt( (TAS-GS)^2+ 4*TAS*GS*(sin((HD-CRS)/2))^2 )
 WD=CRS + atan2(TAS*sin(HD-CRS), TAS*cos(HD-CRS)-GS)  (**)
 IF (WD<0) THEN WD=WD+2*pi
 IF (WD>2*pi) THEN WD=WD-2*pi
   ( (**) assumes atan2(y,x), reverse arguments if your implementation 
 has atan2(x,y) )

  (2) Find HD, GS

 SWC=(WS/TAS)*sin(WD-CRS)
 IF (abs(SWC)>1)
      "course cannot be flown-- wind too strong"
 ELSE 
      HD=CRS+asin(SWC)
      if (HD<0) HD=HD+2*pi
      if (HD>2*pi) HD=HD-2*pi
      GS=TAS*sqrt(1-SWC^2)-WS*cos(WD-CRS)
      if (GS < 0)  "course cannot be flown-- wind too strong"
 ENDIF

Note:
    The purpose of the "if (HD<0) HD=HD+2*pi; if (HD>2*pi) HD=HD-2*pi" is to ensure the final heading ends up in the range (0, 2*pi). Another way to do this, with the MOD function available is:

   HD=MOD(HD,2*pi)

(3) Find CRS, GS

  GS=sqrt(WS^2 + TAS^2 - 2*WS*TAS*cos(HD-WD))
  WCA=atan2(WS*sin(HD-WD),TAS-WS*cos(HD-WD))  (*)
  CRS=MOD(HD+WCA,2*pi)

(*) WCA=asin((WS/GS)*sin(HD-WD)) works if the wind correction angle is less than 90 degrees, which will always be the case if WS < TAS. The listed formula works in the general case

Bifogar en bild.

WindTriangle2.gif
Medlem sedan nov. 20041 189 inlägg
#2

Om du vill använda trignometri så är nog det enklaste att skriva en egen funktion som är ett makro, annars blir ditt uttryck väldigt svårt att felsöka.

Vad gäller uträkningen så har jag inte riktigt tid att sätta mig in i den, men generellt sätt så skulle jag inte använda mig av trignometri, utan hellre vektorer - använder man trignometri så är det risk för att man får fel vinkel (fel med 180 grader) när man räknar på arctan, arccos, arcsin.

Medlem sedan apr. 20041 597 inlägg
#3

Hur skapar man en funktion som ett makro i Excel. Finns det någon tutorial eller motsvarnde? Detta makro vill jag ska köras för ett värde i en viss cell.

Medlem sedan nov. 20041 189 inlägg
#4

Ja, det finns en jättebra tutorial som jag försökte använda, men jag är för trött efter skolan... Här är den i alla fall!
Enjoy!

http://www.exceltip.com/st/Writing_Your_First_VBA_Function_in_Excel/631.html

Medlem sedan apr. 20041 597 inlägg
#5

echoSwe skrev:

http://www.exceltip.com/st/Writing_Your_First_VBA_Function_in_Excel/631.html

Jag har nu försökt med följande kod efter att ha läst sidan som du länkade till. Förstår principen för hur man skapar egna funktioner och anropar dessa. Dock får jag ett kompileringsfel när jag kör följande kod som skall räkna ut Groundspeed:

Function groundSpeed(WS As Integer, WD As Integer, CRS As Integer, TAS As Integer)
SWC = (WS / TAS) * Sin(WD - CRS)
    If (Abs(SWC) < 1) Then
      GS = TAS * rot(1 - SWC ^ 2) - WS * Cos(WD - CRS)
    End If
End Function
felkod.jpg
Medlem sedan apr. 20041 597 inlägg
#6

Det som jag har lyckats läsa mig till på nätet är att funktionen rot() i mitt exempel EJ finns definierad i VB-makrot och därför dyker felmeddelandet upp. Jag måste inkludera något liknande ett funktionsbibliotek. Undersöker saken vidare...

R: Förresten, Hur anger jag vilket värde i en VB-funktion som jag vill returnera. Normalt gör man ju det genom "Return Obj;". Kan inte den exakta syntaxen i detta fall.

R2: Har kommit fram till att man skall använda sig av Application.WorksheetFunction för att komma åt de vanliga excel-funktionerna i VB-makrot. Dock får jag inte detta att fungera. Det stor värdefel i kalkylbladet när jag matat funktionen med de argument jag har angett tidigare.

Medlem sedan dec. 20025 483 inlägg
#7

För att funktionen skall returnera ett värde skriver man

function f
  ...
  f = [i]returvärde[/i]
end function

När det gäller rot() kanske du får använda sqrt() istället.

Medlem sedan okt. 2005371 inlägg
#8
[3][blue]Public[/blue][/3] Function groundSpeed(WS As Integer, WD As Integer, CRS As Integer, TAS As Integer)
SWC = (WS / TAS) * Sin(WD - CRS)
    If (Abs(SWC) < 1) Then
      [blue][3]groundSpeed [/3] [/blue] = TAS * [blue][3]Sqr[/3][/blue](1 - SWC ^ 2) - WS * Cos(WD - CRS)
    End If
End Function

Om jag gjorde rätt nu så skall de ändringar du behöver göra vara blåmarkerade.

Public= Tror att det krävs för att funktionen skall vara åtkomlig ifrån kalkylbladet.
Sqr och "groundSpeed=" se tidigare

Ställ dig i målcellen I excel
Infoga ->funktion->anpassade

PS
****Överkurs****

Om du vill göra det riktigt snygg så ställer du dig i VBA-editorn.
Se till att Projektutforskaren är framme (ctrl+R)
Markera den modul som innehåller "groundSpeed"
Tryck F2 för att få framobjektgranskning.
Högerklicka på "groundSpeed" i Objektgranskningen och välj egenskaper. Nu kan du lägga in lite förklarande text som kommer att dyka upp när du skriver in formeln i kalkylbladet (dvs en förklaring till vad "groundSpeed" gör)
/****Överkurs****

Medlem sedan dec. 20025 483 inlägg
#9

Sqr() var det tydligen. ;)

Medlem sedan apr. 20041 597 inlägg
#10

Tack för responsen...jag ska genast testa detta...

Det kommer att göra det hela lite enklare/effektivare att mata in värden istället för att använda en s.k. "vind-skiva" som man får snurra på till förbannelse för att få ut rätt kurser och farter :)

Medlem sedan apr. 20041 597 inlägg
#11

MindreVetande skrev:

[3][blue]Public[/blue][/3] Function groundSpeed(WS As Integer, WD As Integer, CRS As Integer, TAS As Integer)
SWC = (WS / TAS) * Sin(WD - CRS)
    If (Abs(SWC) < 1) Then
      [blue][3]groundSpeed [/3] [/blue] = TAS * [blue][3]Sqr[/3][/blue](1 - SWC ^ 2) - WS * Cos(WD - CRS)
    End If
End Function

Om jag gjorde rätt nu så skall de ändringar du behöver göra vara blåmarkerade.

Public= Tror att det krävs för att funktionen skall vara åtkomlig ifrån kalkylbladet.
Sqr och "groundSpeed=" se tidigare

Ställ dig i målcellen I excel
Infoga ->funktion->anpassade

PS
****Överkurs****

Om du vill göra det riktigt snygg så ställer du dig i VBA-editorn.
Se till att Projektutforskaren är framme (ctrl+R)
Markera den modul som innehåller "groundSpeed"
Tryck F2 för att få framobjektgranskning.
Högerklicka på "groundSpeed" i Objektgranskningen och välj egenskaper. Nu kan du lägga in lite förklarande text som kommer att dyka upp när du skriver in formeln i kalkylbladet (dvs en förklaring till vad "groundSpeed" gör)
/****Överkurs****

Tack för hjälpen. Jag får formeln att interagera med kalkylbladet och det är ett steg i rätt riktning. Dessvärre verkar inte formeln vara komplett som det ser ut nu. Jag har matat in testvärden för vindhastighet, vindriktning, fart genom luften och tänkt färdväg men får ut felaktiga värden avseende vinduppehållningsvinkel och fart över marken. Tillförlitligheten är så där nu när jag manuellt dubbelkollat dessa testvärden. Formeln fick jag tag på från en seriös sida men det känns som att det är en del saker som saknas.

Det slutar kanske med att jag får sätta mig ned och försöka räkna ut "triangeln" själv. Ska kanske inte vara så svårt :)

Medlem sedan okt. 2005371 inlägg
#12

Hur matas vinklarna in? Grader eller Radianer?

Medlem sedan apr. 20041 597 inlägg
#13

MindreVetande skrev:

Hur matas vinklarna in? Grader eller Radianer?

Ursprungligen matade jag in det i grader. Senare upptäckte jag i texten att man skulle göra om det till radianer vilket jag gjorde med följande kod:

angle_radians=(pi/180)*angle_degrees

Så här såg kod och anvisningar ut på sidan jag besökte:

Wind Triangles

In all formulae, all angles are in radians. Convert back and forth as in the Great Circle section. [This is unnecessary on calculators which have a "degree mode" for trig functions. Most programming languages provide only "radian mode".]

      angle_radians=(pi/180)*angle_degrees
      angle_degrees=(180/pi)*angle_radians 

A further conversion is required if using degrees/minutes/seconds:

 angle_degrees=degrees+(minutes/60.)+(seconds/3600.)

 degrees=int(angle_degrees)
 minutes=int(60*(angle_degrees-degrees))
 seconds=60*(60*(angle_degrees-degrees)-minutes)) 

[ You may have a built-in HH <-> HH:MM:SS conversion to do this efficiently]

Let CRS=course, HD=heading, WD=wind direction (from), TAS=True airpeed, GS=groundspeed, WS=windspeed.

Units of the speeds do not matter as long as they are all the same.

  (1) Unknown Wind:

 WS=sqrt( (TAS-GS)^2+ 4*TAS*GS*(sin((HD-CRS)/2))^2 )
 WD=CRS + atan2(TAS*sin(HD-CRS), TAS*cos(HD-CRS)-GS)  (**)
 IF (WD<0) THEN WD=WD+2*pi
 IF (WD>2*pi) THEN WD=WD-2*pi
   ( (**) assumes atan2(y,x), reverse arguments if your implementation 
 has atan2(x,y) )

  (2) Find HD, GS

 SWC=(WS/TAS)*sin(WD-CRS)
 IF (abs(SWC)>1)
      "course cannot be flown-- wind too strong"
 ELSE 
      HD=CRS+asin(SWC)
      if (HD<0) HD=HD+2*pi
      if (HD>2*pi) HD=HD-2*pi
      GS=TAS*sqrt(1-SWC^2)-WS*cos(WD-CRS)
      if (GS < 0)  "course cannot be flown-- wind too strong"
 ENDIF

Note:
    The purpose of the "if (HD<0) HD=HD+2*pi; if (HD>2*pi) HD=HD-2*pi" is to ensure the final heading ends up in the range (0, 2*pi). Another way to do this, with the MOD function available is:

   HD=MOD(HD,2*pi)

(3) Find CRS, GS

  GS=sqrt(WS^2 + TAS^2 - 2*WS*TAS*cos(HD-WD))
  WCA=atan2(WS*sin(HD-WD),TAS-WS*cos(HD-WD))  (*)
  CRS=MOD(HD+WCA,2*pi)

(*) WCA=asin((WS/GS)*sin(HD-WD)) works if the wind correction angle is less than 90 degrees, which will always be the case if WS < TAS. The listed formula works in the general case
Medlem sedan okt. 2005371 inlägg
#14

Hmmm. Skumt. Pi finns inte i min excel VBA :q

Jag har glömt all trigometri jag någonsin kunnat. Men om man läser din sida så borde det här ge GS och HD. Har typat variablerna lite snällare. Kan du kolla med kunskap och folkvett? Jag har nämligen ingen aning om vad som är rimligt.

(Hela) grader och valfri hastighetsenhet (obs att "DegToRad" måste vara med oavsett om du leker med GS eller HD).


Public Function GS(WS As Integer, WD As Double, CRS As Double, TAS As Integer)

'WS=windspeed
'WD=wind direction (from)
'CRS=course,
'TAS=True airpeed,
'*************
'HD=heading,
'GS=groundspeed,

Dim SWC As Double

CRS = DegToRad(CRS)
WD = DegToRad(WD)

SWC = (WS / TAS) * Sin(WD - CRS)
If (Abs(SWC) < 1) Then
        GS = TAS * Sqr(1 - SWC ^ 2) - WS * Cos(WD - CRS)
    Else: GS = "course cannot be flown-- wind too strong"
End If
'HD = CRS + Asin(SWC)
'HD = HD Mod (2 * Pi)

End Function

Public Function HD(WS As Integer, WD As Double, CRS As Double, TAS As Integer)

'WS=windspeed
'WD=wind direction (from)
'CRS=course,
'TAS=True airpeed,
'*************
'HD=heading,
'GS=groundspeed,
Dim SWC As Double

CRS = DegToRad(CRS)
WD = DegToRad(WD)

SWC = (WS / TAS) * Sin(WD - CRS)
If (Abs(SWC) < 1) Then
        HD = CRS + Asin(SWC)
        HD = HD Mod (2 * Pi)
    Else: HD = "Backward"
End If
End Function

Function DegToRad(Degrees)
Const Pi = 3.14159265358979
    DegToRad = Degrees * Pi / 180
End Function
Medlem sedan apr. 20041 597 inlägg
#15

Jag fortsätter på denna tråd då jag aldrig fick det att fungera som jag ville med koden i inläggen ovan.

Min fråga till Er alla är om det är någon som simulerat avdriftsberäkningar enligt den s.k. "vindtriangeln" i Excel och fått det att fungera? :) Jag håller på och gör ett färdplaneringsverktyg för mina navigeringsberäkningar när jag flyger. Då skulle det vara riktigt trevligt att kunna räkna ut effekten av vinden!

Medlem sedan apr. 20041 597 inlägg
#16

Någon som vet om det är svårt att implementera denna kod i ett vb-script för att få ut ground speed, vinduppehållningsvinkel och true heading. Man kanske behöver göra om argumentet i funktionsanropet något och ta med variablerna wind speed, wind direction, true airspeed, heading:

function GndSpdCrsWca(calcGndSpdCrsWca) {
  wd = (Math.PI/180)*calcGndSpdCrsWca.windDir.value
  hd = (Math.PI/180)*calcGndSpdCrsWca.heading.value
  calcGndSpdCrsWca.GS.value = Math.round(Math.sqrt(Math.pow(calcGndSpdCrsWca.windSpd.value, 2) + 
                              Math.pow(calcGndSpdCrsWca.TAS.value, 2)- 2 * calcGndSpdCrsWca.windSpd.value *
                              calcGndSpdCrsWca.TAS.value * Math.cos(hd-wd)));
  wca = Math.atan2(calcGndSpdCrsWca.windSpd.value * Math.sin(hd-wd),
                               calcGndSpdCrsWca.TAS.value-calcGndSpdCrsWca.windSpd.value * 
                               Math.cos(hd-wd));
  calcGndSpdCrsWca.WCA.value = Math.round((180/Math.PI) * wca);
  crs = (hd + wca) % (2 * Math.PI);
  calcGndSpdCrsWca.course.value = Math.round((180/Math.PI) * crs);
}
Medlem sedan nov. 20041 189 inlägg
#17

DU kanske ska bifoga en beskrivning av matten?

267 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)