Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Sovellus: 3D-Ratojen Laskeminen While-Silmukoilla | Visualisoinnit
Matlab Perusteet
course content

Kurssisisältö

Matlab Perusteet

Matlab Perusteet

1. Perussyntaksi ja Koodaus Tekstieditorilla
2. Koodauksen Perusteet
3. Oppiminen Sovellusten Kautta
4. Visualisoinnit
5. Rekurssio ja Matriisikertolasku

book
Sovellus: 3D-Ratojen Laskeminen While-Silmukoilla

Tässä opit laskemaan esineiden radat liikkuessa 3D-avaruudessa, sekä toisen ohjelmoinnin osa-alueen: while-silmukat, joiden ainutlaatuiset ominaisuudet tekevät niistä yhtä perusasioita kuin for-silmukat ja if-lauseet, vaikka niitä ei käytetä yhtä usein.

While-silmukan rakenne

While-silmukat ovat samankaltaisia kuin for-silmukat, mutta niiden keskeinen ero on toistorakenteen ohjausmekanismissa. Kiinteän toistomäärän sijaan while-silmukka suorittaa koodia niin kauan kuin Boolean-ehto on tosi. Näin se toimii:

  • Boolean-ehto tarkistetaan ensin;

  • Jos ehto on tosi, silmukan sisällä oleva koodi suoritetaan;

  • Koodin suorittamisen jälkeen ehto tarkistetaan uudelleen. Jos se on edelleen tosi, koodi suoritetaan uudelleen. Tämä jatkuu niin kauan kuin ehto pysyy totena;

  • Kun ehto muuttuu epätodeksi, silmukka päättyy ja ohjelma jatkuu silmukan jälkeen.

Tämä rakenne on erityisen hyödyllinen, kun et tiedä etukäteen, kuinka monta kertaa silmukan täytyy toistua. Se suorittaa koodia, kunnes tietty ehto täyttyy, mikä tekee siitä sopivan tehtäviin, joissa toistojen määrä riippuu dynaamisista tekijöistä.

Koska while-silmukat toistuvat, kunnes Boolean on epätosi, on olemassa riski (olosuhteista tai virheestä johtuen), että Boolean pysyy aina totena ja while-silmukka toistuu loputtomasti!
Jos siis huomaat ohjelmasi kestävän huomattavasti tavallista pidempään, kannattaa pysäyttää se Matlabissa painamalla:

  • Ctrl + C;

  • Cmd + C.

Koodin pysäyttäminen kesken suorituksen auttaa arvioimaan logiikkaa ja koodia uudelleen.

Yksiulotteisen liikkeen yhtälö vakiokiihtyvyydellä

Videolla käytämme 1D-liikeyhtälöä:

x(t)=12at2+vit+xix(t) = \frac12 at^2 + v_it + x_i

missä:

  • tt on aika (sekunteina);

  • x(t)x(t) on kappaleen sijainti ajanhetkellä t;

  • xix_i on kappaleen alkusijainti;

  • viv_i on kappaleen alkunopeus;

  • aa on kappaleen kiihtyvyys (oletetaan vakioksi).

Tätä sovelletaan erikseen x, y, z -komponentteihin sijainnissa, nopeudessa ja kiihtyvyydessä komponenttikohtaisilla matriisioperaatioilla.

Tämä yhtälö on vakiintunut fysiikassa ja se johdetaan yleensä algebrallisesti (hieman työläämpää, mutta ei vaikeaa) tai integroimalla vakio kiihtyvyys kahdesti ajan suhteen (ja tunnistamalla, että syntyvät vakiotermit edustavat alkunopeutta ja alkusijaintia).

Se, että x, y, z ovat ortogonaalisia (keskenään kohtisuoria), mahdollistaa yhtälön soveltamisen kuhunkin ulottuvuuteen erikseen, ja samalla voimme hahmottaa tämän yhden ulottuvuuden analyysina ymmärtämisen helpottamiseksi.

Tehtävä

Kirjoita oma versiosi videolla esitetystä ohjelmasta ymmärtämällä seuraavat tavoitteet:

  1. Tuo alkuperäiset sijainnit ja nopeudet erillisinä matriiseina sekä objektien nimetsolutaulukkona;

  2. Järjestä nämä erikseen kahteen 3D-matriisiin siten, että jokaisen objektinsijainnit (x, y, z-koordinaatit) voivat kehittyä oman 2D-kerroksensa sarakkeissa. Tee sama alkuperäisille nopeuksille (vaikka ne eivät muutu—ne ovat aina alkuperäiset nopeudet) myöhempää indeksoinnin yhtenäisyyttä varten;

  3. Käytä for-silmukkaaobjektien läpikäyntiin, jotta voidaan laskea kunkin objektin 3D-rata;

  4. Laske kunkin objektin ratawhile-silmukassa, jonka Boolean-ehto tarkistaa ensin, onko objekti yhä maanpinnan yläpuolella (sen z-koordinaatti on 0\ge 0). While-silmukan sisällä sovelletaan 1D-liikeyhtälöä uuden sijainnin laskemiseen (sovella yhtälöä x, y, z-koordinaatteihin erikseen matriisioperaatioilla). Sijainnin laskemisen MILLOIN TAHANSA tulee perustua VAIN seuraaviin:

    • Objektin alkuperäinen sijainti;

    • Objektin alkuperäinen nopeus;

    • Tarkasteltava aika.

Sen EI tule perustua aiemmin laskettuun sijaintiin.

  • Syöttötietojen (alkuperäiset sijainnit + nopeudet) ja näistä muodostettujen 3D-matriisien tarkistaminen on aina hyvä tapa sulkea nämä ohjelman osat pois virhelähteinä;

  • Rajoita for-silmukka yhteen iteraatioon tai poista objektit 2 ja 3 (data ja nimet) Excel-tiedostosta nähdäksesi, miten ohjelmasi toimii yhdellä objektilla;

  • Ei-paraboliset radat voivat viitata ongelmaan liikeyhtälön soveltamisessa tai virheelliseen komponenttikohtaiseen laskentaan (muista pisteet ennen kertolaskua jne.);

  • Alkuperäisten sijaintien (kunkin 2D-kerroksen ensimmäinen sarake) 3D-rata-matriisissa tulisi olla samat kuin Excel-tiedostossa;

  • Negatiivisia arvoja ei tulisi olla (jokainen objekti aloitti positiivisella sijainnilla ja nopeudella kaikissa x, y, z-suunnissa);

  • Tarkista, miten kiihtyvyys on määritelty, tai kokeile asettaa se nollaksi. Tämän tulisi tuottaa liikettä vakionopeudella, jolloin muodostuu suoria kun piirretään (jos otat 3D-kuvion yläkuvasta, joka näyttää vain liikkeen x- ja y-suunnissa, joissa kiihtyvyys oli nolla, näet saman ilmiön);

  • Koordinaatistomme mukaan painovoima on 9.8m/s2-9.8 m/s^2 (alaspäin kohti Maata), ei +9.8+9.8.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

course content

Kurssisisältö

Matlab Perusteet

Matlab Perusteet

1. Perussyntaksi ja Koodaus Tekstieditorilla
2. Koodauksen Perusteet
3. Oppiminen Sovellusten Kautta
4. Visualisoinnit
5. Rekurssio ja Matriisikertolasku

book
Sovellus: 3D-Ratojen Laskeminen While-Silmukoilla

Tässä opit laskemaan esineiden radat liikkuessa 3D-avaruudessa, sekä toisen ohjelmoinnin osa-alueen: while-silmukat, joiden ainutlaatuiset ominaisuudet tekevät niistä yhtä perusasioita kuin for-silmukat ja if-lauseet, vaikka niitä ei käytetä yhtä usein.

While-silmukan rakenne

While-silmukat ovat samankaltaisia kuin for-silmukat, mutta niiden keskeinen ero on toistorakenteen ohjausmekanismissa. Kiinteän toistomäärän sijaan while-silmukka suorittaa koodia niin kauan kuin Boolean-ehto on tosi. Näin se toimii:

  • Boolean-ehto tarkistetaan ensin;

  • Jos ehto on tosi, silmukan sisällä oleva koodi suoritetaan;

  • Koodin suorittamisen jälkeen ehto tarkistetaan uudelleen. Jos se on edelleen tosi, koodi suoritetaan uudelleen. Tämä jatkuu niin kauan kuin ehto pysyy totena;

  • Kun ehto muuttuu epätodeksi, silmukka päättyy ja ohjelma jatkuu silmukan jälkeen.

Tämä rakenne on erityisen hyödyllinen, kun et tiedä etukäteen, kuinka monta kertaa silmukan täytyy toistua. Se suorittaa koodia, kunnes tietty ehto täyttyy, mikä tekee siitä sopivan tehtäviin, joissa toistojen määrä riippuu dynaamisista tekijöistä.

Koska while-silmukat toistuvat, kunnes Boolean on epätosi, on olemassa riski (olosuhteista tai virheestä johtuen), että Boolean pysyy aina totena ja while-silmukka toistuu loputtomasti!
Jos siis huomaat ohjelmasi kestävän huomattavasti tavallista pidempään, kannattaa pysäyttää se Matlabissa painamalla:

  • Ctrl + C;

  • Cmd + C.

