Z Skrypty dla studentów Ekonofizyki UPGOW
(→Modelowanie: Armata) |
(→Modelowanie: Armata) |
||
Linia 25: | Linia 25: | ||
:<math>\begin{cases} \dot x=v_x \\ \dot y=v_y\\ \dot v_x = -\gamma/m \; (v_x-u(t)) \\ \dot v_y=-\gamma/m\; v_y-g \end{cases}</math> | :<math>\begin{cases} \dot x=v_x \\ \dot y=v_y\\ \dot v_x = -\gamma/m \; (v_x-u(t)) \\ \dot v_y=-\gamma/m\; v_y-g \end{cases}</math> | ||
- | <source> | + | == Kod źródłowy == |
+ | <source lang="matlab"> | ||
clear all | clear all | ||
close all | close all |
Aktualna wersja na dzień 21:34, 4 sty 2010
Modelowanie: Armata
Mamy: \[\vec F = m \vec a\] więc: \[\vec F = m \vec \ddot x\] w kartezjańskim układzie współrzędnych mamy: \[\begin{cases} F_x = m \ddot x \\ F_y = m \ddot y \end{cases}\] Siły w ogólności zależą od prędkości, czasu i położenia. W przypadku lotu pocisku możemy założyć, że działa na niego siła tarcia oraz siła ciężkości.
\[\vec F = \vec T + \vec Q \] Gdzie Q to ciężar \[\vec Q = \begin{cases} 0 \\ -mg \end{cases}\]
Siła tarcia zależy od prędkości ruchu posicku względem powietrza. Jeżeli będzie wiał wiatr \[\vec u(t) = \begin{cases} u(t) \\0 \end{cases}\] to trzeba jego prękość odjąć od prędkości ruchu pocisku względem ziemi (wiatr pozorny). \[\vec T = - \gamma (\vec v-\vec{u(t)}) = \begin{cases} -\gamma (v_x-u(t) ) \\ -\gamma v_y \end{cases} \]
Czyli mamy układ równań:
\[\begin{cases} \dot x=v_x \\ \dot y=v_y\\ \dot v_x = -\gamma/m \; (v_x-u(t)) \\ \dot v_y=-\gamma/m\; v_y-g \end{cases}\]
Kod źródłowy
clear all close all disp('This is a gun!') function dx = gun(X,T) g=10; m=1; gama=1.5; u=(T>0.1)*10; dx = zeros(4,1); dx(1) = X(3); % x dx(2) = X(4); % y dx(3) = -gama/m*( X(3)-u ); % vx dx(4) = -gama/m*X(4) - g; % vy return end n=125; t = linspace(0,1.22,n); i=1; subplot(2,1,1) hold on alfas=linspace(0.01,pi/2,10); v0=1.; for alfa=alfas X0 = [0,0,v0*cos(alfa),v0*sin(alfa)]; [X,T,MSG]=lsode(@gun,X0,t); plot(X(:,1),X(:,2),'r-') i0=find(X(:,2)<0)(1)-1; i1=find(X(:,2)<0)(1); x_interp(i)=X(i0,1)+( 0 -X(i0,2))/(X(i1,2)-X(i0,2))*(X(i1,1)-X(i0,1)); plot(x_interp(i), 0 ,'g*') i+=1; endfor hold off grid on ylim([0,.05]) xlim([0,.1]) subplot(2,1,2) plot(alfas*180/pi,x_interp,'bo') alfa_fine=linspace(0,90,1000); x_fine=interp1(alfas*180/pi,x_interp,alfa_fine,'cubic'); [zasieg,alfa_i]=max(x_fine); hold on plot(alfa_fine,x_fine) plot(alfa_fine(alfa_i),zasieg,'ro') printf("Najwiekszy zasieg dla strzalu pod katem %f stopni\n",alfa_fine(alfa_i))