Hej. Jeg skal beregne et gennemsnit på vindretning. Problemer et at når jeg lever en alm. gsn. beregning og vindretningen svinger mellem 350° og 10° så bliver min gsn. retning ca 180° altså sydlig retning i stedet for nord.
Nogle forslag fra et par matematiske genier? Jeg har prøvet med en case sætning hvor 350° til 360° = 360° osv
Mon ikke du kunne opdele det i intervaller Du kunne fx lave variable som : N, NØ, Ø, SØ, S, SV, V, NV Hvis du for hver vindretning tæller den angivne variable op så vil den variabel der er talt mest op angive den "oftest fremkomne vindretning"
Hvad med noget lignende det her: If Text1.Text > Text2.Text then If Text1.Text - Text2.Text < 180 then gsn = (Text1.Text + Text2.Text)/2 Else: gsn = (Text1.Text + Text2.Text + 360)/2 End If Elseif Text1.Text < Text2.Text then If Text2.Text - Text1.Text < 180 then gsn = (Text1.Text + Text2.Text)/2 Else: gsn = (Text1.Text + Text2.Text + 360)/2 End If End If
jeg forstår slet ikke hvad det er for et snit du ønsker Det kommer jo an på din krav specifikation For i princippet kan 30% blæse vest 30% øst og 30% nord... hvad er snittet så?. Kan godt være det ikke forekommer i virkeligheden, men stiller bare spørgsmålstegn ved det :o)
DIT PROBLEM:__________________________________________________________
Du har fx. 350g og 10g. Det du kalder "gennemsnittet" bliver (350 + 10) / 2 = 180, og det er - faktisk præcis stik modsat - af det ønskede resultat. Problemet opstår fordi skalaen nulstilles ved 360...
FORUDSÆTNINGER FOR LØSNINGER__________________________________________
Det du skal gøre er først og fremmest at sørge for at undgå situationer som den busschou foreslår - altså sørge for at der kun er TO retninger der skal findes en middelretning for.
Dernæst skal du sørge for, at der ikke er præcis 180g mellem de to retninger. Eksempel:
270g og 90g - hvad skal snittet være? 180 eller 360 - begge dele er lige rigtige!
Så - altså inden du går i gang, sørg for at dine input opfylder at
1) Der KUN er to tal som udgangspunkt 2) At forskellen mellem ikke må være præcis 180
Fint - så er DET på plads - tilbage er blot at få det regnet ud:
Der er mange måder at gøre det på - en lidt klodset måde synes jeg er at bruge 117 select case'r. lettere er det at gøre følgende (synes jeg):
Sorter de to tal (lad os kalde dem A og B), så A er det mindste tal
Udregn B-A - er resultatet større end 180, ligger de på "hver sin side" at 360/0 grænsen. Er resultatet mindre end 180 er der ingen problemer.
Når resultatet er større end 180, lægger du 360 til A, før du finder snittet på normal vis. Og skalerer ned hvis resultatet er større end 360.
LØSNING SOM KODE_____________________________________________________________
Jeg har ikek VB6 installeret på denne PC, så nedenstående kode er lidt på slum
Dim A as Long Dim B as Long Dim Dummy as Long Dim Resultat as Long
A = val(text1.text) B = val(text2.text)
'Sorterer, så A er mindst If A > B then Dummy = B B = A A = Sum End If
'Tjekker forskellen Select case B-A Case 180 Msgbox "Der må ikke være præcis 180 i forskel mellem tallene" exit sub Case < 180 Resultat = (A + B) / 2 msgbox "resultat er : " & Resultat Case > 180 A = A+360 Resultat = (A + B) / 2 if resultat > 360 then resultat = resultat - 360 end if msgbox "resultat er : " & Resultat End Select
Prøv at test ovenstående - det skulle gerne virke :o)
Slut___________________________________________ PS: Tubber: Du lægger tal og tekststrenge sammen i dit eksempel - det vil aldrig give noget fornuftigt.
PS: Tubber - jeg kan se at det faktisk er den samme løsning du har givet - bare skrevet anderledes. Sorry - det havde jeg ikke set (men der er stadig problemet med at du glemmer Val() ;o)
If Text1.Text > Text2.Text then If val(Text1.Text) - val(Text2.Text) < 180 then gsn = (val(Text1.Text) + val(Text2.Text))/2 Else: gsn = (val(Text1.Text) + val(Text2.Text) + 360)/2 End If Elseif val(Text1.Text) < val(Text2.Text) then If val(Text2.Text) - val(Text1.Text) < 180 then gsn = (val(Text1.Text) + val(Text2.Text))/2 Else: gsn = (val(Text1.Text) + val(Text2.Text) + 360)/2 End If End If
Hej Tak for indlæggene, det undrede mig at der ikke var nogle der reagerede. Så her i dag skal jeg da love for at det væltede ind med post.
Nu skal jeg lige prøve nogle af jeres forslag. Men her kommer det jeg bruger lige nu. Jeg skal måle gennemsnittet 10 minutter tilbage, det er 600 poster i en DB, da jeg gemmer hvert sekund.
Data1.RecordSource = "Select * from " & Ugedag Data1.Refresh Data1.Recordset.MoveLast
Do While Data1.Recordset.BOF = False vKurs = Data1.Recordset.Fields(3) If vKurs >= 0 And vKurs < 22 Then vKurs = 360 If vKurs > 337 And vKurs < 360 Then vKurs = 360
If vTæller1 >= 600 Then vKurs = vAvgKurs / 600 avgR = vKurs vTæller1 = 0 vAvgKurs = 0 Exit Sub Else vAvgKurs = vAvgKurs + vKurs vTæller1 = vTæller1 + 1 Data1.Recordset.MovePrevious End If
Det er lovligt undskyldt, det er ekspertens abonoment service der har været nede, nye spg har også haft en del problemer.....
Men en anden gang kan det chekkes ved at gå ind i din konto og se spørgsmål som du har oprettet, besvaret eller deltager i, der vil du kunne se om der er nye indlæg :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.