Avatar billede jens_nuuk Nybegynder
08. juni 2005 - 15:25 Der er 17 kommentarer

Beregning af gennemsnit

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
Avatar billede busschou Praktikant
08. juni 2005 - 15:31 #1
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"
Avatar billede busschou Praktikant
08. juni 2005 - 15:32 #2
Du kunne jo så bruge din case sætning på gradtallet og tælle N op hvis graden svarer til nord og så fremdeles
Avatar billede trophymanager Nybegynder
08. juni 2005 - 16:43 #3
omdan graderne til det andet tal der.. som jeg nu glemt hvad hedder.
Avatar billede trophymanager Nybegynder
08. juni 2005 - 16:44 #4
radiantal er måske navnet
Avatar billede tubber Juniormester
08. juni 2005 - 17:16 #5
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
Avatar billede tubber Juniormester
08. juni 2005 - 17:17 #6
Hvordan ser den formel ud du bruger ?
Avatar billede busschou Praktikant
08. juni 2005 - 17:17 #7
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)
Avatar billede martin_moth Mester
08. juni 2005 - 20:28 #8
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:







LØSNINGSPRINCIP_____________________________________________________________

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.
Avatar billede martin_moth Mester
08. juni 2005 - 20:34 #9
Hov - skift

A = Sum

ud med

A = Dummy

Ved ikke lige hvorfor jeg skrev "Sum"...
Avatar billede martin_moth Mester
08. juni 2005 - 20:36 #10
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)
Avatar billede martin_moth Mester
11. juni 2005 - 15:54 #11
Jens, er du sneet ude oppe i det kolde nord?
Avatar billede tubber Juniormester
11. juni 2005 - 22:07 #12
Gik ud fra at det kun var tal der blev indtastet, sorry my bad
Avatar billede tubber Juniormester
12. juni 2005 - 00:14 #13
doh ja selvfølgelig så er et text felt jo en streng så bliver der ikke skrevet
val(text1.text) så bliver det jo til streng + streng

altså hvis man skriver 104 + 333 så bliver det 104333 da det er en streng
Avatar billede tubber Juniormester
12. juni 2005 - 00:17 #14
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
Avatar billede martin_moth Mester
13. juni 2005 - 15:16 #15
jens_nuuk?
Avatar billede jens_nuuk Nybegynder
23. juni 2005 - 01:39 #16
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
Avatar billede tubber Juniormester
23. juni 2005 - 12:38 #17
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester