<<

#06 ; Interpolation?

>>

I den föregående artikeln har jag lyckats räkna några inledande resultat för det valda skottets färd och motsvarande hastighet i jämna tidsteg. Det är ju ändå inte vanligtvis önskvärt att presentera kulans färd med jämna tidssted, utan man vill se informationen i jämna avstånd, i 100 m, 200 m, 300 m osv.

Interpolation behövs. Basinformation är s och v för jämna t, men vi vill egentligen ha t och v för jämna s. Vi kan inte antaga att det skulle bli lineärt.

I det här skedet skall man också tänka hur mycket kulan faller från den horisontala linjen. Jag kommer åtminstone först antaga att luftmotståndet har bara litet verkan för kulans fallande rörelse. Kulan flyger bara högst ett par sekunder och under dessa korta sekunder hinner gravitationen inte accelerera kulans vertikala hastighet så mycket att luftmotståndet i vertikal riktning skulle växa till betydande proportioner.

I princip beror kulans horisontala rörelse och dess vertikala rörelse inte på varandra. Jag tror att jag kan ganska bra räkna sträckan s som kulan faller med tiden t med den kända formeln s = g · t2 / 2 där g är jordens gravitationens acceleration, omkring 9,8 m/s2, alltså kulans fallande fart startar från noll och ökas 9,8 m/s för varje sekund.

Man skall minnas att det finns bara 3 betydande siffror i basinformationen. Därför skall man inte vänta resultat noggrannare än högst de samma 3 betydande siffror.

Men hur skall jag implementera interpolationen? Det finns ju flera alternativ. Vi kan använda 3 eller 4 värden och få en andra- eller tredje grads noggranhet. Mera än det knappast behövs då det finns högst några tiotals metrar mellan tabellens sträckor.

Man kunde bygga en polynomial som tar hela tabellen på en gång och interpolerar från det, men det skulle i praktiken vara mycket dumt. Vi vill inte tvinga den fina polynomen söka en exakt rutt genom tiotals eller till och med hundaratals punkter, NEJ NEJ NEJ! Även tionde grads polynom skulle vara farligt. Man skall komma ihåg att där finns bara högst 3 betydande siffror i värden. Den stackars polynomen skulle missuppfatta sitt jobb och tro att alla värden är exakta. Det kunde leda till vilda svängningar i interpolerade värden. Högre grad är inte alltid bättre.

Först vill jag ändå utveckla systemet som väljer de där 3 eller 4 värden från tabellen och använder dem med en standard interpolation för att få v(s) och t(s) i jämna mellanrum av sträckan s från s(t) och v(t) där tiden t är i jämna mellanrum. Det blir först pseudokod, men kan inte undvika risken att jag måste korrigera när jag har fått litet 'hands-on-experience' med JavaScript :

// Vi behöver följande tabeller från den numeriska integrationen 
// som vi behandlade förr
//
//  t[] ; tiden kulan flugit
//  s[] ; sträckan kulan flugit
//  v[] ; motsvarande kulans fart

yttergräns := n		// indexet där integrationen stoppade

// Vi har små separata tabeller för interpolationen
// ... för tiden t
itabeT[0] := t[0]
itabeT[1] := t[1]
itabeT[2] := t[2]
// ... för sträckan s
itabeS[0] := s[0]
itabeS[1] := s[1]
itabeS[2] := s[2]
// ... för farten v
itabeV[0] := v[0]
itabeV[1] := v[1]
itabeV[2] := v[2]

störsti := 2		
// indexet 2 är först störst i de större tabellerna

stegetim := 25
sträckan := 0		// vi startar från 0 meter

alltgjort := FALSE

ITERATION tills alltgjort == TRUE

  hardetallt := ( sträckan < itabeS[2] )
  // får värdet TRUE om det finns stora nog sträckor i tabellen itabeS
  // alltså om sträckan är mindre än den största sträckan i itabeS

  OM hardetallt == TRUE, DÅ SKA VI

    Interpolera3 ( sträckan, itabeT, itabeS, itabeV )
    // Interpolering från bara 3 värden i tabeller så att vi hittar 
    // de tider och farter som motsvarar just den här sträckan

    sträckan := sträckan + stegetim 
    // sträckan växer för det nästa steget

  ANNARS SKA VI
    // Man måste ladda nya värden till de små tabellerna
    // för itabeS[2] är för små för sträckan

    OM störsti >= yttergräns, DÅ SKA VI

      alltgjort := TRUE		// ... men det går inte

    ANNARS SKA VI
      // vi tar i bruk nästa värden från de större tabellerna
      störsti := störsti + 1

      itabeS[0] := itabeS[1]	// skriver över
      itabeS[1] := itabeS[2]
      itabeS[2] := s[störsti]	// ett nytt värde

      itabeT[0] := itabeT[1]
      itabeT[1] := itabeT[2]
      itabeT[2] := t[störsti]

      itabeV[0] := itabeV[1]
      itabeV[1] := itabeV[2]
      itabeV[2] := v[störsti]

      // vi hoppas att det räcker, men det skadar 
      // inte om vi behöver göra det samma om igen
    SLUT OM

  SLUT OM

  OM sträckan > s[yttergräns], DÅ ÄR ... alltgjort := TRUE
  // sträckan har vuxit för stor för tabeller 
  // Ingenting mera att göra ; vi slutar iterationen

SLUT ITERATION

Jag tror emellertid redan att jag skall inte göra det just så här, beroende på det sättet jag har valt att presentera resultat i HTML-kod ...


Meny
Huvudsida (finska)