Tykillä ampuminen Mallinnettaessa heittoliikettä, kuten esimerkiksi tykillä ampumista, keskeisinä vaikuttavina tekijöinä ovat painovoima sekä ilmanvastuksen aiheuttama nopeuelle vastakkaissuuntainen voima. Painovoima on, missä on maan vetovoiman aiheuttama kiihtyvyys ja m heitettävän kappaleen massa. Ilmanvastusvoima on verrannollinen nopeuen neliöön, ja se voiaan mallintaa lausekkeella missä b on ilmanvastuskerroin, v skalaarinen nopeus, nopeus vektorina ja nopeuen suuntainen yksikkövektori. Yleinen liikeyhtälö saa tällöin muoon missä on merkitty sekä. Tarkastellaan tilannetta, jossa tykillä ammutaan poispäin liikkuvaan maaliin. Mikä on oikea ampumiskulma, kun 5 metrin korkeuella sijaitsevalta tykkilavetilta ammutaan 10 kg kranaatti nopeuella 1000 m/s kohti maalia, jonka etäisyys ampumishetkellä on tasan 5 km? Maali liikkuu 15 m/s tykistä poispäin veen pintaa pitkin, ja ilmanvastuskerroin kranaatille on b = 10 ( 4 ). Jaetaan yllä esitetty toisen kertaluvun vektorimuotoinen ifferentiaaliyhtälö kahteen eri osayhtälöön, z-suuntaan ja x-suuntaan, ja ratkaistaan yhtälöt. Laskujen aluksi on syytä hävittää mahollisista aiemmista laskuista jääneet muuttujat. > restart; Määritellään ifferentiaaliyhtälöryhmä ja sen tuntemattomat muuttujat. > ryhma:= m*iff(x(t), t$)=-b*iff(x(t), t)*sqrt(iff(x(t), t)^+iff(z(t), t)^), m*iff(z(t), t$)=-m*g-b*iff(z(t), t)*sqrt(iff(x(t), t)^+iff(z(t), t)^);
ryhma m x( t) = b := x( t ) x( t) + m z( t ) = m g b z( t ) x( t) + > muuttujat:= x(t), z(t); z( t) z( t) muuttujat := x( t ), z( t ) Määritellään vakiot ja alkuehto. Ammuksen lähtökulma olkoon θ. Sisällytetään ehtoon sekä ammuksen alkunopeus jaettuna nopeuskomponentteihin että lähtökorkeus., > g:= 9.81: b:= 10^(-4): m:= 10: v0:= 1000: > alkuehto:= x(0)=0, z(0)=5, D(x)(0)=v0*cos(theta), D(z)(0)=v0*sin(theta); alkuehto := x( 0 ) = 0, z( 0) = 5, D( x)( 0) = 1000 cos( θ ), D( z)( 0) = 1000 sin( θ ) Differentiaaliyhtälöryhmä ei ole ratkaistavissa alkeisfunktioien avulla, joten ryhmää ei voi ratkaista Maplen avulla θ:n funktiona. Suljetussa muoossa olevan ratkaisun sijaan jouutaan turvautumaan arvaukseen. Arvataan jokin kulma (raiaaneissa), ja katsotaan, miten hyvin laukaus osui. > theta:= 0.03; θ := 0.03 > rtk1:= solve({ryhma, alkuehto}, {muuttujat}, numeric, startinit=true, output=listproceure); rtk1 := t = ( proc( t )... en proc ), x( t ) = ( proc( t)... en proc ), x( t ) = ( proc( t )... en proc), z( t ) = ( proc( t )... en proc ), z( t ) = ( proc( t)... en proc) Poimitaan ratkaisusta x- ja z-suuntia kuvaavat komponentit listaksi ja piirretään kuvio. > lentorata1:= subs(rtk1, [x(t), z(t)]): > plot([lentorata1[], 0..10]);
Katsotaan miten lähelle laukaus osui. Huomaa, että ratkaisussa on huomioitu myös kohteen liike. > lentoaika1:= fsolve(lentorata1[](t)=0, t=0..10); lentoaika1 := 6.811463394 > osmaet1:= lentorata1[1](lentoaika1)-(5000+15*lentoaika1); osmaet1 := 1484.431854 Ammus osuu veteen noin puolitoista kilometriä liian kauaksi. Lähtökulma oli siis liian suuri. Arvataan uuestaan tarkoituksena haarukoia oikea tulos arvausten väliin. Tämän jälkeen voiaan systemaattisesti hakea oikea kulma. > theta:= 0.01; := θ 0.01 > rtk:= solve({ryhma,alkuehto}, {muuttujat}, numeric, startinit=true, output=listproceure);
rtk := t = ( proc( t )... en proc ), x( t ) = ( proc( t)... en proc ), x( t ) = ( proc( t )... en proc), z( t ) = ( proc( t )... en proc ), z( t ) = ( proc( t)... en proc) > lentorata:= subs(rtk, [x(t), z(t)]): > lentoaika:= fsolve(lentorata[](t)=0, t=0..10); lentoaika := 3.499905031 > osumaet:= lentorata[1](lentoaika)-(5000+15*lentoaika); osumaet := -161.618768 Nyt laukaus jäi liian lyhyeksi. Saimme kuitenkin haarukoitua osumisvälin. Löytääksemme tarkan ampumiskulman, teemme organisoiun kokeilun. Tehään pieni for-silmukka, joka tulostaa osumapaikan 1 laskupisteessä 0.001 raiaanin välein. Laskentamenettely hieman poikkeaa eellä olevista, koska Maplen uuemmissa versioissa fsolve-funktio ei kaikissa tapauksissa toimi oikein. Tämän takia käytössä on seuraava erikseen ohjelmoitu proseuuri nollakohta, jossa funktion nollakohan hakemiseen käytetään regula falsi -menetelmää. > nollakohta:=proc(fkt,x1,x) local a,b,c,fa,fb: a:=x1: b:=x: fa:=fkt(a): fb:=fkt(b): if fa*fb>0 then print(fail); return en if: c:=(a+b)/: while abs(a-c)>0.00000001 o a:=c: fa:=fkt(a): c:=a-(a-b)/(fa-fb)*fa: en o: c; en proc: > i:= 0: for theta from 0.01 by 0.001 to 0.03 o rtk[i]:= solve({ryhma, alkuehto}, {muuttujat}, numeric, startinit=true, output=listproceure); lentorata:= subs(rtk[i], [x(t), z(t)]); lentoaika:= nollakohta(lentorata[],0.,10.); osumataul[i]:= lentorata[1](lentoaika)-(5000+15*lentoaika); kulmataul[i]:= theta; i:= i+1; o:
kulmat:=[seq(kulmataul[k], k=0..0)]: etaisyyet:= [seq(osumataul[k],k=0..0)]; etaisyyet := [ -161.618760, -1475.385567, -1335.351170, -119.69948, -1047.61038, -900.6011, -750.818643, -599.4473395, -446.30613, -91.598303, -135.685688,.35134319, 181.079169, 341.187060, 50.18951, 664.09640, 86.8351781, 990.3144468, 1154.454953, 1319.183384, 1484.43185 ] Etsitään lähintä osumaa vastaava ineksi ja tämän avulla ampumiskulma, osumaetäisyys ja lentoaika. > member(min(map(x->abs(x),etaisyyet)[]),etaisyyet,'in'): lahin:=[kulmat[in],etaisyyet[in]]; lahin := [ 0.01,.35134319] Sama uuestaan uuella kapeammalla haarukalla ja 0.0001 raiaanin askelvälillä. > i:= 0: for theta from 0.00 by 0.0001 to 0.0 o rtk[i]:= solve({ryhma, alkuehto}, {muuttujat}, numeric, startinit=true, output=listproceure); lentorata:= subs(rtk[i], [x(t), z(t)]); lentoaika:= nollakohta(lentorata[],0.,10.); osumataul[i]:= lentorata[1](lentoaika)-(5000+15*lentoaika); kulmataul[i]:= theta; i:= i+1; o: kulmat:=[seq(kulmataul[k], k=0..0)]: etaisyyet:= [seq(osumataul[k],k=0..0)]; etaisyyet := [ -135.685688, -119.5656401, -103.849586, -88.11954534, -7.3766850, -56.60656, -40.85166864, -5.0698709, -9.75358, 6.53175518,.35134319, 38.1839350, 54.0748394, 69.883804, 85.7513014, 101.633504, 117.543548, 133.48049, 149.343505, 165.69918, 181.079169 ] > member(min(map(x->abs(x),etaisyyet)[]),etaisyyet,'in'): lahin:=[kulmat[in],etaisyyet[in]]; lahin := [ 0.009, 6.53175518] Osuma on siis runsaan kuuen metrin päässä ja vastaava ampumiskulma on asteissa > convert(lahin[1], egrees): evalf(%);
> Tehtäviä 1.19748179 egrees Piirrä lähimmäksi osuvan ammuksen lentorata. Määritä raan lakikorkeus ja ammuksen lentoaika. Suurenna ilmanvastuskerrointa, ja tutki, miten se vaikuttaa raan muotoon. Linkit tykillä ampuminen huomioimatta ilmanvastusta (tykki1.mws) JP & SKK & MS 1.07.001 & 08.07.005