fizikalna simulacija plovnosti · web viewpodpisani daniel bernad , roj. 04. 03. 1974 , študent...
TRANSCRIPT
UNIVERZA V MARIBORUPEDAGOŠKA FAKULTETA
Oddelek za fiziko
Diplomsko delo
FIZIKALNA SIMULACIJA PLOVNOSTIDaniel Bernad
Mentor: doc. dr. Mitja SLAVINEC
Somentor: asist. dr. Dean KOROŠEC
Murska Sobota, avgust 2005
Zahvala
Iskrena hvala za pomoč, koristne nasvete, dodatno razlago in zelo prijateljski odnos svojemu
mentorju, doc. dr. Mitji Slavincu, brez katerega ne bi mogel sestaviti diplomskega dela v
takšni obliki. Posebej se še zahvaljujem somentorju dr. Deanu Korošcu za pomoč pri pisanju
programa.
UNIVERZA V MARIBORU
PEDAGOŠKA FAKULTETA
IZJAVA
Podpisani Daniel Bernad , roj. 04. 03. 1974 , študent Pedagoške fakultete Univerze v Mariboru, smer fizika , izjavljam, da je diplomsko delo z naslovom
Fizikalna simulacija plovnosti
pri mentorju doc. dr. Mitja Slavinec , avtorsko delo. V diplomskem delu so uporabljeni viri
in literatura korektno navedeni; teksti niso prepisani brez navedbe avtorjev.
______________
(podpis študenta)
Maribor, 12. 08. 2005
PovzetekPotapljanje postaja vedno bolj privlačna sprostitev in rekreativna dejavnost. Voda ima v
mnogih pogledih drugačen vpliv na človeško telo kot zrak, ki je nujen. Eden izmed teh je tudi
povečan vzgon in s tem povezano uravnavanje plovnosti potapljačev. Slednja je odvisna od
mnogih dejavnikov, kot so dihanje, globina, na kateri se potapljač nahaja, obtežitev,
napihnjenost kompenzatorja plovnosti in podobno. Uravnavanje plovnosti je tudi ena
najpomembnejših prvin, ki se jih morajo tečajniki naučiti med potapljaškim tečajem, zato smo
razvili računalniški model, s katerim fizikalno ovrednotimo najpomembnejše dejavnike, ki
vplivajo na vzgon in simuliramo plovnost potapljačev. Model je koristen didaktični
pripomoček za poučevanje potapljanja, ki ima podoben pomen in vlogo kot npr. simulatorji
letenja, katere uporabljajo pri učenju pilotiranja.
SummaryScuba diving is becoming an attractive relaxation and recreational activity. Water, a diver’s
environment, has different impact to the human body than air habitat. One of them is
increased buoyancy and with it the problem of diver’s buoyancy control. Buoyancy depends
on many factors, like breathing, water depth, ballast, buoyancy compensator, etc. Buoyancy
control is one of the most important skills that participants in a scuba diving course have to
master. We developed a computer based model for diver’s buoyancy evaluation and
simulation. The model is a very good didactic accessory for scuba diving courses and has a
role similar to the flight simulators in aviation.
Ključne besede:
potapljanje, fizikalni model, plovnost, kompenzator plovnosti, didaktični pripomoček , Matlab
Key words:
Scuba diving, physical modeling, buoyancy control, buoyancy compensator, didactic
accessory, Matlab
IV
Kazalo:
1. UVOD.................................................................................................................................3
1.1. Plovnost.......................................................................................................................3
1.2. Hidrostatični tlak.........................................................................................................5
1.3. Vzgon in plovnost.......................................................................................................6
1.4. Plinski zakoni..............................................................................................................7
1.5. Sila upora....................................................................................................................8
2. POTAPLJANJE................................................................................................................10
2.1. Potapljaška oprema...................................................................................................10
2.1.1. Potapljaška obleka................................................................................................10
2.1.2. Potapljaška jeklenka..............................................................................................11
2.1.3. Kompenzator plovnosti.........................................................................................11
2.2. Dihanje......................................................................................................................11
2.3. Plavanje.....................................................................................................................12
3. FIZIKALNI MODEL........................................................................................................13
3.1. Izhodiščne vrednosti osnovnih spremenljivk............................................................14
3.1.1. Dihanje..................................................................................................................17
3.1.2. Kompenzator plovnosti.........................................................................................17
3.1.3. Konstante..............................................................................................................18
4. PROGRAMSKA IMPLEMENTACIJA...........................................................................19
4.1. Simulacija.................................................................................................................19
4.1.1. Dokumentacija......................................................................................................19
4.1.2. Inicializacija spremenljivk....................................................................................19
4.1.3. Inicializacija uporabniškega vmesnika.................................................................20
4.1.4. Glavna zanka in nadzor nad izvajanjem simulacije..............................................21
4.1.5. Podprogrami za nadzor simulacije........................................................................21
4.1.6. Fizikalna simulacija..............................................................................................21
4.2. Matlab.......................................................................................................................21
4.2.1. Zahteve programa Matlab.....................................................................................22
4.2.2. Uporabniški vmesnik Matlaba..............................................................................22
4.3. Uporabniški vmesnik simulacije...............................................................................23
4.3.1. Prikaz gibanja........................................................................................................23
4.3.2. Parametri...............................................................................................................24
4.3.3. Konstante..............................................................................................................25
0
4.3.4. Nadzor...................................................................................................................25
4.4. Zgradba simulacijskega vmesnika............................................................................26
4.5. Podatkovni model.....................................................................................................27
5. PRIMERI DELOVANJA SIMULACIJE IN REZULTATI.............................................28
5.1. Testiranje modela......................................................................................................28
5.2. Simulacija plovnosti..................................................................................................28
5.3. Povezava programa s strojno opremo.......................................................................31
5.4. Uporaba simulacije pri potapljaških tečajih..............................................................32
6. ZAKLJUČEK...................................................................................................................33
7. LITERATURA.................................................................................................................34
8. PRILOGA.........................................................................................................................36
1
1. UVODLjudje se že od nekdaj spogledujejo z okolji, ki niso njihov naravni življenjski prostor. Včasih
jih v to silijo potrebe, raziskovanje novega, lažje premagovanje ovir, kot npr. pri letenju,
pogosto pa so razlogi povezani zgolj z rekreacijo in prijetnim preživljanjem prostega časa.
Med slednje prav gotovo spada rekreativno potapljanje, ki se je v zadnjih dveh desetletjih zelo
razširilo. Za razliko od pionirskih časov avtonomnega potapljanja, ko je le-to bilo rezervirano
zgolj za izbrance, predvsem vojake, je danes potapljanje dostopno praktično vsakomur, ki ga
bivanje pod vodo veseli.
Tak razvoj potapljanja je v veliki meri pogojen s tehnološkim napredkom in razvojem
potapljaške opreme ter raziskavami vpliva podvodnega medija na ljudi, predvsem na
fiziologijo. V obeh primerih je ključnega pomena dobro poznavanje fizikalnih zakonitosti
povezanih z bivanjem pod vodo. Prav v tem se tudi kaže sorodnost s prizadevanji bivati v
zraku, saj pri nobenem drugem športu ali rekreaciji ni treba med usposabljanjem spoznati
toliko fizikalnih zakonov kot pri potapljačih in pilotih.
Potapljači se za kasnejše varno bivanje pod vodo morajo seznaniti z osnovnimi zakoni ter
hkrati razumeti njihov pomen in vpliv v povsem aplikativnem smislu, torej kaj to pomeni v
praksi pod vodo. Prav zaradi tega je pomembno, da je pouk fizikalnih vsebin na potapljaških
tečajih kar se da nazoren in podkrepljen tudi z demonstracijskimi poskusi. V ta namen smo
razvili računalniški model, s katerim simuliramo vpliv nekaterih fizikalnih zakonitosti, ki
najpomembneje vplivajo na bivanje potapljačev pod vodo.
V nadaljevanju bomo najprej predstavili nekaj osnovnih fizikalnih zakonitosti povezanih s
potapljanjem. Sledi predstavitev osnovne potapljaške opreme, spet s posebnim poudarkom na
fizikalnih lastnostih, ki jih upoštevamo pri modelu plovnosti. V naslednjih poglavjih bo
predstavljen fizikalni model in računalniški algoritem, na katerem temelji simulacija
plovnosti. V zaključku je predstavitev rezultatov in možnosti uporabe ter didaktični pomen
razvitega orodja predvsem pri izobraževanju potapljačev.
1.1. Plovnost
Nekatera telesa v kapljevinah potonejo na dno, nekatera plavajo, nekatera pa kažejo nevtralen
odziv in se ne premikajo niti gor niti dol. Pravimo, da ima neko telo v izbrani kapljevini
negativno, pozitivno ali nevtralno plovnost. Telo ima pozitivno plovnost in plava na površini,
če je njegova povprečna gostota manjša od gostote kapljevine. Plovnost telesa je negativna in
2
tone na dno, kadar je njegova povprečna gostota večja od gostote kapljevine ter nevtralna, ko
sta gostoti telesa in kapljevine enaki.
Zmožnost uravnavanja plovnosti je še posebej pomembna pri potapljanju, saj s tem ne le da
potapljači vplivajo na sam potop, temveč si tudi zagotovijo varen povratek nazaj na površino
ob koncu potopa ali v primeru sile. Za potapljača je najbolj ugodno, da ima nevtralno
plovnost, torej da lebdi v vodi. Tega pa ni lahko doseči v vseh fazah potopa. Razlogov je več,
vsi pa so povezani s spremembami povprečne gostote potapljačev. Naštejmo nekaj
najpomembnejših:
Ko potapljač vdihne, se mu pri praktično nespremenjeni masi poveča volumen, zaradi
česar se njegova povprečna gostota zmanjša in posledično poveča plovnost.
Potapljač je med potapljanjem oblečen v zaščitno obleko iz neoprena, ki vsebuje
mnogo plinskih mehurčkov. Z naraščajočo globino povečan tlak obleko stiska, zaradi
česar se potapljačem plovnost z globino zmanjšuje.
Potapljač med potopom diha zrak iz jeklenke, zato se njegova povprečna gostota
zmanjšuje in potapljaču plovnost s časom narašča.
Vpliv zgoraj naštetih dejavnikov v splošnem ni zanemarljiv, saj lahko povprečno gostoto
potapljačev spremenijo tudi do 10 odstotkov. V pionirskih časih potapljanja so si potapljači
pomagali na različne načine, kot npr. s pobiranjem težkih kamnov z dna ali zadrževanjem
diha, dandanašnji pa so opremljeni s posebnimi napihljivimi nahrbtniki, imenovanimi
kompenzator plovnosti. Ko imajo negativno plovnost, ga napolnijo z zrakom iz jeklenke, ko
pa je plovnost pozitivna, enostavno izpustijo odvečen zrak iz njega. Še vedno pa manjše
spremembe plovnosti uravnavajo s pljuči.
Inštruktorji si pri potapljaških tečajih pomagajo z različnimi didaktičnimi pripomočki. Varna
in zanesljiva uporaba kompenzatorja plovnosti je ena izmed najzahtevnejših vsebin
potapljaških tečajev, zato smo se odločili razviti simulator, s katerim se bodo potapljači lahko
še pred vstopom v vodo seznanili z delovanjem in varno uporabo kompenzatorja plovnosti pri
uravnavanju plovnosti.
Model navideznega potapljača tečajnikom omogoča, da lahko simulirajo svoj prvi »potop« s
posebnim poudarkom prav na uravnavanju plovnosti. S tem lahko izboljša osnove potapljanja
in si skrajša čas vadbe, ki bi ga pozneje potreboval v realnem podvodnem okolju. Model ob
plovnosti simulira tudi porabo zraka in glede na izbrano opremo prikazuje preostali
razpoložljivi zrak in globino, omogoča pa tudi nazoren prikaz vseh drugih količin, ki jih
potapljaču med realnim potopom prikazujejo potapljaški inštrumenti.
3
Pomen simulacijskega modela je še toliko večji, ker predstavlja novost na področju
izobraževanja potapljačev, hkrati pa je zastavljen tako, da ga je moč razširiti tudi z različnimi
merilniki in receptorji, ki si jih tečajniki namestijo nase.
Tak sistem, ki se uporablja v VRML okolju in vključuje primerno strojno opremo za
zaznavanje osnovnih ukazov za polnjenje in praznjenje kompenzatorja plovnosti, je bil do
določene mere tudi uspešno realiziran [1].
1.2. Hidrostatični tlak
V tekočinah zaradi njihove teže deluje hidrostatični tlak [2, 3]. Hidrostatični tlak, ki smo mu
izpostavljeni vsak dan, je kar zračni tlak, s katerim zrak v atmosferi deluje zaradi svoje teže.
Na morski gladini znaša približno 1 bar. Hidrostatični tlak je odvisen od gostote tekočine in
narašča z globino:
()
kjer je p hidrostatični tlak na globini h pod površino tekočine, g težni pospešek in gostota
tekočine. Iz gornje enačbe lahko razberemo, da se v vodi tlak vsakih 10 m poveča za približno
1 bar. Poudarimo, da se za razliko vode, zračni tlak z višino ne spreminja linearno, saj se z
višino spreminja gostota zraka, med tem ko je gostota vode praktično enaka na vseh globinah.
Na potapljača pod vodo ob zračnem tlaku torej še dodatno deluje hidrostatični tlak
. ()
Voda ima veliko večjo gostoto od zraka, zato tlak z globino hitreje narašča, saj se vsakih 10 m
poveča za toliko, kot znaša celotni zračni tlak. Kot primer navedimo, da je na globini 20 m
potapljač izpostavljen trikrat večjemu tlaku, kot je običajno na površini (slika 1).
4
h = 20 m
p0=1 bar
ph=2 bar
pp=pv+ph=3 bar
Slika 1: Prikaz delovanja zračnega in hidrostatičnega tlaka vode na potapljača
1.3. Vzgon in plovnost
Tlak v tekočinah narašča z globino. Sila na spodnjo ploskev potopljenih teles je zato večja kot
na zgornjo, zaradi česar njuna rezultanta kaže navpično navzgor. To silo, ki deluje na telesa
potopljena v tekočine, imenujemo sila vzgona . Njena velikost je enaka teži izpodrinjene
tekočine:
()
kjer je V volumen tistega dela tekočine, ki ga telo izpodriva. Vzgon v zraku lahko običajno
zanemarimo, saj je le tisočinka teže ljudi. Povsem drugače pa je v vodi, saj je povprečna
gostota ljudi približno enaka gostoti vode in zato sta tudi sila vzgona in sila teže primerljivi.
Velikost sile teže glede na silo vzgona vpliva na plovnost teles, tj. ali telesa plavajo na
površini, potonejo na dno, ali lebdijo v tekočini. V kolikor silo teže, ki je odvisna od mase
telesa, izrazimo s prostornino V in povprečno gostoto telesa :
()
in to primerjamo z enačbo (3), vidimo, da je plovnost telesa v neki tekočini odvisna le od
gostote tekočine in povprečne gostote telesa . Če je gostota telesa manjša od gostote
tekočine, telo plava, v nasprotnem primeru pa potone.
5
Ko telo plava na površini, sta v ravnovesju sila teže in vzgona [2]:
. ()
Plavajoča telesa niso v celoti potopljena. Kolikšen del telesa moli iz površine, je spet odvisno
od razlike obeh gostot. Kratek račun pokaže, da velja zveza:
, ()
kjer je V volumen telesa in V' volumen telesa, ki je potopljen [3, 4].
1.4. Plinski zakoni
Stanje idealnega plina v odvisnosti od tlaka, volumna in temperature nam opisuje plinska
enačba, iz katere izhaja, da je produkt tlaka in volumna nekega plina, deljeno s temperaturo
izraženo v absolutni skali, konstanten. Ker so med potapljanjem spremembe temperature
manjšega pomena, jih lahko zanemarimo in shajamo z Boylovim zakonom, ki pravi, da je
produkt prostornine in tlaka, pri katerem se nahaja neka množina plina, ves čas konstanten. Iz
tega lahko zapišemo zvezo, ki jo bomo v modelu pogosto uporabili:
()
kjer sta V1 in V2 volumna plina v dveh različnih stanjih, p1 in p2 pa pripadajoča tlaka. V
kolikor se npr. tlak podvoji, se volumen plina zmanjša na polovico (slika 2) in obratno, če se
tlak zmanjša na pol, se plinu prostornina podvoji [5].
Vpliv Boylovega zakona je pri potapljanju lahko zelo velik, saj se z globino tlak kaj hitro
spremeni za nekajkrat [6, 7].
6
Slika 2: Sprememba prostornine zraka v odprti poveznjeni posodi v odvisnosti od
hidrostatičnega tlaka na različnih globinah [5]
1.5. Sila upora
Na potapljača v vodi deluje veliko večji upor sredstva kot v zraku. To je treba med drugim
upoštevati tudi pri načrtovanju potopa, še posebej, če so prisotni vodni tokovi. V našem
primeru, ko simuliramo dvigovanje in spuščanje potapljača, sila upora deluje v navpični
smeri.
Ločimo linearni in kvadratni zakon upora. Pri manjših hitrostih je prevladujoč vpliv
linearnega zakona upora:
, ()
kjer je r tipična dimenzija telesa (v našem primeru npr. polmer krogle, s katero bi najbolje
opisali potapljača), v hitrost gibanja telesa in viskoznost vode.
Pri večjih hitrostih postane prevladujoč prispevek sile kvadratnega zakona upora:
, ()
kjer je gostota vode, S tipičen presek telesa (potapljača), koeficient upora in v hitrost
potapljača.
Katera sila upora prevladuje, nam pove Reynoldsovo število [3]:
7
. ()
V primerih, ko je Reynoldsovo število reda velikosti 1, ima prevladujoč vpliv linearni zakon
upora, pri velikih Reynoldsovih številih, npr. preko 1000, je prevladujoč kvadratni zakon
upora, pri vmesnih vrednostih pa je treba upoštevati oba.
Izkaže se, da pri simulaciji potapljačev v večini primerov nastopajo razmere, ko velja
kvadratni zakon upora, kar je ustrezno upoštevano tudi v samem računalniškem programu.
8
2. POTAPLJANJEV nadaljevanju si bomo ogledali osnovne značilnosti potapljanja, predvsem na kakšen način
in v kolikšni meri lahko potapljači vplivajo na vzgon in plovnost. Najprej bomo spoznali
potapljaško opremo, v drugem delu pa še, kako potapljač (predvsem z dihanjem ali
plavanjem) lahko vpliva na plovnost.
2.1. Potapljaška oprema
2.1.1. Potapljaška obleka
Potapljaška obleka potapljača varuje pred podhladitvijo, saj voda približno 25-krat hitreje
odvaja toploto od telesa kot zrak.
Obstajajo različne vrste potapljaških oblek. Vsem je bolj ali manj skupno, da so zgrajene iz
materialov, ki zaradi čim boljših izolacijskih lastnosti vsebujejo mehurčke plina. Najpogosteje
se uporablja neopren. To je posebna ekspandirana umetna guma, v katero je napihnjen dušik v
obliki mehurčkov, ki so ločeni med seboj tako, da neopren ne more vpijati vode kot spužva.
Običajna debelina oblek je od 3 do 8 mm, ki pa se zaradi povečanega hidrostatičnega tlaka z
globino tanjša, zaradi česar se njena plovnost zmanjšuje (s tem pa se zmanjšuje tudi
izolacijska sposobnost obleke).
Volumen potapljaške obleke lahko ocenimo iz površine telesa in debeline obleke ter običajno
znaša okrog 10 do 15 litrov (v modelu je nastavljeno na 12 litrov) [8, 9, 10].
Volumen potapljaške obleke se z naraščajočim tlakom zmanjšuje nekoliko manj, kot bi to
izhajalo iz Boylovega zakona, saj se stiskajo le mehurčki dušika, med tem ko prostornina
gume ostaja nespremenjena, kar smo v modelu opisali z enačbo:
, ()
kjer je Vs volumen obleke (suite), Vsh volumen stisnjenje obleke na določeni globini h, Ks
konstanta, ki pove, kolikšen delež prostornine obleke predstavlja guma (ni stisljiv kot plini),
p0 hidrostatični tlak na gladini in pdh tlak na globini, kjer se potapljač nahaja [5].
9
2.1.2. Potapljaška jeklenka
Avtonomna potapljaška oprema ali SCUBA (angl. Self Contained Underwater Breathing
Apparatus) potapljaču pod vodo omogoča prosto gibanje, saj zrak, ki ga pod vodo diha, nosi s
sabo v potapljaški jeklenki (za razliko potapljačev, katerim zrak po posebni cevi sproti tlačijo
v globino). Pri rekreativnem potapljanju so jeklenke praviloma napolnjene z zrakom, lahko pa
vsebuje tudi različne druge pline ali njihove mešanice. Izdelane so iz jekla ali aluminija.
Količina zraka je odvisna velikosti jeklenke in od tlaka, do katerega je jeklenka napolnjena.
Tipične velikosti jeklenk so 10, 12, 15 ali 18 l. Pritisk, do katerega so lahko napolnjene, pa je
200 bar, v zadnjem času pa se uveljavljajo tudi jeklenke, ki se polnijo do 300 bar.
Kratek račun pokaže, da je v npr. 15-litrski jeklenki, napolnjeni z zrakom do 200 bar, masa
zraka približno 4 kg. Med potopom potapljač diha zrak iz jeklenke, zaradi česar se njegova
skupna masa zmanjšuje, volumen pa ostaja nespremenjen, kar povečuje njegovo plovnost [5,
11, 12].
2.1.3. Kompenzator plovnosti
Potapljaču se med potopom zaradi različnih dejavnikov spreminja povprečna gostota in s tem
vzgon in sama plovnost. Za kompenzacijo plovnosti potapljači uporabljajo kompenzator
plovnosti (Buoyancy Compensator). Volumen vreče se od kompenzatorja do kompenzatorja
spreminja glede na njegovo velikost, namen in same potrebe potapljača. Tipične vrednosti pa
so med 12 do 40 litrov, kar je upoštevano tudi v modelu.
2.2. Dihanje
Pri dihanju se pljuča širijo in krčijo, zaradi česar se spreminja volumen potapljača pri
praktično nespremenjeni masi, kar vpliva na njegovo povprečno gostoto in s tem plovnost.
Potapljač običajno diha malo intenzivneje, kar znaša cca 2 l. Pri največjem možnem vdihu ali
izdihu pa je ta sprememba volumna enaka vitalni kapaciteti pljuč, kar znaša v povprečju
približno 6 l in predstavlja 5 do 10 % celotnega volumna potapljača.
Dihanje samo ne predstavlja večjega problema pri uravnavanju plovnosti, še toliko bolj, ker se
periodično ponavlja vdih in izdih, lahko pa z globokim vdihom ali izdihom potapljač v veliki
meri vpliva na plovnost. Pri prostem potapljanju se npr. veliko lažje potopimo s praznimi kot
s polnimi pljuči.
Uravnavanje plovnosti z zadrževanjem diha pa se ne priporoča zaradi varnostnih razlogov.
10
2.3. Plavanje
Potapljač odstopanje od nevtralne plovnosti delno kompenzira tudi s samim plavanjem.
Odrasla oseba, vsaj nekaj časa, brez težav plava npr. z 10-kilogramskim pasom uteži, vendar
je tovrstno potapljanje naporno, neprijetno in predvsem nevarno. Zaradi tega majhna
odstopanja plovnosti, relativno izraženo nekako do 5 %, lahko potapljači krajši čas
kompenzirajo tudi s samim plavanjem, vendar še posebej pri začetnikih to ni priporočljivo.
Zaradi prekomernega fizičnega napora se lahko zadihajo, kar pogosto vodi do panike in
podvodnih incidentov.
11
3. FIZIKALNI MODELNa potapljača pod vodo delujejo predvsem sila teže, sila vzgona in sila upora ter običajno tudi
sila, ki jo potapljač ustvarja s svojim plavanjem. V modelu simuliramo prve tri sile, med tem
ko silo plavanja lahko pogojno dodamo kot zunanji vpliv. Simulacija temelji na klasičnem
Newtonovem zapisu gibalnih enačb v eni dimenziji (navpična smer), kjer sproti spremljamo
rezultanto sile in celotno maso potapljača. Iz teh podatkov računamo trenutni pospešek:
, ()
kjer sta mi in Fi masa in rezultanta sile na koncu i-te interakcije, ai pa pospešek v i interakciji.
Na začetku vsakega diskretiziranega časovnega intervala (z možnostjo nastavitve dolžine) so
uporabljene končne vrednosti prejšnjega intervala, gibanje znotraj posameznega intervala pa
se obravnava kot enakomerno pospešeno in tako preko numerične integracije sproti
izračunamo trenutno hitrost ter lego potapljača:
, (a)
, (13b)
kjer je vi+1 hitrost potapljača na koncu i+1 iteracije, vi hitrost na koncu i-te iteracije, hi+1 in hi
legi potapljača na koncu i+1 in i-te iteracije ter časovni interval posamezne iteracije [13,
14, 15].
Končne vrednosti sile in hitrosti ter lege na izbranem časovnem intervalu se potem spet
uporabijo kot začetne vrednosti naslednjega intervala.
Grafična predstavitev dobljenih rezultatov je dinamične narave, kjer se v enakomernih
presledkih izrisuje lega potapljača in njegova hitrost. Časovni interval izrisovanja je poljuben
večkratnik časovnega intervala simulacije.
Začetne parametre je moč poljubno nastavljati, nekatere pa kot optimalne predlaga simulator.
Od optimalne začetne nastavitve, npr količina dodatne obtežitve, je v veliki meri pogojeno
kasnejše obnašanje potapljača pod vodo, tako da uporabnik lahko praktično preizkusi, koliko
težje je v primeru neprimerno izbrane opreme zagotavljati nevtralno plovnost potapljača [16,
17].
12
3.1. Izhodiščne vrednosti osnovnih spremenljivk
Potapljaču se plovnost spreminja zaradi zunanjih vplivov, kot so npr. globina in s tem
povezane spremembe volumnov obleke in kompenzatorja, zaradi dihanja in zaradi
napihovanja ali praznjenja kompenzatorja. Za zagotovitev čim večjega ujemanja z realnim
stanjem in s tem verodostojnosti simulacije ter primerljivosti z realnim primerom smo izvedli
meritve fizikalnih lastnosti potapljaške opreme in upoštevali fiziološke značilnosti in odzive
človeškega telesa med potapljanjem [5].
Za lažje razumevanje smo dodali seznam uporabljenih spremenljivk, ki smo jih zbrali v 2
tabelah. Tabela 1 predstavlja parametre in v njej je za vsako spremenljivko podano ime, opis
in nastavljena vrednost. Parametri se ves čas programa spreminjajo in izračunavajo. V tabeli 2
pa so zbrane konstante, ki se nanašajo na simuliranega potapljača in se med simulacijo ne
spreminjajo.
Tabela 1: Parametri programa
Splošni fizikalni parametri
Ime Opis Vrednost Enota
13
p.d.h Globina potapljača 0 mp.d.v Hitrost potapljača 0 m/sp.d.vPrev Hitrost potapljača v prejsnjem časovnem trenutku 0 m/sp.d.dv Sprememba hitrosti 0 m/sp.d.a Pospešek potapljača 0 m/s2
p.d.Fr Sila upora 0 Np.d.V Skupen volumen 0 lp.d.Vfiksen Fiksen volumen 0 lp.d.Vcas Volumen odvisen od časa 0 lp.d.r Polmer krogle, s katerim aproksimiramo potapljača 0 mp.d.Fg Sila teze potapljača 0 Np.d.Fb Izračunamo silo vzgona (buoyant force) 0 Np.d.ph Tlak v odvistnosti od globine 1 barp.d.phPrev Prejšnji tlak v odvistnosti od globine 1 barp.d.smer Smer gibanja (gor = 1, dol = -1) 0 -p.d.m Skupna masa 0 kgp.d.mfiksna Fiksna masa, ki se ne spreminja 0 kgp.d.mcas Masa odvisna od časa 0 kg
Dihanje
p.r.f Frekvenca dihanja (respiration rate) 8 vdihi/minp.r.V Volumen zraka v pljučih (lung volume) med dihanjem 2.5 lp.r.Vs Volumen zraka v pljučih (lung volume) med dihanjem –
slider0 l
p.r.Vsh Volumen zraka v pljučih (lung volume) odvisen od globine 0 l
Kompenzator plovnosti
p.b.V Volumen zraka v kompezatorju plovnosti, če bi bili na površini
2 l
p.b.Vk Volumen zraka v kompenzatorju plovnosti (BCD-ju) potapljač je v ravnovesju
2.6001 l
p.b.Vh Volumen zraka v kom.plov. v odvisnosti od globine 2.60001 lp.b.dV Trenutni pretok iz/v BCD 0 l/s
Jeklenka
p.t.V Volumen jeklenke 0 lp.t.dV Sprememba volumna v jeklenki 0 lp.t.ma Masa zraka v jeklenki 2.6 kgp.t.p Pritisk zraka v jeklenki 0 bar
Obleka
p.s.V Volumen obleke(suit) pozneje izračunamo 0 l
Tabela 2: Konstante programa
Ime Opis Vrednost Enota
Splošni fizikalni parametri
14
c.d.g Gravitacijski pospešek 10 m/s2
c.d.m Masa potapljača z opremo 75 kgc.d.p0 Tlak na površini 100.000 Pac.d.ro Gostota vode 1000 kg/m3
c.d.mi Viskoznost 0.0013 kg/msc.d.hNull Minimalna globina 0 mc.d.hMin Minimalna globina 0 mc.d.hMax Maksimalna globina -40 mc.d.vMin Hitrost na dnu oz. na površini 0 m/sc.d.aMin Pospešek na dnu oz. površini 0 m/s2
c.d.Fep silon Ustavljanje potapljača 10 Nc.d.vepsilon Ustavljanje potapljača 0 m/s
Dihanjec.r.fMax Maksimalna frekvenca dihanja 60 vdihi/minc.r.VMax Maksimalni volumen pljuč (+/- od ravnovesja) 1.5 l
Kompenzator plovnostic.b.VMax Maksimalni volumen zraka v kompenzatorju (pri
normalnem tlaku)20 m3
c.b.VMin Minimalen volumen zraka v kompenzatorju (pri normalnem tlaku)
0 m3
c.b.fs Vzorčevalna frekvenca za zvok 8000 Hzc.b.SoundIn Zvok ob polnjenju in praznjenju kompenzatorja Glej prog. -c.b.SoundOut Zvok ob polnjenju in praznjenju kompenzatorja Glej prog. -
Jeklenkac.t.p Pritisk zraka v jeklenki 200 barc.t.dVp Pretok zraka iz jeklenke v kompenzator plovnosti 1 l/sc.t.dVm Pretok zraka iz kompenzatorja plovnosti 2 l/sc.t.V Volumen jeklenke [l] pri talku 1 bar 12 lc.t.m Masa jeklenke c.t.V * 1.5 kgp.t.prezerva Rezerva v jeklenki je 50 barov. 50 barp.t.pnull Jeklenka je prazna. 0 barc.t.desetbar Izpiše obvestilo, da je še 10 barov v jeklenki. 10 barc.t.rezerva Jeklenka je na rezervi in izpiše obvestilo. 50 bar
Oblekac.s.t Debelina obleke potapljača (suit thickness) 5 mmc.s.m Masa obleke (c.s.t * 3 * masa/100) 4 kgc.s.k Aproksimacija človeka 0.5 -
Uteži c.w.m Dodatne uteži potapljača, ki je enaka predlagani masi uteži. 0 kg c.e.m Masa ostale opreme 8 kg
15
3.1.1. Dihanje
Ritem dihanja pri odraslem človeku je med 15 in 18 vdihov na minuto, pri povprečnem vdihu
in izdihu pa se izmenja od 0,5 do 1 l zraka. Pri fizičnem naporu se poveča poraba zraka, kar se
manifestira tako v ritmu dihanja kakor amplitudi posameznega vdiha [18, 19].
Med potapljanjem potapljači običajno dihajo tako, da je amplituda posameznega vdiha večja,
frekvenca pa se ne poveča, temveč celo nekoliko zmanjša. Povprečna poraba zraka med
potapljanjem je približno 20 l/min.
V simulaciji je dihanje izraženo s sinusno funkcijo ustrezne frekvence in amplitude:
, ()
kjer je V0 amplituda, kar znaša polovični volumen povprečnega vdiha ali izdiha, vdiha pa
frekvenco dihanja. Obstoji možnost nadgradnje simulatorja z ustreznim receptorjem dihanja,
bodisi preko merjenja pretoka skozi cev, ki si jo uporabnik da v usta, bodisi preko
dinamičnega merjenja obsega prsnega koša.
Vpliv dihanja je upoštevan preko spremembe volumna potapljača in spremembe mase zraka v
jeklenki, pri čemer se upošteva tudi globina, na kateri se potapljač nahaja, saj je od tega
odvisna gostota zraka, ki ga diha [5, 20].
3.1.2. Kompenzator plovnosti
Volumen kompenzatorja plovnosti lahko prosto nastavljamo, tipična vrednost pri simulaciji
pa je 20 litrov. Naslednja ključna podatka sta še pretok zraka pri polnjenju in praznjenju
kompenzatorja. V realnem primeru pretoki lahko presežejo tudi 3 l/, vendar je z ukazi preko
tipkovnice težko v celoti simulirati polnjenje in praznjenje kompenzatorja preko realnih
ventilov na inflatorju, zato je v simulaciji tipična vrednost polnjenja nastavljena na 1 l/s in
praznjenja na 2 l/s [5].
Podobno kot pri dihanju tudi tukaj upoštevamo spremembo volumna v odvisnosti od količine
zraka in tlaka okolice, kakor tudi mase pri izpuščanju zraka iz kompenzatorja.
Volumen zraka se med potopom v kompenzatorju plovnosti spreminja zaradi globine
(sprememba pritiska) in zaradi polnjenja ali praznjenja kompenzatorja. V sami simulaciji smo
zvezno spremembo diskretizirali in v vsakem koraku opisali z enačbo:
16
, ()
kjer je volumen zraka v odvisnosti od globine, ob koncu izbranega časovnega intervala
(ene numerične iteracije), sprememba volumna zraka zaradi polnjenja ali praznjenja v
danem časovnem intervalu (v konkretnem primeru simulacije časovni interval enega koraka
numerične integracije), p(h) on p'(h) tlaka v odvisnosti od globine na začetku in koncu
posamezne iteracije.
3.1.3. Konstante
Razmere so odvisne še od mnogih drugih konstant, kot npr. volumen in stisljivost potapljaške
obleke, volumen in masa jeklenke, optimalna dodatna obtežitev itd. Vrednost teh parametrov
je v simulaciji moč poljudno nastavljati, vendar so iz praktičnih razlogov običajno fiksirani na
standardizirane veličine [16, 17].
17
4. PROGRAMSKA IMPLEMENTACIJAZa implementacijo fizikalnega modela lahko uporabimo različne programske jezike in orodja
[21, 22, 23]. V fazi razvoja je pomembno, da uporabimo namensko matematično orodje, s
katerim lahko enostavno napišemo poljubne ukaze. Najpogosteje uporabljena matematično
orientirana programska orodja so Matlab, Mathematica, LabView in drugi.
4.1. Simulacija
Opis programske implementacije fizikalne simulacije plovnosti smo razdelili na 6 sklopov:
1. dokumentacija,
2. inicializacija spremenljivk,
3. inicializacija uporabniškega vmesnika,
4. glavna zanka in nadzor nad izvajanjem simulacije,
5. podprogrami za nadzor simulacije in
6. fizikalna simulacija.
4.1.1. Dokumentacija
Dokumentacija je del vsakega programa. Namenjena je spremljanju in nadzoru vstavljenih
ukazov in sprememb. Časovni razpored dokumentiranja nam lahko pomaga, da pozneje lažje
najdemo napake, ki jih v prejšnjih verzijah programa ni bilo. Pri pisanju programa je vsak del
kode jasen, ampak čez čas se to pozabi. Če se pravilno komentira program, nam to tudi
pozneje ne bo delalo preglavic. V primeru, če se odločimo, da bomo razvoj programa kasneje
nadaljevali, se v dokumentiranem programu lažje znajdemo.
4.1.2. Inicializacija spremenljivk
V vsakem programu je večje število spremenljivk. Pred začetkom pisanja programa se je
smotrno odločiti za pravilno poimenovanje le-teh. Smiselna določitev imen in zgradbe
spremenljivk nam lahko zelo olajša poznejše delo. Odločili smo se, da spremenljivke
razdelimo glede na uporabo:
Spremenljivke za uporabniški vmesnik, ki se uporabljajo za inicializacijo
uporabniškega vmesnika.
18
Parametre, ki se ves čas delovanja programa spreminjajo in računajo s pomočjo
podprogramov.
Konstante, kot že pove ime, se med delovanjem programa ne spreminjajo.
Časovne spremenljivke, ki so namenjene za spremljanje realnega časa v programu.
Kontrolne spremenljivke za nadzor modela.
Dodali smo še spremenljivke, ki se uporabljajo za shranjevanje vrednosti spremenljivk
modela.
4.1.3. Inicializacija uporabniškega vmesnika
Za uporabnika je najpomembnejši primeren uporabniški vmesnik. Uporabniški vmesnik naj
bo enostavno zasnovan, obenem pa naj omogoča tudi primerno število ukazov in izbir, s
katerim lahko vplivamo na delovanje programa. Za sestavo uporabniškega vmesnika izhajamo
iz fizikalnega modela. Pri fizikalnem modelu so pomembne naslednje spremenljivke in ukazi:
izris,
parametri,
konstante,
dihanje,
kompenzator plovnosti in
nadzor nad programom.
Za izris potapljača je primerno izbrati največji razpoložljivi del uporabniškega vmesnika. S
tem smo olajšali delo uporabnika, da lahko lepo spremlja navidezni potop. Za različne potope
so tudi različni pogledi na prikaz potapljača, npr.:
celoten potop je viden na ekranu in
animacija, časovna os se premika po x osi.
Za izbiro opcij pri izrisu smo se odločili pri parametrih, ker se ta del ves čas v programu
posodablja. Za nas je pomemben navaden izris, relativen izris in izpis vrednosti parametra v
ukaznem oknu. Včasih je izrisovanje nepregledno in lažje spremljamo številčne vrednosti,
katere si lahko ogledamo, ko program ustavimo, ali izberemo premor.
Konstante so tisti del prikaza, ki se ne spreminjajo, uporabnik pa na začetku lahko spremeni
vrednosti.
19
Dihanje se lahko prikaže z drsnikom. Ritem dihanja se med potopom spreminja in se lahko to
tudi poljubno nastavlja.
Kompenzator plovnosti je pomemben za dvig in spust na želeno globino. S tem lahko
uravnavamo hitrost potapljača.
Program še omogoča zagon, premor, ponovno nastavitev vrednosti in izhod iz programa.
4.1.4. Glavna zanka in nadzor nad izvajanjem simulacije
Glavna zanka v programu je namenjena temu, da se lahko nastavijo začetne spremenljivke in
se te ponudijo v uporabniškem vmesniku. To lahko uporabnik pred zagonom programa
prilagodi svojim potrebam. Glavna zanka ves čas preverja, kateri ukazi so izvršeni v
uporabniškem vmesniku in glede na to pokliče podprogram, ki nato izvrši ukaz.
4.1.5. Podprogrami za nadzor simulacije
Za lažje programiranje je program sestavljen iz več podprogramov:
Ponastavitev spremenljivk in uporabniškega vmesnika.
Zagon simulacije.
Posodobitev vrednosti v uporabniškem vmesniku.
Shranjevanje spremenljivk.
Posodobitev vrednosti za dihanje.
Praznjenje in polnjenje kompenzatorja plovnosti.
Izris spremenljivk.
Izračun v fizikalnem modelu.
4.1.6. Fizikalna simulacija
V fizikalni simulaciji se za vsak časovni interval izvrši ena iteracija, v kateri se sproti
izračunavajo vse spremenljivke, ki opisujejo dinamično stanje potapljača pod vodo.
4.2. Matlab
Za programsko izvedbo smo izbrali orodje Matlab podjetja MathWorks. Omogoča enostavno
pisanje programa, izvajanje različnih matematičnih operacij, risanje grafov ter grafični prikaz
rezultatov in tudi animacij. Program napišemo v datoteko s končnico m, ali pa ga kar pišemo
v ukaznem oknu. Pisanje programa v m-datoteko nam omogoča, da ga lahko pozneje
20
poljubnokrat spreminjamo in izvajamo. V ukaznem oknu pa lahko hitro izvedemo poljuben
ukaz [24].
4.2.1. Zahteve programa Matlab
Za zagon programa Matlab je potreben operacijski sistem Windows ali Linux. Zaradi
zahtevnega risanja, računanja in programa Matlab je potreben hitrejši računalnik, ranga
Pentium IV in večja količina spomina, vsaj 512 MB [24].
4.2.2. Uporabniški vmesnik Matlaba
Uporabniški vmesnik (slika 3), imenovan Matlab Desktop, omogoča uporabniku enostavno
uporabo in pregled nad programi in spremenljivkami. Ukazno okno (Command Window)
omogoča izvajanje ukazov in priklic drugih oken. Ukazi, ki jih izvedemo, se hranijo v
Command History. Od tod jih lahko ponovno prikličemo, ali shranimo v datoteko. Katere
spremenljivke pa uporabljamo in njihove vrednosti, pa lahko pogledamo v oknu Workspace.
Brskanje po datotekah in področjih nam omogoča okno Current Directory. Lahko pa brskamo
tudi v ukaznem oknu z DOS/Linux ukazi, kot jih poznamo iz komande lupine [25].
Slika 3: Uporabniški vmesnik programa Matlaba [24]
4.3. Uporabniški vmesnik simulacije
Uporabniški vmesnik za nadzor simulacije je sestavljen iz dela, kjer se prikazuje gibanje in iz
dela za nadzor nad potapljačem. Pred zagonom simulacije nastavimo konstante, kot so teža
21
potapljača, želena globina potapljanja, velikost jeklenke, uteži in debelina obleke. Lahko
dodamo še kaj se bo risalo, oziroma, kje se bo izpisovalo v ukaznem oknu. Bolj natančne
nastavitve pa lahko določimo v samem programu. V programu lahko izberemo poljubno
fizikalno količino, katero program računa in jo nato prikažemo za vsak čas simulacije. Po
vseh nastavitvah lahko zaženemo simulacijo s pritiskom na gum Run.
Vloga uporabniškega vmesnika je zagotoviti lažje in preglednejše spremljanje dogajanja pri
fizikalni simulaciji potapljanja in se prikaže po inicializaciji spremenljivk za uporabniški
vmesnik (slika 4), ki je razdeljen na štiri dele: izris, parametri, konstante in nadzor.
Slika 4: Zaslon kot ga po inicializaciji prikaže uporabniški vmesnik
4.3.1. Prikaz gibanja
Prikaz gibanja in lege potapljača je predstavljen z vektorskim poljem, kjer se v vodoravni
smeri spreminja čas, lega in smer vektorja. V navpični smeri pa ponazarjata globino, na kateri
se potapljač nahaja in njegovo morebitno hitrost gibanja v navpični smeri (slika 5).
22
Slika 5: Prikaz gibanja in lege potapljača.
S kljukico pri črki A izberemo možnost animacije. To pomeni, da se čas spreminja po osi-x.
Z izbiro črke Y, izberemo, da se celotno dogajanje prikazuje na ekranu.
4.3.2. Parametri
Za lažje spremljanje potapljača, pa se lahko rišejo različni parametri, kot je hitrost, ki je
predstavljena s smerjo in velikostjo. Nekaj od teh parametrov lahko vidimo na sliki 6.
Slika 6: Parametri simulacije
Pri nastavitvah parametrov lahko nastavljamo različne načine risanja in izpisovanja.
Nastavljamo lahko, s katerimi parameteri se bo risalo, relativno risalo ali izpisovalo v
ukaznem oknu. Želene parametre pa lahko na enostaven način dodajamo in odvzamemo v
programu.
23
4.3.3. Konstante
Pomembnejše konstante nam program predlaga sam in jih lahko obdržimo, ali pa spremenimo
na želeno vrednost (slika 7). Po spremembi vrednosti simulacijo zaženemo z novimi
vrednostmi.
Slika 7: Konstante, ki opisujejo stanje in značilnosti simuliranega potapljača.
4.3.4. Nadzor
Zadnji del je namenjen za nadzor dihanja, krmiljenje kompenzatorja plovnosti in programa
(slika 8). Omogoča nastavljanje hitrosti in zaustavljanja dihanja. To je tudi na nazoren način
prikazano. Kompenzator plovnosti lahko praznimo, ali polnimo z jeklenko. Program lahko
tudi ustavimo in ponovno zaženemo simulacijo.
Slika 8: Upravljanje simulacije
4.4. Zgradba simulacijskega vmesnika
Po zagonu programa v programskem okolju Matlab se prikaže uporabniški vmesnik fizikalne
simulacije plovnosti. V tem trenutku je začela delovati glavna zanka. Namen glavne zanke je,
da lahko prek uporabniškega vmesnika nadziramo simulacijo (programska koda 1).
Initialise GUI
24
while (dokler se program ne konča){ if (če je dihanje vključeno) izračunaj volumen v pljučih in jeklenki
if (simulacija teče) preveri stanje gumbov kompenzatorja plovnosti posodobi vrednosti volumna v kompenzatorju plovnosti in jeklenki
if (izračuna čas simulacije) izračun fizikalnih enačb nariši in izpiši vrednosti spremenljivk shrani spremenljivke sleep (počakaj, da se doseže realni čas)}
Programska koda 1: Pseudo koda glavne zanke
Glavna zanka se izvaja ves čas programa in se konča, ko končamo s programom[1].
Pomemben del v programu je realni čas (programska koda 2).
% Ažuriranje ure (in morebiten premor)% Preverimo porabljen računski čas za zadnji cikel glavne zanke.t.Loop = toc;
% Če smo porabili manj časa, kot bi naj trajal en odsek realnega časaif t.Loop < t.dt % v simulaciji, potem počakamo na naslednji časovni trenutek. pause(t.pause+t.dt - t.Loop); end
% Pomik na naslednji časovni trenutek v simulacijit.t = t.t + t.dt; tic;
Programska koda 2: Ažuriranje ure
Nadaljnje delovanje programa se krmili prek podprogramov, ki skrbijo za risanje
spremenljivk, izračun spremenljivk (glavni fizikalni del), shranjevanje spremenljivk, ponovno
nastavljanje spremenljivk in posodabljanje spremenljivk v uporabniškem vmesniku
(programska koda 3).
if t.dti == 0 % Števec vmesnih iteracij je odštel. MainVBC('Recalculate'); % Izračunamo nove vrednosti modela. MainVBC('UpdateUIValues');% Ažuriramo podatke za GUI. MainVBC('StoreModel'); % Shranimo vse trenutne vrednosti modela. MainVBC('Plot'); % Narišemo zahtevane vrednosti parametrov % modela (iz predhodnih vrednosti in podatkov)
% Ponovno postavimo števec vmesnih iteracij glavne simulacijske zanke t.dti = t.dtI;
25
p.d.ti = p.d.ti + t.dtM;end
set(ui.h.RunButton, 'String', ['Run (t = ' num2str(t.tM,'%5.1f') ' s)']);,t.tM = t.tM + t.dt; % Povečamo cas.
%Odštejemo števec vmesnih iteracij (do naslednjega izračuna).t.dti = t.dti - 1;
Programska koda 3: Klicanje podprogramov
V glavnem fizikalnem delu se izračunavajo trenutna stanja spremenljivk pri potapljaču.
Izračunavajo se mase, volumni, tlaki, sile za jeklenke, potapljača in kompenzatorja plovnosti.
Ti izračuni omogočajo dokaj enostavno nadziranje potapljača s pomočjo fizikalnih zakonov.
4.5. Podatkovni model
V programu je uporabljeno veliko število parametrov in konstant. Da olajšamo branje in
poenostavimo pisanje, smo uvedli strukturiranje parametrov in konstant (tabela 3).
Tabela 3: Razvrstitev spremenljivk
Tip Opist Časovne (time) spremenljivke (simulacija, dihanje, realni čas)m Spremenljivke za kontrolo modela (zastava, indikator)s Spremenljivke za shranjevanje (storage) vseh spremenljivk v modelu
p.d, c.d Parametri in konstante, ki se nanašajo na potapljača (diver)p.r, c.r Parametri in konstante, ki se nanašajo na dihanje (respiration)p.b, c.b Parametri in konstante, ki se nanašajo na kompenzator plovnosti (BCD)p.t, c.t Parametri in konstante, ki se nanašajo na jeklenko (tank)
26
5. PRIMERI DELOVANJA SIMULACIJE IN REZULTATI
5.1. Testiranje modela
Simulacijo smo že med samim razvojem, kakor tudi kasneje testirali na trivialnih primerih,
katerih izid lahko vnaprej predvidimo.
Tako smo spreminjali količino dodatne obtežitve z utežmi, ali debelino potapljaške obleke in
to primerjali s potrebnim volumnom zraka v kompenzatorju plovnosti, spreminjali smo
velikost ali tlak v jeklenki in spremljali vpliv tega na dolžino potopa in podobno.
Eden izmed dinamičnih testov je tudi na začetku nevtralno ploven potapljač, kateremu se
zaradi dihanja zmanjšuje količina zraka v jeklenki in povečuje plovnost.
Prav tako smo med testi izklopili določene operacije kot npr. dihanje in spremljali zmeraj
hitrejše padanje na začetku nekoliko negativno plovnega potapljača, ali pospešeno dvigovanje
v obratnem primeru.
Prav tako smo nerealno povečali amplitudo dihanja in s tem povečali kratko časovni odziv
potapljačeve plovnosti, kar je vodilo do nekontroliranega spuščanja potapljača (plovnost se
potapljaču na začetku zmanjša, zato tone in se mu zmanjša volumen obleke in kompenzatorja
plovnosti, kar mu plovnost dodatno zmanjša in ob naslednjem vdihu se padanje več ne
ustavi), kar je ena nevarnejših situacij med realnim potapljanjem.
5.2. Simulacija plovnosti
V nadaljevanju si bomo ogledali nekaj primerov uporabe modela simulacije in tipične
rezultate, ki jih pri tem dobimo.
Na sliki 9 lahko vidimo primer simulacije izbranega potopa. Rdeči graf prikazuje dihanje
potapljača, temno moder graf prikazuje mesto potapljača, svetlo moder graf pa prikazuje smer
in velikost hitrosti potapljanja. Na sliki je lepo vidno, kako se spreminja velikost hitrosti
potapljanja.
27
Slika 9: Prikaz lege, hitrosti in dihanja potapljača.
Na sliki 10 je prikazan začetni primer, ko potapljač lebdi na gladini vode. V tem primeru ima
pozitivno plovnost, zato dihanje ne vpliva na njegovo lego, kar je razvidno iz spodnjega grafa.
V drugem delu grafa je prikazan primer, ko je potapljač izpustil zrak iz kompenzatorja in se je
začel potapljati. Potop upočasni, ko v kompenzator spusti zrak iz jeklenke, kar je razvidno na
zadnjem delu grafa skrajno desno.
Slika 10: Lebdenje v vodi in potop
28
Globina potopa je omejena z globino vode, kar v programu nastavimo na začetku z ustrezno
konstanto. Na sliki 11 je prikazan primer, ko potapljač doseže dno. Tukaj miruje, vse dokler
zaradi polnjenja kompenzatorja ne doseže pozitivne plovnosti, ko se prične dvigovati nazaj
proti površini.
Slika 11: Ustavljanje potapljača na dnu
Slika 12 kaže primer, ko se kompenzator polni le do trenutka dvigovanja potapljača, kljub
temu pa se ne dviga z enakomerno hitrostjo, temveč pospešeno, saj se z zmanjševanjem
globine povečuje celoten volumen potapljača in s tem plovnost.
Slika 12: Pospešeno dvigovanje potapljača
29
Zanimivo je ta rezultat primerjati z enakimi pogoji, vendar na globini 40 m. V tem primeru je
dvigovanje veliko bolj enakomerno, saj je tam pri enaki višinski razliki relativna sprememba
tlaka veliko manjša in zaradi tega tudi manjši vpliv pozitivne povratne zanke na povečevanje
plovnosti.
Na sliki 13 je primer, ko simuliramo potop do določene globine. Iz grafa je lepo razvidno,
kako težko je doseči nevtralno plovnost, tj. potapljača umiriti na dani globini. Pri realnem
potopu je to sicer nekoliko lažje zaradi plavanja, vendar nam prav ta primer lepo kaže, kako
pomembno didaktično orodje je model simulacije plovnosti, še posebej na začetnih
potapljaških tečajih [1].
.
Slika 13: Ustavljanje potapljača na globini
5.3. Povezava programa s strojno opremo
Simulacijo potapljača na tej stopnji v glavnem krmilimo preko ukazov z miško, razvito pa je
tudi nekaj strojne opreme opremljene z ustreznimi senzorji, ki lahko tipajo stanje in odziv
človeškega telesa.
Kot primer navedimo strojni dodatek za upravljanje (slika 14), preko katerega lahko polnimo,
ali praznimo kompenzator plovnosti, pri čemer senzor zaznava lego inflatorja. Pri realnem
potapljanju lahko kompenzator praznimo le, če je cev inflatorja navpično dvignjena nad sam
kompenzator, v nasprotnem primeru namreč pride do sifona in zrak ne more uhajati iz
kompenzatorja [1].
30
Slika 14: Strojni dodatek za upravljanje računalniške simulacije [1]
5.4. Uporaba simulacije pri potapljaških tečajih
Naštete možnosti fizikalne simulacije plovnosti zagotavljajo široko uporabno vrednost
modela tudi na potapljaških tečajih. Ob njegovem osnovnem namenu, dinamičnem
spremljanju razmer in lege potapljača, namenjeni individualni simulaciji posameznikom ima
model tudi veliko demonstracijskih možnosti.
Tako lahko inštruktorji tečajnikom na tečajih potapljanja nazorno prikažejo odziv potapljača
pod vodo na hitro polnjenje ali praznjenje kompenzatorja, nekontrolirane dvige ali spuste
zaradi pozitivnih povratnih zank pri plovnosti (globlje, kot je potapljač, bolj ga stisne in bolj
se mu plovnost zmanjša, zaradi česar še hitreje tone in obratno, višje kot je, bolj se mu
volumen poveča, še posebej v kompenzatorju, zaradi česar se še hitreje dviguje).
Prav tako lahko inštruktor tečajnikom demonstrira, kako pomembna je pravilna izbira
potapljaške opreme, npr. koliko težje je zagotavljati nevtralno plovnost, v kolikor na začetku
izbere preveč dodatne obtežitve in posledično to kompenzira z večjim volumnom zraka v
kompenzatorju [1, 26].
31
6. ZAKLJUČEKPo pregledu literature in znanih računalniških programov nismo nikjer zasledili simulatorja
plovnosti potapljačev, zato smo razvili učinkovito orodje in didaktični pripomoček, ki
zapolnjuje to vrzel. Vzporedno z razvijanjem programa in fizikalnega modela je potekalo tudi
razvijanje strojnih dodatkov, kot je upravljanje kompenzatorja plovnosti in spremljanje
dihanja potapljača. Razvili smo primeren uporabniški vmesnik, ki omogoča enostaven prikaz
velikega števila parametrov. Pomembno je tudi, da lahko poljubno spreminjamo, katere
parametre želimo prikazovati. Program omogoča tudi testiranje in prikaz odziva potapljača v
razmerah, ki jih v realnem potopu ni mogoče izvesti, ali njihova realizacije ne bi bila varna za
potapljače.
Simulacija v največji možni meri simulira fizikalni razvoj vseh merodajnih količin med
potapljanjem, v veliki meri pa smo uspeli upoštevati tudi fiziološke odzive telesa.
Računalniški program napisan v Matlabu lahko enostavno prenesemo v druge programske
jezike. Sam program Matlab v novejših verzijah omogoča prenos programa na internet s
pomočjo MATLAB Web Server. Za ta prenos potrebujemo operacijski sistem Windows
Server ali primerno verzijo Linuxa. Lahko pa se prenese tudi v programski jezik Java, kjer je
moč enostavno pripraviti prikaz na internetu in se s tem razširi uporabnost programa. Program
se lahko prilagodi do tolikšne mere, da se predstavi kot didaktična igrica. V tem primeru
postane zanimiva tudi za osnovno in srednjo šolo. Učenci in dijaki ob igri spoznavajo
fizikalne količine in zakone.
Z manjšimi spremembami je mogoče program prenesti v VRML okolje, kar je bil tudi prvotni
namen. V VRML okolju postane potapljanje bolj realno, ker omogoča pogled v 3 D svet. Z
uporabo 3D čelade, pa postane še to bolj zanimivo, ker spremlja vsak naš gib. Z dodajanjem
drugih zunanjih komponent, kot je spremljanje dihanja potapljača in upravljanje
kompenzatorja plovnosti, se lahko dodatno razširi uporabnost programa. Program je
zastavljen tako, da ga je enostavno nadgraditi z novimi aplikacijami (npr. simulacija
dekompesijske bolezni, zunanje dihanje, plavanje potapljača itd.) ali izboljšati obstoječe (npr.
vizualizacija potapljača kot objekta). Prav tako omogoča dopolnitve s področja potapljanja,
npr. z opozarjanjem na nevarnost barotravme pljuč pri prehitrem dvigovanju z zadrževanjem
diha, ali manjša ventilacija kisika pri zadihanosti.
32
7. LITERATURA1. D. Korošec, 1M. Slavinec, D. Bernad, K. Prnaver: Architecture of the virtual training
system for buoyancy control, (Faculty of Electrical Engineering and Computer Science, 1Faculty of Education, Department of Physics, University of Maribor, JOINT 7. International Immersive Projection Technologies Workshop and the 9. Eurographics Workshop on Virtual Environments (IPT/EGVE 2003), May 22./23. 2003 in Zurich, Switzerland).
2. L. Škerget: Mehanika tekočin, (V Mariboru: Tehniška fakulteta, v Ljubljani: Fakulteta za strojništvo, 1994).
3. J. Strnad: Fizika 1: Mehanika, toplota, (Društvo matematikov, fizikov in astronomov Slovenije, Ljubljana , 1995).
4. R. Kladnik: Visokošolska fizika 1. del: Mehanski in toplotni pojavi, (DZS, Ljubljana, 1985).
5. I. Urh: Potapljač: potapljaški priročnik, (Slovenska potapljaška zveza, Ljubljana, 2002).
6. M. Ambrožič, E. Karič, S. Kralj, G. Planinšič, M. Slavinec, A. Zidanšek: Fizika, narava, življenje 1, (DZS, Ljubljana, 2000).
7. K. Johnson, Fizika: preproste razlage fizikalnih pojavov, (Tehniška založba Slovenije, Ljubljana, 1996).
8. B. Vuga: Otroško potapljanje, Potapljač 1, št. 3, 25, 2002.9. B. Vuga: Otroško potapljanje: pravila Slovenske potapljaške zveze za otroško
potapljanje, (Slovenska potapljaška zveza, Ljubljana, 2003).10. B. Vuga: Otroško potapljanje: gradivo za inštruktorski seminar, (Slovenska
potapljaška zveza, Ljubljana, 2003).11. T. Lampič: Potapljanje: Razgibajmo življenje, (Športna zveza Slovenije, Ljubljana,
1992).12. V. Verdnik: Potop v modro, ( V. Verdnik … et al., Ljubljana, 1995).13. Z. Bohte: Numerične metode, (Društvo matematikov, fizikov in astronomov
Slovenije, Ljubljana, 1991).14. I. Vidav: Višja matematika 2, (DZS, Ljubljana, 1979).15. I. Kuščer: Matematika v fiziki in tehniki, (Društvo matematikov, fizikov in
astronomov, Ljubljana, 1994).16. M. Slavinec: Potapljanje, Presek, št. 2, 66, 1992/93.17. M. Slavinec: Potapljanje, Presek 11. Ljubljana, 20-30 str., 1995.18. Tečaj potapljanja za CMAS P-1, (Slovenska potapljaška zveza, Ljubljana, 1986).19. http://www.spz.si , (Slovenska potapljaška zveza).20. R. Resnick, D. Halliday, K. S. Krane: Physics: Volumen 1, (J. Wiley & sons, New
York, 1992).21. V. Udir: Izvajanje, preverjanje in ocenjevanje eksperimentov pri pouku fizike v
osnovni šoli: priročnik za učitelje fizike, (Zavod Republike Slovenije za šolstvo, Ljubljana, 1999).
22. J. Graham, P. Mellett, J. Challoner, S. Angliss: Prvi korak v znanost z več kot 150 vznemirljivimi poskusi, (Pomurska založba, Murska Sobota, 2002).
23. N. Žonta, V. Kariž Merhar, T. Lazič Ponikvar, M. Trampuš, R. Snoj, U. Boltin, L. Babič, V. Kožuh, V. Udir, zbrala in uredila V. Kariž Merhar: Zbirka nalog in primerov načrtovanja iz fizike, (Zavod Republike Slovenije za šolstvo, Ljubljana, 2003).
24. http://www.mathworks.com/ , (Matlab).
33
25. B. Jurčič-Zlobec: Matlab z uvodom v numerične metode, (Fakulteta za elektrotehniko, Ljubljana, 2005).
26. B. Potočnik, D. Heric, T. Tomažič, D. Zazula, D. Bernad, B. Cigale, R. Cellard: SimBio - a generic environment for bio-numerical simulation: final evaluation & validation report, 5th European Framework Programme, the IST programme, (Fakulteta za elektrotehniko, računalništvo in informatiko, 2003).
34
8. PRILOGA
function MainVBC(Action)% =======================================================================%% MainVBC 3.2%% Programsko ogrodje fizikalnega modela VBC% (C) Dean, Dani, Mico 2002-05%% Globalne spremenljivke:%% ui = struktura s podatki uporabniskega vmesnika% .h = rocice (handles)% .p = opisi (ime, vrednost, enota...) para.modela, ki jih je mogoce izrisati% .c = opisi (ime, vrednost, enota...) kons.modela, ki jih je mogoce izrisati%% p = parametri (spremenljivke) modela% c = konstante modela% .d = diver (osnovni param, in fiz. konst., ki se navezujejo na potapljaca)% .r = respiration (parametri, ki se navezujejo na dihanje - pljuca)% .b = buoyancy control device (param., ki se navezujejo na kompenzatorja)% .t = tank (parametri, ki se navezujejo na jeklenko)% .s = obleka potapljaca (suit thickness)% .w = utezi potapljaca(svinci) (weight)% .e = masa ostale opreme (equipment)%% t = casovne spremenljivke modela%% m = kontrolne spremenljivke modela%% s = storage (shranjene vrednosti spremenljivk modela)% .i = indeks simulacijskega cikla za izracun modela% .t = vektor casa% .p = matrika vrednosti spremenljivk (tistih, ki se izrisujejo)%global ui p c t m s
if nargin < 1 % -------------------------------------------------------------------------- % % Inicializacija spremenljivk fizikalnega modela % % ---------------------------------------------------------------------------
% Casovne spremenljivke [s] t.t = 0; % Cas od zagona programa t.dt = 0.1; % Sprememba simulacijskega casa t.tM = 0; % Cas od pricetka preracunavanja modela t.dtM = 0.4; % Sprememba simulacijskega casa - veckratnik t.dt! t.dtI = round(t.dtM/t.dt); % St. vmesnih iteracij glavne t.dti = 0; % Stevec stevila vmesnih iteracij t.tR = 0; % Cas za simulacijo dihanja t.Loop = 0; % Realni cas (stoparica t.pause = 0; % dodatna pause, za lazje spremljanje modela p.d.ti = 0; t.epsilon = 0; % Kontrolne spremenljivke za tok programa m.Running = 0; % Zastavica za preracun modela m.Respiration = 0; % Zastavica za simulacijo dihanja m.Quit = 0; % Zastavica za konec programa m.Animacija = 1; % Zastavica za animacijo (premicen KS) m.Tank = 0; % Zastavica za prazen tank % Spremenljivka za hranjenje vrednosti izracunanih parametrov modela s.i = 0; % Stevec izracunov (skalar) s.t = []; % Cas izracunov (vektor) [s] s.p = []; % Vrednosti parametrov (matrika) % PARAMETRI % Fizikalni p.d.h = 0; % (x) Globina potapljaca [m] p.d.v = 0; % Hitrost potapljaca [m/s] p.d.vPrev = 0; % Hitrost potapljaca v prejsnjem casovnem trenutku [m/s] p.d.dv = 0; % Sprememba hitrosti [m/s] p.d.a = 0; % Pospesek potapljaca [m/s^2] p.d.Fr = 0; % Sila upora [N] p.d.V = 0; % skupen volumen (prej fisken volumen) [l] p.d.Vfiksen = 0; % fiksen volumen p.d.Vcas = 0; % volumen odvisen od casa p.d.r = 0; % Polmer krogle, s katero aproksimiramo potapljaca [m]
35
p.d.Fg = 0; % sila teze potapljaca [N] p.d.Fb = 0; % izracunamo silo vzgona (buoyant force)= [N] p.d.ph = 1; % tlak v odvistnosti od globine [bar] p.d.phPrev = p.d.ph; % prejsnji tlak v odvistnosti od globine [bar] p.d.smer = 0; % smer gibanja gor = 1, dol = -1 p.d.m = 0; % skupna masa p.d.mfiksna = 0;% fiksna masa p.d.mcas = 0; % masa odvisna od casa
% Za simulacijo dihanja p.r.f = 8; % Frekvenca dihanja (respiration rate) [vdihi/min] p.r.V = 2.5; % Volumen zraka v pljucih (lung volume) med dihanjem [l] p.r.Vs = 0; % V. zraka v pljucih (lung volume) med dihanjem [l] - slider p.r.Vsh = 0; % Volumen zraka v pljucih (lung volume) odvisen od globine [l]
% Za BCD p.b.V = 2; % V. zraka v kompezatorju plovnosti ce bi bili na povrsini [l] p.b.Vk = 2.6001; % (Vk) V. zraka v kompenzatorju [l]potapljac je v ravnovesju p.b.Vh = 2.60001; % (Vkx) V. zraka v kom.plov. v odvisnosti od globine [l] p.b.dV = 0; % Trenutni pretok iz/v BCD [l/s]
% Za jeklenko p.t.V = 0; % Volumen jeklenke (pozneje izracunamo) p.t.dV = 0; % razlika med p.t.ma = 2.6; % masa zraka v jeklenki [kg] p.t.p = 0; % p.t.p pritisk zraka v jeklenki p.t.desetbar = 10; % Izpise obvestilo, da je se 10 barov v jeklenki p.t.rezerva = 50; % Jeklenka je na rezervi in izpise obvestilo
% Za obleko p.s.V = 0; % Volumen obleke(suit) pozneje izracunamo
% KONSTANTE % Fizikalne c.d.g = 10; % Gravitacijski pospesek [m/s^2] c.d.m = 75; % Masa potapljaca z opremo [kg] c.d.p0 = 100000; % Tlak na povrsini [Pa] c.d.ro = 1000; % Gostota vode [kg/m^3] c.d.mi = 0.0013; % Viskoznost [kg/ms] c.d.hNull = 0; % Minimalna globina [m] c.d.hMin = 0; % Minimalna globina [m] c.d.hMax = -40; % Maksimalna globina [m] c.d.vMin = 0; % Hitrost na dnu oz na povrsini [m/s] c.d.aMin = 0; % Pospesek na dnu oz. povrsini [m/s^2] c.d.Fepsilon = 10;% ustavljanje potapljaca [N] c.d.vepsilon = 0.1; % ustavljanje potapljaca [m/s]
% Za simulacijo dihanja c.r.fMax = 60; % Maksimalna frekvenca dihanja [vdihi/min] c.r.VMax = 1.5; % Maksimalni volumen pljuc (+/- od ravnovesja) [l]
% Za BCD c.b.VMax = 20; % Max volumen zraka v kompenzat.(pri normalnem tlaku) [m^3] c.b.VMin = 0; % Min volumen zraka v kompenzat.(pri normalnem tlaku) [m^3] c.b.fs = 8000; % Vzorcevalna frekvenca za zvok [Hz]
% Zvoka ob polnjenju in praznjenju kompenzatorja c.b.SoundIn = 0.2 * randn(1, c.b.fs * 0.5*t.dt); c.b.SoundOut = 0.3 * filter(ones(1,4)/4, 1, randn(1, c.b.fs * 0.5*t.dt));
% Za jeklenko c.t.p = 200; % Pritisk zraka v jeklenki [bar] c.t.dVp = 1; % Pretok zraka iz jeklenke [l/s] c.t.dVm = 2; % Pretok zraka iz jeklenke [l/s] c.t.V = 12; % Volumen jeklenke [l] pri talku 1 bar c.t.m = c.t.V * 1.5; % masa jekelnke (c.t.V * 1.5) [kg] p.t.prezerva = 50; %rezerva v jeklenki je 50 barov p.t.pnull = 0; % jeklenka je prazna
% Za obleko (suit) c.s.t = 5; % debelina obleke potapljaca (suit thickness) [mm] c.s.k = 0.5; % konstanta, ki pove, da se spreminja samo pol cloveka
% Za utezi (weight) c.w.m = 0; % dodatne utezi potap.,ki je enaka predlagani masi utezi [kg]
% Za ostalo opremo c.e.m = 8; % masa ostale opreme [kg] % Izracunamo masa svinca, katero bomo predlagali % Racunamo na tem mestu, ker se naj vidi ob zagonu programa p.w.ms = c.s.t * c.d.m * 3 / 100; c.w.m = p.w.ms; % pritisk zraka v jeklenki p.t.V = c.t.V * c.t.p; p.t.p = p.t.V / c.t.V; % p.t.p pritisk zraka v jeklenki
36
%---------------------------------------------------------- % nastavimo volumen komenzatorja na enko vrednost kot je masa % jeklenke. Pristejemo se 0.0001 zaradi zaokroevanja p.b.Vh = (c.t.V * c.t.p * 1.3 / 1000) + 0.0001; p.b.Vk = (c.t.V * c.t.p * 1.3 / 1000) + 0.0001; % -------------------------------------------------------------------------- % Inicializacija uporabniskega vmesnika % Rocice (handles) vseh elementov uporabniskega vmesnika so shranjene % v spremenljivku uih (kratica od 'User Interface Handles', tip: struct) ) % Najprej kreiramo okno ... ui.h.fig = figure(... 'Units', 'Normalized',... 'Position',[0.1 0.1 0.75 0.8], ... 'Name', 'Potapljac 3.1 (C) 2002-05 D&D&M');
% ... in v njem grafikon za izris poteka parametrov ui.h.graf = axes('Position', [0.05 0.05 0.7 0.90]); hold on; title([' \it\bf pot: \rm Fu+Fvzg=Fg \bf|\it\bf dvig: \rm Fvzg=Fg+Fu']); % --------------------------------------------------------------------------- % PARAMETER % V prvem delu inicializacije uporabniskega vmesnika kreiramo kontrolnike za % tiste parametre modela, ki jih je mogoce narisati x1 = 0.995; y1 = 0.972; % Izhodiscne koordinate za prvi dy = 0.0285; % Vertikalni razmak med vrsticami dx = 0.005; % Vodoravni razmik med komponentami h = 0.027; % Visina kontrolnikov hp = 0.1; % Visina popup menija
nW = 0.08; % Sirina nazivov parametrov ('text', nameWidth) pW = 0.015; % Sirina 'plot' polja ('checkbox', plotWidth) vW = 0.05; % Sirina 'value' polja ('edit', valueWidth) uW = 0.04; % Sirina enot ('text', unitWidth) x1Max = nW + 3*pW +vW + uW + 5*dx; % Skupna sirina bloka kontrolnikov
% Vsi opisi parametrov modela so shranjeni v spremenljivki 'ui.p' ui.p = struct('NoParam', 11,... 'Name', {{'h' 'v' 'p.t.p' 'p.d.ph' 'Fv=p.d.Fb' 'Fu=p.d.Fr' 'p.d.Fg'
'smer' 'pred.utezi' 'p.r.Vs' 'p.b.Vh' }},... 'Var', {{'p.d.h' 'p.d.v' 'p.t.p' 'p.d.ph' 'p.d.Fb' 'p.d.Fr' 'p.d.Fg'
'p.d.smer' 'p.w.ms' 'p.r.Vs' 'p.b.Vh'}},... 'Value', [p.d.h p.d.v p.t.p p.d.ph p.d.Fb p.d.Fr p.d.Fg p.d.smer
p.w.ms p.r.Vs p.b.Vh],... 'Unit', {{'m' 'm/s' 'bar' 'bar' 'N' 'N' 'N' '' 'kg' 'l' 'l'}},... 'Plot', [1 1 0 0 0 0 0 0 0 1 0 0 0 0],... 'PlotRel', [0 1 0 0 0 0 0 0 0 0 0 0 0 0],... 'Print', [0 0 0 0 0 0 0 0 0 0 0 0 0 0],... 'PlotPat', {{'b.-' 'cd-' 'ys:' 'ms:' 'g.-' 'g.-' 'b.-' 'cd-' 'ys:'
'r.-' 'cd.-' 'b.-'}});
s.pName = ui.p.Name; % Imena parametrov zabelezimo tudi v strukturo za %shranjevanje vrednosti parametrov modela
uicontrol(... % Naslov 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [x1 - x1Max, y1, x1Max, h],... 'HorizontalAlignment', 'center',... 'FontWeight', 'bold',... 'String', 'PARAMETERS');
for i = 1 : ui.p.NoParam % Za vsak parameter kreiramo 4 kontrolnike y = y1 - i * dy; % Izpis imena spremenljivke % (ozadje enake barve kot krivulja na grafikonu) ui.h.p.Name(i) = uicontrol(... 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [x1 - x1Max, y, nW, h],... 'HorizontalAlignment', 'right',... 'BackgroundColor', ui.p.PlotPat{i}(1),... 'FontWeight', 'bold',... 'String', ui.p.Name(i)); % Kljukica, ki oznacuje, da se vrednost parametra izrisuje na grafu ui.h.p.Plot(i) = uicontrol(... 'Style', 'Checkbox',... 'Units', 'Normalized',... 'Position', [x1 - x1Max + nW + dx, y, pW, h],... 'Value', ui.p.Plot(i),... 'Callback', 'MainVBC(''UpdateModelValues'')'); % Kljukica, ki oznacuje, da se vrednost parametra izrisuje na grafu % relativno kot vertikalni vektor glede na prvi parameter (h = globina) ui.h.p.PlotRel(i) = uicontrol(... 'Style', 'Checkbox',... 'Units', 'Normalized',... 'Position', [x1 - x1Max + nW + (dx + pW) + dx, y, pW, h],...
37
'Value', ui.p.PlotRel(i),... 'Callback', 'MainVBC(''UpdateModelValues'')'); % Kljukica, ki oznacuje, da se vrednost parametra izrisuje na grafu ui.h.p.Print(i) = uicontrol(... 'Style', 'Checkbox',... 'Units', 'Normalized',... 'Position', [x1 - x1Max + nW + 2*(dx + pW) + dx, y, pW, h],... 'Value', ui.p.Print(i),... 'Callback', 'MainVBC(''UpdateModelValues'')'); % Izpis stevilcne vrednosti parametra ui.h.p.Value(i) = uicontrol(... 'Style', 'Edit',... 'Units', 'Normalized',... 'Position', [x1 - x1Max + nW + 3*(dx + pW) + dx, y, vW, h],... 'String', num2str(ui.p.Value(i)),... 'Callback', 'MainVBC(''UpdateModelValues'')'); % Izpis merske enote parametra ui.h.p.Unit(i) = uicontrol(... 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [x1 - x1Max + nW + 3*(dx + pW) + dx + vW + dx, y, uW,
h],... 'HorizontalAlignment', 'left',... 'String', ui.p.Unit(i)); end %end za: for % Onemogocimo izbiro relativnega izrisa prvega parametra (samega na sebe!) set(ui.h.p.PlotRel(1), 'Enable', 'off') % --------------------------------------------------------------------------- % KONSTANTE % V drugem delu inicializacije kreiramo kontrolnike za konstante modela
y2 = y1 - (ui.p.NoParam+1.0)*dy; % Izhodiscne x2Max = nW + dx + vW + dx + uW; % Skupna sirina bloka kontrolnikov % Vsi opisi konstant modela so shranjeni v spremenljivki 'ui.c' ui.c = struct('NoConst', 9,... 'Name', {{'m' 'hMax' 'c.t.dV' 'jeklenka' 'tlak' 'd obleke' 'utezi'
'F epsilon' 'c.d.vepsilon'}},... 'Var', {{'c.d.m' 'c.d.hMax' 'c.t.dV' 'c.t.V' 'c.t.p' 'c.s.t' 'c.w.m'
'c.d.Fepsilon' 'c.d.vepsilon'}},... 'Value', [c.d.m c.d.hMax c.t.dV c.t.V c.t.p c.s.t c.w.m c.d.Fepsilon
c.d.vepsilon],... 'Unit', {{'kg' 'm' 'l' 'l' 'bar' 'mm' 'kg' 'N' 'm/s'}});
uicontrol(... % Naslov 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [x1 - x2Max, y2, x2Max, h],... 'HorizontalAlignment', 'center',... 'FontWeight', 'bold',... 'String', 'CONSTANTS');
for i = 1 : ui.c.NoConst % Za vsako konstanto kreiramo 3 kontrolnike y = y2 - i * dy; % Izpis imena konstante ui.h.c.Name(i) = uicontrol(... 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [x1 - x2Max, y, nW, h],... 'HorizontalAlignment', 'right',... 'FontWeight', 'bold',... 'String', ui.c.Name(i)); % Izpis stevilcne vrednosti konstante modela ui.h.c.Value(i) = uicontrol(... 'Style', 'Edit',... 'Units', 'Normalized',... 'Position', [x1 - x2Max + nW + dx, y, vW, h],... 'String', num2str(ui.c.Value(i)),... 'Callback', 'MainVBC(''UpdateModelValues'')'); % Izpis merske enote parametra ui.h.c.Unit(i) = uicontrol(... 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [x1 - uW, y, uW, h],... 'HorizontalAlignment', 'left',... 'String', ui.c.Unit(i)); end % end za: for % --------------------------------------------------------------------------- % V tretjem delu inicializacije kreiramo kontrolnike za simulator dihanja y3 = y2 - (ui.c.NoConst + 1.3) * dy ; % Izhodiscne xs3 = (x2Max - dx) / 2; % Sirina drsnikov ys3 = 0.2; % Visina drsnikov hb = 1.3 * h; % Visina gumba x3Max = xs3 + dx + xs3; % Skupna sirina bloka kontrolnikov % Gumb za vklop in izklop simulacije dihanja ui.h.Respiration = uicontrol(...
38
'Style', 'ToggleButton',... 'Units', 'Normalized',... 'Position', [x1 - x3Max, y3, x3Max, hb],... 'String', 'Respiration',... 'Value', m.Respiration,... 'Callback', 'global m; m.Respiration = ~m.Respiration;'); % Drsnik za nastavitev in izpis frekvence dihanje
ui.h.r.fText = uicontrol(... 'Style', 'Edit',... 'String', num2str(p.r.f, '%4.1f/min'),... 'Units', 'Normalized',... 'Position', [x1 - x3Max, y3 - dy, xs3, h]);
ui.h.r.fSlider = uicontrol(... 'Style', 'Slider',... 'Units', 'Normalized',... 'Position', [x1 - x3Max, y3 - dy - ys3, xs3, ys3],... 'Min', 0,... 'Max', c.r.fMax,... 'Value', p.r.f,... 'SliderStep', [.05 0.20],... 'CallBack', 'MainVBC(''UpdateRR'')'); % Drsnik za prikaz in izpis trenutnega volumna zraka v pljucih
ui.h.r.VText = uicontrol(... 'Style', 'Edit',... 'String', num2str(p.r.Vs, '%3.2f l'),... 'Units', 'Normalized',... 'Position', [x1 - xs3, y3 - dy, xs3, h]); ui.h.r.VSlider = uicontrol(... 'Style', 'Slider',... 'Units', 'Normalized',... 'Position', [x1 - xs3, y3 - dy - ys3, xs3, ys3],... 'Min', -c.r.VMax,... 'Max', c.r.VMax,... 'Value', p.r.Vs,... 'SliderStep', [.05 0.20]);
% --------------------------------------------------------------------------- % V cetrtem delu inicializacije kreiramo gumba za % polnjenje in praznjenje BCD-ja
y4 = y3 - hb - dy - ys3 - dy + h - dy + h; % Izhodiscne % Gumb za polnjenje BCD-ja ui.h.b.ButtonIn = uicontrol(... 'Style', 'ToggleButton',... 'Units', 'Normalized',... 'Position', [x1 - x3Max, y4, xs3, hb],... 'String', 'BCD +',... 'Value', 0,... 'Callback', 'MainVBC(''FillBCD'')');
% Gumb za praznjenje BCD-ja ui.h.b.ButtonOut = uicontrol(... 'Style', 'ToggleButton',... 'Units', 'Normalized',... 'Position', [x1 - x3Max + xs3 + dx, y4, xs3, hb],... 'String', 'BCD -',... 'Value', 0,... 'Callback', 'MainVBC(''EmptyBCD'')'); % --------------------------------------------------------------------------- % V petem, zadnjem delu inicializacije kreiramo se gumbe za nadzor simulacije
y5 = y4 - hb - dy + h; % Izhodiscne koordinate
% Gumba za resetiranje casa uicontrol(... 'Units', 'Normalized',... 'Position', [x1 - x3Max, y5, xs3, hb],... 'String', 'Reset',... 'Callback', 'MainVBC(''Reset'')');
% Gumb za vklop/izklop toka simulacije ui.h.RunButton = uicontrol(... 'Style', 'ToggleButton',... 'Units', 'Normalized',... 'Position', [x1 - x3Max + xs3 + dx, y5, xs3, hb],... 'String', 'Run',... 'Value', m.Running,... 'Callback', 'MainVBC(''Run'')');
% Gumb za izhod iz programa uicontrol(... 'String', 'Exit',... 'Units', 'Normalized',... 'Position', [x1 - x3Max, y5 - hb - dy/1.5, x3Max, 2*h],... 'CallBack', 'global m; m.Running = 0; m.Quit = 1; close;');
39
% Kljukica za izbiro izhodisca casovne (x) osi na grafikonu % True = x os drsi v fiksnem oknu, False = cas se zacne pri 0 % Izpis merske enote parametra ui.h.Animation.text = uicontrol(... 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [0.01, 0.1, pW, h],... 'HorizontalAlignment', 'left',... 'String', 'A'); % gumb ui.h.Animation = uicontrol(... 'Style', 'Checkbox',... 'Units', 'Normalized',... 'Position', [0.03, 0.1, pW, h],... 'Value', 0);
% Kljukica za izbiro izhodisca casovne (Y) osi na grafikonu % True = x os drsi v fiksnem oknu, False = cas se zacne pri 0 % Izpis merske enote parametra ui.h.YFiksen.text = uicontrol(... 'Style', 'Text',... 'Units', 'Normalized',... 'Position', [0.01, 0.07, pW, h],... 'HorizontalAlignment', 'left',... 'String', 'Y'); % gumb ui.h.YFiksen = uicontrol(... 'Style', 'Checkbox',... 'Units', 'Normalized',... 'Position', [0.03, 0.07, pW, h],... 'Value', 0); % Konec inicializacije graficnega uporabniskega vmesnika % -------------------------------------------------------------------------- % Glavna zanka % V neskoncni glavni zanki izracunavamo novo stanje modela % in izrisujemo gibanje parametrov tic; % Zazenemo stoparico za merjenje porabljenega casa v eni
while ~m.Quit; % % Simulacija dihanja tece neodvisno od izracunavanja modela % if m.Respiration% m.Running % Izracunamo nov volumen zraka v pljucih p.r.Vs = c.r.VMax * sin(2 * pi * p.r.f/60 * t.tR); % zaokrozimo na 4 decimalke p.r.Vs = roundn(p.r.Vs,-4); % Azuriramo prikaz zraka v pljucih na drsniku in s stevilom set(ui.h.r.VSlider, 'Value', p.r.Vs); set(ui.h.r.VText, 'String', num2str(p.r.Vs, '%3.2f l')); t.tR = t.tR + t.dt; if (t.tR > gledanje_spremenjljiv) & (t.tR < (gledanje_spremenjljiv+1)) disp(['cas t.tR = ' num2str(t.tR)] ); gledanje_spremenjljiv=gledanje_spremenjljiv+10; end % ----------------------------------------------------- % PRAZNIMO JEKLENKO % pripravimo volumen za pravo spremembo casa p.r.Vs = p.r.Vs * t.dt; % zaokrozimo na 4 decimalke p.r.Vs = roundn(p.r.Vs,-4); % % pogledamo, ce smo vdihnili if p.r.Vs < 0 % izracunamo volumen vdiha na globini h p.r.Vsh = p.r.Vs * p.d.ph; p.t.V = p.t.V - abs(p.r.Vsh); p.t.p = p.t.V / c.t.V; % p.t.p pritisk zraka v jeklenki end end % end za: m.Respiration % Stanje jeklenke, rezaerva, prazno if p.t.p < p.t.prezerva %p.t.prezerva disp('UPS, Jeklenka je na rezervi'); text(0.1,0.9,'{\itUPS, Jeklenka je na rezervi}'); elseif p.t.p < p.t.desetbar %p.t.pnull disp('UPS, Jeklenka je prazna'); text(0.1,0.7,'{\itUPS, Jeklenka je skoraj prazna}'); end % end za: if p.t.p < p.t.prezerva % Izracun deluje, ce simulacija ni zaustavljena if m.Running
40
% ------------------------------------------------------------- % izracuni, ki jih potrebuje model in jih lahko na zacetku % (t=0) spreminjamo if t.tM < t.dt; %---------------------------------------------------------- % izracunamo maso jeklenke = c.t.m [kg] c.t.m = c.t.V * 1.2; %---------------------------------------------------------- % izracunamo ZACETNO maso zraka = p.t.ma [kg] % pozenejse maso zraka je potrebno racunat izven te zanke % p.t.ma = 2.6 kg p.t.ma = c.t.V * c.t.p * 1.3 / 1000; %---------------------------------------------------------- % nastavimo volumen komenzatorja na enko vrednost kot je masa % jeklenke. Pristejemo se 0.0001 zaradi zaokroevanja p.b.Vh = (c.t.V * c.t.p * 1.3 / 1000) + 0.0001; p.b.Vk = (c.t.V * c.t.p * 1.3 / 1000) + 0.0001; %---------------------------------------------------------- % skupna masa je masa vse delov na sebi (masa potapljaca[c.d.m] % + masa jeklenke[c.t.m] + masa zraka v jeklenki[p.t.ma] + % ostala oprema[c.e.m] + masa utezi(svinca) % p.d.m = 105.6 kg p.d.mfiksna = c.d.m + c.t.m + c.e.m + c.w.m; p.d.mcas = p.t.ma ; p.d.m = p.d.mfiksna + p.d.mcas; %---------------------------------------------------------- % volumen obleke = p.s.V [l] % p.s.V = 12 l p.s.V = c.s.t * 3 * (c.d.m / 100); %---------------------------------------------------------- % Nastavimo skupen volumen (prej fisken volumen), torej % to je tisti volumen katerega uporabimo, % da se potapljac(diver) na globini h umiri. p.d.Vfiksen = c.d.m + c.t.m + c.e.m; p.d.Vcas = p.s.V + p.b.Vk; p.d.V = p.d.Vfiksen + p.d.Vcas; %---------------------------------------------------------- % Polmer krogle, s katero aproksimiramo potapljaca = r [m] % p.d.r = 0.2932 m p.d.r = ((3 * p.d.m)/(4*pi*c.d.ro))^(1/3); % ------------------------------------------------------------- % Volumen razpetega zraka v jeklenki. = p.t.V [l] % p.t.V = 2000 l p.t.V = c.t.V * c.t.p; end %end za: if t.tM < t.dt; % Najprej preverimo stanje gumbov kompenzatorja if get(ui.h.b.ButtonIn, 'Value') % BCD + if p.b.Vh < c.b.VMin p.b.Vh = c.b.VMin; elseif p.b.Vh > c.b.VMax | p.b.Vh == c.b.VMax p.b.Vh = c.b.VMax; elseif p.t.V > 0 % Z zrakom iz jeklenke polnimo kompenzator p.b.Vh = (p.b.Vh + p.b.dV); % ----------------------------------------------------- % PRAZNIMO JEKLENKO p.t.dV = abs(p.b.dV * p.d.ph); p.t.V = p.t.V - p.t.dV; p.t.p = p.t.V / c.t.V; % p.t.p pritisk zraka v jeklenki % wavplay(c.b.SoundIn, c.b.fs, 'async'); % Zvok-kompenzatorja else text(1,-1/3,'{\itUPS, Jeklenka je prazna.}'); disp('UPS, Jeklenka je prazna.'); m.Running = 0; end end %end za: if get(ui.h.b.ButtonIn, 'Value') if get(ui.h.b.ButtonOut, 'Value') % BCD - % preverimo volumen zraka v kompenzatorju, da ne pade pod nic % (c.b.VMin) in % ne gre cez mejo (c.b.VMax) if p.b.Vh < c.b.VMin | p.b.Vh == c.b.VMin p.b.Vh = c.b.VMin;
41
elseif p.b.Vh > c.b.VMax | p.b.Vh == c.b.VMax p.b.Vh = c.b.VMax; else % Zrak iz kompenzatorja izpuscamo p.b.Vh = p.b.Vh + p.b.dV; % wavplay(c.b.SoundOut, c.b.fs, 'async'); % Zvok-kompenzatorja end end %end za: if get(ui.h.b.ButtonOut, 'Value') % ce ni bil BCD pritisnjen, ga posatavimo na nic if get(ui.h.b.ButtonOut, 'Value')==0 & get(ui.h.b.ButtonIn, 'Value')==0 p.b.dV = 0; end %end za: get % Fizikalni modela izracunavamo in risemo redkeje, kot se % spreminja simulacijski cas, le na vsakih t.dtI vmesnih iteracij if t.dti == 0 % Stevec vmesnih iteracij je odstel MainVBC('Recalculate'); % Izracunamo nove vrednosti modela MainVBC('UpdateUIValues'); % Azuriramo podatke za GUI MainVBC('StoreModel'); % Shranimo vse trenutne vrednosti MainVBC('Plot'); % Narisemo zahtevane vrednosti % parametrov modela (iz predhodnih % vrednosti in podatkov za GUI) t.dti = t.dtI; % Ponovno postavimo stevec vmesnih %iteracij glavne simulacijske zanke p.d.ti = p.d.ti + t.dtM; end %end za: t.dti == 0 set(ui.h.RunButton, 'String', ['Run (t = ' num2str(t.tM,'%5.1f') '
s)']);, t.tM = t.tM + t.dt; % Povecamo cas t.dti = t.dti - 1; % Odstejemo stevec vmesnih iteracij (do
%naslednjega izracuna) end %end za: if m.Running % Azuriranje ure (in morebitna pauza) t.Loop = toc; % Preverimo porabljen racunski cas za
% zadnji cikel glavne zanke. if t.Loop < t.dt % Ce smo porabili manj casa, kot bi naj
%trajal en odsek realnega casa pause(t.pause+t.dt - t.Loop); % v simulaciji, potem pocakamo na
%naslednji casovni trenutek. end t.t = t.t + t.dt; % Pomik na naslednji casovni trenutek v
% simulaciji tic; end % end za: while ~m.Quit; % Konec glavne zanke else % end za: nargin < 1 % -------------------------------------------------------------------------- % V nadaljevanju so funkcije, ki se izvedejo ob % aktiviranju posameznih kontrolnikov uporabniskega vmesnika ('callback') % ali kot klici podprogramov. switch Action case 'Reset' % --------------------------------------------- % Na novo pozenemo cas in zaustavimo simulacijo t.tM = 0; % Restiramo cas simulacije [s] m.Running = 0; % Simulation flag set(ui.h.RunButton,... 'Value', m.Running,... 'String', 'Run'); case 'Run' % --------------------------------------------- % (Ponovni) zagon in (zacasna) zaustavitev simulacije m.Running = ~m.Running;
% De/aktiviramo vsa edit vnosna polja if m.Running OnOff = 'Off'; else OnOff = 'On'; end for i = 1 : ui.p.NoParam set(ui.h.p.Value(i),'Enable', OnOff); end; for i = 1 : ui.c.NoConst set(ui.h.c.Value(i),'Enable', OnOff); end; case 'UpdateUIValues' % ---------------------------------------------
42
% Po vsakem simulacijskem koraku % azuriramo izpisane vrednosti parametrov for i = 1 : ui.p.NoParam PrireditveniStavek = ['ui.p.Value(i) = ' ui.p.Var{i} ';']; eval(PrireditveniStavek); set(ui.h.p.Value(i), 'String', num2str(ui.p.Value(i))); end; case 'UpdateModelValues' % --------------------------------------------- % Akcijo sprozijo vsi 'edit' kontrolniki parametrov in konstant. % Azuriramo vse nastavljive vrednosti parametrov in konstant modela. for i = 1 : ui.p.NoParam ui.p.PlotRel(i) = get(ui.h.p.PlotRel(i), 'Value'); if ui.p.PlotRel(i) % Ce risemo relativno, potem vklopimo tudi risanje, ce ze ni set(ui.h.p.Plot(i), 'Value', 1); end ui.p.Plot(i) = get(ui.h.p.Plot(i), 'Value'); ui.p.Print(i) = get(ui.h.p.Print(i), 'Value'); ui.p.Value(i) = str2num(get(ui.h.p.Value(i), 'String')); % Vrednost parametra iz uporabniskega vmesnika prepisemo v %spremenljivko modela PrireditveniStavek = [ui.p.Var{i} ' = ui.p.Value(i);']; eval(PrireditveniStavek); end; for i = 1 : ui.c.NoConst ui.c.Value(i) = str2num(get(ui.h.c.Value(i), 'String')); % Vrednost konstante iz uporabniskega vmesnika prepisemo v % konstanto modela PrireditveniStavek = [ui.c.Var{i} ' = ui.c.Value(i);']; eval(PrireditveniStavek); end; case 'StoreModel' % --------------------------------------------- % Vse trenutne vrednosti parametrov shranimo v vektorje s.i = s.i + 1; % Povecamo stevec simulacijskih izracunov s.t(s.i) = t.tM; % Shranimo simulacijski cas for i = 1 : ui.p.NoParam s.p(s.i, i) = ui.p.Value(i); % Shranimo vrednosti parametrov end; case 'UpdateRR' % --------------------------------------------- % Akcijo sprozi drsnik za nastavitev frekvence dihanja. % Spremenimo frekvenco dihanja in azuriramo njen stevilcni prikaz. p.r.f = get(ui.h.r.fSlider, 'Value'); set(ui.h.r.fText, 'String', num2str(p.r.f, '%4.1f/min')); case 'FillBCD' % BCD + % --------------------------------------------- % Detektiramo polnjenje BCD-ja if get(ui.h.b.ButtonIn, 'Value') % Pricnemo polnjenje BCD-ja (in ustavimo morebitno praznjenje) set(ui.h.b.ButtonOut, 'Value', 0); p.b.dV = + c.t.dV * t.dtM ; % pomnozimo z t.dtM, ker je pretok
% definiran kot liter na sekundo end case 'EmptyBCD' % BCD - % --------------------------------------------- % Detektiramo praznjenje BCD-ja if get(ui.h.b.ButtonOut, 'Value') % Pricnemo praznjenje BCD-ja (in ustavimo morebitno polnjenje) set(ui.h.b.ButtonIn, 'Value', 0); p.b.dV = - c.t.dV * t.dtM; % pomnozimo z t.dtM, ker je pretok
% definiran kot liter na sekundo end case 'Plot' % --------------------------------------------- % Narisemo vse zahtevane parametre % Podprogram klicemo iz glavne zanke % axes(ui.h.graf); if s.i > 1 PrintString = []; for i = 1 : ui.p.NoParam if ui.p.Plot(i) if ui.p.PlotRel(i) % Vrednost parametra narisemo relativno na prvi parameter (globino) plot([s.t(s.i) s.t(s.i)], s.p(s.i,1) + [0 s.p(s.i,i)],
i.p.PlotPat{i}); %text(0.1,0.9,'{\itUPS, AAA}'); else % Vrednost parametra narisemo na grafikon absolutno plot([s.t(s.i-1) s.t(s.i)], [s.p(s.i-1,i) s.p(s.i,i)],
ui.p.PlotPat{i}); %text(0.1,0.9,'{\itUPS, BBB}'); end end;
43
if ui.p.Print(i) % Dodamo vrednost parametra za izpis PrintString = [PrintString ui.p.Name{i} ' = '
num2str(s.p(s.i,i)) '; ']; end end; if length(PrintString) > 0 % Izpisemo vrednosti vseh zeljenih parametrov disp(['tM = ' num2str(t.tM) ': ' PrintString]); end end; if get(ui.h.Animation, 'Value') x0 = t.tM-10; else x0 = -1; end set(ui.h.graf,... 'XLim', [x0 t.tM],... 'XTick', x0 : t.tM); if get(ui.h.YFiksen, 'Value') y0 = c.d.hMax; set(ui.h.graf,... 'XLim', [x0 t.tM],... 'XTick', x0 : t.tM,... 'YLim', [y0 1]); else end %end za: if get(ui.h.YFiksen, 'Value') case 'Recalculate' % ***************************************************************** % ZACETEK % GLAVNI FIZIKALNI DEL % ***************************************************************** %---------------------------------------------------------- % Izracunamo masa svinca, katero bomo predlagali p.w.ms = c.s.t * c.d.m * 3 / 100; %---------------------------------------------------------- % tlak v odvistnosti od globine = p [bar] p.d.ph = (c.d.p0 - c.d.ro * c.d.g * p.d.h); % p.d.ph [Pa] p.d.ph = p.d.ph / c.d.p0; % p.d.ph [bar] %---------------------------------------------------------- % volumen obleke na doloceni globini = p.s.Vh [l] % c.d.p0 zbrisal, ker je Pa, c.d.p0 v barih pa je 1 p.s.Vh = ((c.s.k * p.s.V) + ((1 - c.s.k)*p.s.V/p.d.ph)); if (p.b.Vh == c.b.VMin & p.b.dV > 0) | (p.b.Vh > 0 & (p.b.Vh < c.b.VMax
| p.b.Vh == c.b.VMax)) %---------------------------------------------------------- % vol.kom. v odvisnosti od globine(h) = Vh (l) p.b.Vh = ((p.b.Vh + p.b.dV) * p.d.phPrev) / (p.d.ph); if p.b.Vh > c.b.VMax p.b.Vh = c.b.VMax; end end %---------------------------------------------------------- % izracunamo silo upora potapljaca = p.d.Fr [N] p.d.Fr = (0.4*0.5*c.d.ro*(p.d.v)^2*pi*(p.d.r)^2); %---------------------------------------------------------- % izracunamo silo teze = p.d.Fg [N] p.d.Fg = c.d.g * p.d.m; %---------------------------------------------------------- % izracunamo silo vzgona(skupen vol.+vol.komp.+vol.pljuc) = p.d.Fb [N] % vol.komp. +- zato, da nastavimo zacetno vrednost p.d.Fb = c.d.ro * c.d.g *((p.d.V-p.b.Vk+p.b.Vh+p.r.Vs)/1000); %---------------------------------------------------------- % Pogledamo kam kaze gibanje if p.d.v > 0 p.d.Fr = - p.d.Fr; p.d.smer = 1; % gor elseif p.d.v < 0 p.d.Fr = p.d.Fr; p.d.smer = -1; % dol end %-------------------------------------------------------------- % preverimo velikost dt-ja, ce je manjsi kot 2.1 potem % je natačnost programa zelo mala if t.dtM < 2.1 %---------------------------------------------------------- % izracunamo pospesek potapljaca = a[m/s^2] % pospesek = - sila teze + sile vzgona + sila upora
44
p.d.a = (-p.d.Fg + p.d.Fb + p.d.Fr)/p.d.m;; %---------------------------------------------------------- % izracunamo hitrost potapljaca = v[m/s] p.d.v = p.d.v + p.d.a * t.dtM; %---------------------------------------------------------- % olajsamo ustavljanje potapljaca if p.d.h > 1 if abs(p.d.v) < c.d.vepsilon disp('Potapljaca ustavljamo, torej v=0, aaaaaaaaaa'); pause(t.epsilon/10); end if abs(p.d.vPrev) < c.d.vepsilon & abs(p.d.v) < c.d.vepsilon &
abs(p.d.Fb - p.d.Fg + p.d.Fr) < c.d.Fepsilon % dol if abs(p.d.Fb - p.d.Fg) < c.d.Fepsilon p.d.v = 0; disp('Potapljaca ustavljamo, torej v=0, FFFFFFFFF'); pause(t.epsilon); end if abs(p.d.v) < c.d.vepsilon p.d.v = 0; disp('Potapljaca ustavljamo, torej v=0, vvvvvvvvv'); pause(t.epsilon); end p.d.v = 0; disp('Potapljaca ustavljamo, torej v=0'); pause(t.epsilon); end end %---------------------------------------------------------- % izracunamo globino potapljaca = h[m] p.d.h = p.d.h + ((p.d.v + p.d.vPrev) / 2) * t.dtM; else %else za: if t.dtM < 2.1 disp('****************************************************'); disp(' t.dtM je prevelik. t.dtM < 2.1 '); disp('****************************************************'); close; end %end za: if t.dtM < 2.1 %---------------------------------------------------------- % pogledamo, ce smo na dnu ali na povrsini if p.d.h > c.d.hNull %& p.d.Fb > p.d.Fg % Fb = sila vzgona % ------------------------------------------------------ % Na povrsini postavimo globino, hitrost in pospesek % na vrednost nic p.d.h = c.d.hNull; p.d.v = c.d.vMin; p.d.a = c.d.aMin; p.d.a1 = c.d.aMin; elseif p.d.h < c.d.hMax %& p.d.Fb > p.d.Fg % Fb = sila vzgona % ------------------------------------------------------ % Na dnu postavimo hitrost in pospesek % na vrednost nic % Globino pa postavimo na dovoljeno vrednost p.d.h = c.d.hMax; p.d.v = c.d.vMin; p.d.a = c.d.aMin; p.d.a1 = c.d.aMin; end % Shranimo vrednost trenutne hitrosti in tlak p.d.vPrev = p.d.v; p.d.phPrev = p.d.ph; % je v: case 'Recalculate' %********************************************************************** % KONEC %********************************************************************** end %end za: Switchend % end za: if nargin < 1
45