Koodin pysäyttäminen kesken suorituksen auttaa arvioimaan logiikkaa ja koodia uudelleen.

Yksiulotteisen liikkeen yhtälö vakiokiihtyvyydellä

Videolla käytämme 1D-liikeyhtälöä:

x(t)=12at2+vit+xix(t) = \frac12 at^2 + v_it + x_i

missä:

  • tt on aika (sekunteina);

  • x(t)x(t) on kappaleen sijainti ajanhetkellä t;

  • xix_i on kappaleen alkusijainti;

  • viv_i on kappaleen alkunopeus;

  • aa on kappaleen kiihtyvyys (oletetaan vakioksi).

Tätä sovelletaan erikseen x, y, z -komponentteihin sijainnissa, nopeudessa ja kiihtyvyydessä komponenttikohtaisilla matriisioperaatioilla.

Tämä yhtälö on vakiintunut fysiikassa ja se johdetaan yleensä algebrallisesti (hieman työläämpää, mutta ei vaikeaa) tai integroimalla vakio kiihtyvyys kahdesti ajan suhteen (ja tunnistamalla, että syntyvät vakiotermit edustavat alkunopeutta ja alkusijaintia).

Se, että x, y, z ovat ortogonaalisia (keskenään kohtisuoria), mahdollistaa yhtälön soveltamisen kuhunkin ulottuvuuteen erikseen, ja samalla voimme hahmottaa tämän yhden ulottuvuuden analyysina ymmärtämisen helpottamiseksi.

Tehtävä

Kirjoita oma versiosi videolla esitetystä ohjelmasta ymmärtämällä seuraavat tavoitteet:

  1. Tuo alkuperäiset sijainnit ja nopeudet erillisinä matriiseina sekä objektien nimetsolutaulukkona;

  2. Järjestä nämä erikseen kahteen 3D-matriisiin siten, että jokaisen objektinsijainnit (x, y, z-koordinaatit) voivat kehittyä oman 2D-kerroksensa sarakkeissa. Tee sama alkuperäisille nopeuksille (vaikka ne eivät muutu—ne ovat aina alkuperäiset nopeudet) myöhempää indeksoinnin yhtenäisyyttä varten;

  3. Käytä for-silmukkaaobjektien läpikäyntiin, jotta voidaan laskea kunkin objektin 3D-rata;

  4. Laske kunkin objektin ratawhile-silmukassa, jonka Boolean-ehto tarkistaa ensin, onko objekti yhä maanpinnan yläpuolella (sen z-koordinaatti on 0\ge 0). While-silmukan sisällä sovelletaan 1D-liikeyhtälöä uuden sijainnin laskemiseen (sovella yhtälöä x, y, z-koordinaatteihin erikseen matriisioperaatioilla). Sijainnin laskemisen MILLOIN TAHANSA tulee perustua VAIN seuraaviin:

    • Objektin alkuperäinen sijainti;

    • Objektin alkuperäinen nopeus;

    • Tarkasteltava aika.

Sen EI tule perustua aiemmin laskettuun sijaintiin.

  • Syöttötietojen (alkuperäiset sijainnit + nopeudet) ja näistä muodostettujen 3D-matriisien tarkistaminen on aina hyvä tapa sulkea nämä ohjelman osat pois virhelähteinä;

  • Rajoita for-silmukka yhteen iteraatioon tai poista objektit 2 ja 3 (data ja nimet) Excel-tiedostosta nähdäksesi, miten ohjelmasi toimii yhdellä objektilla;

  • Ei-paraboliset radat voivat viitata ongelmaan liikeyhtälön soveltamisessa tai virheelliseen komponenttikohtaiseen laskentaan (muista pisteet ennen kertolaskua jne.);

  • Alkuperäisten sijaintien (kunkin 2D-kerroksen ensimmäinen sarake) 3D-rata-matriisissa tulisi olla samat kuin Excel-tiedostossa;

  • Negatiivisia arvoja ei tulisi olla (jokainen objekti aloitti positiivisella sijainnilla ja nopeudella kaikissa x, y, z-suunnissa);

  • Tarkista, miten kiihtyvyys on määritelty, tai kokeile asettaa se nollaksi. Tämän tulisi tuottaa liikettä vakionopeudella, jolloin muodostuu suoria kun piirretään (jos otat 3D-kuvion yläkuvasta, joka näyttää vain liikkeen x- ja y-suunnissa, joissa kiihtyvyys oli nolla, näet saman ilmiön);

  • Koordinaatistomme mukaan painovoima on 9.8m/s2-9.8 m/s^2 (alaspäin kohti Maata), ei +9.8+9.8.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3
some-alt