Calcolare, con la function matlab ode45, la traiettoria di un proiettile sferico, di massa m=15kg,in un sistema di coordinate cartesiane con allorigine il punto di lancio. Le forze agenti sul proiettile sono la gravit g=9.81 e la resistenza aerodinamica, che dipende dalla velocit w(t) del vento e da quella del proiettile. Le equazioni che descrivono il moto del proiettile sono: x(t) = vcos() y(t) = vsin() (t) = -gcos()/v v(t) = -D/m-gsin() con condizioni iniziali: x(0)= 0 y(0)= 0 (0)= angolo iniziale di lancio in radianti v(0)= 50 dove: D = CRS((x(t)-w(t))2 +y(t)2)/2 C=0.2 resistenza aerodinamica R=1.29 densit dellaria S =0.25 area sezione trasversale del proiettile w(t)= velocit del vento Considerare due condizioni: w(t)=0 senza vento w(t)=-20 costante nel tempo 1. Per ognuna delle condizioni visualizzare in un grafico le traiettorie corrispondenti agli angoli iniziali: 10,20,30,40,50 (ricordare che nellequazione in radianti). 2. Determinare quale di queste traiettorie ha la distanza maggiore dal punto di lancio e, per questa traiettoria, stampare langolo iniziale, il tempo dimpatto al suolo, la distanza dal punto di lancio e il numero di passi richiesti per la soluzione. 2. DESCRIZIONE DELLALGORITMO Per sviluppare l' algoritmo si sono create cinque function: testproiet.m: Function per testare il modello l'esercizio. proietwind.m: Function del modello del problema con vento. proiet.m: Function Modello del problema senza vento. AvvioProiettile.m: Script che fa partire il proiettile nei due casi (vento, senza vento). g.m: Function Modello per stabilire quando il proiettile tocca terra. 2.1 Script AvvioProiettile.m testproiet( 0 ); testproiet( 20 );
% Associo alle opzioni l' evento definito nella function g: % % * g una function per determinare gli 0 % options = odeset('events', @g); xmax = -inf; xmax_i = 0; r = cell(length(rad), 4); if w == 20 figure('Name','Traiettorie con vento') else figure('Name','Traiettorie senza vento') end
for i = 1:length(rad) x = [x0; y0; rad(i); v0];
% Utilizzo la ODE45 che ritorna: % * (Vettore Colonna dei punti di tempo, Soluzioni, % Tempo dell'occorrenza di un evento(0), % il tempo in cui si trova la soluzione)
if w == 20 %disp('--- Con Vento ---'); [t, y, tfinal, yfinal] = ode45(@proietwind, [0 inf], x, options); else w == 0 %disp('--- Senza Vento ---'); [t, y, tfinal, yfinal] = ode45(@proiet, [0 inf], x, options); end r{i,1} = t; r{i,2} = y; r{i,3} = tfinal; r{i,4} = yfinal; if max(r{i,2}(:,1)) >= xmax xmax = max(r{i,2}(:,1)); xmax_i = i; %indice dell'elemento end end
hold on title('Traiettorie') xlabel('x') ylabel('y') for i=1:length(rad) plot(r{i,2}(:,1),r{i,2}(:,2)); text(r{i,2}(length(r{i,2}(:,1))-8,1), r{i,2}(length(r{i,2}(:,2))-8,2), [num2str(grad(i))] ) end if w == 20 disp('-- Traiettoria massima con Vento --') disp(sprintf('\ngradi: %i\n', grad(xmax_i))) disp(sprintf('tempo di impatto dal suolo: %fs\n', r{xmax_i,3}(2))) % r(riga, colonna tempi) disp(sprintf('distanza dal punto di lancio: %fm\n', xmax)) % massima distanza disp(sprintf('numero di passi utilizzati: %i \n', length(r{xmax_i,1}))) else disp('-- Traiettoria massima senza Vento --') disp(sprintf('\ngradi: %i\n', grad(xmax_i))) disp(sprintf('tempo di impatto dal suolo: %fs\n', r{xmax_i,3}(2))) % r(riga, colonna tempi) disp(sprintf('distanza dal punto di lancio: %fm\n', xmax)) % massima distanza disp(sprintf('numero di passi utilizzati: %i \n', length(r{xmax_i,1}))) end pause(5);
Calcola, con la function matlab ode45 la traiettoria di un proiettile sferico di massa m=15kg, in un sistema di coordinate cartesiane con allorigine il punto di lancio. Vanno considerare due condizioni: 1. w(t)=0 senza vento 2. w(t)=-20 costante nel tempo Visualizza un grafico per la condizione di lancio scelta delle traiettorie con angoli: 10,20,30,40,50 Determina poi quale traiettoria ha la distanza maggiore dal punto di lancio e per questa traiettoria stampa: langolo iniziale, il tempo dimpatto al suolo, la distanza dal punto di lancio il numero di passi richiesti per la soluzione. Lo script richiede il Input un parametro w per scegliere quale modello usare: w=0 modello senza vento w=20 modello con vento -20 Calcola, con la function matlab ode45 la traiettoria di un proiettile sferico di massa m=15kg, in un sistema di coordinate cartesiane con allorigine il punto di lancio. Vanno considerare due condizioni: w(t) = 0 senza vento w(t) = -20 costante nel tempo Visualizza un grafico per la condizione di lancio scelta delle traiettorie con angoli: 10,20,30,40,50 Determina poi quale traiettoria ha la distanza maggiore dal punto di lancio e per questa traiettoria stampa: langolo iniziale, il tempo dimpatto al suolo, la distanza dal punto di lancio il numero di passi richiesti per la soluzione. Lo script richiede il Input un parametro w per scegliere quale modello usare: w = 0 modello senza vento w = 20 modello con vento -20 2.3 Function proiet.m function f = proiet(t, x)
w = 0; f1 = x(4)*cos(x(3)); f2 = x(4)*sin(x(3)); f3 = -9.81*cos(x(3))/x(4); f4 = -0.5*(0.2*1.29*0.25*((f1-w)^2+f2^2))./(15) - 9.81*sin(x(3));
f = [f1;f2;f3;f4]; end Modello delle Equazioni senza vento Input: t : Posizione lungo x. x : Valori iniziali di x Output: f : Risultati Le equazioni che descrivono il moto del proiettile sono: x(t) = v * cos() y(t) = v * sin() (t) = -g * cos() / v v(t) = -D / m - g*sin() Le condizioni iniziali: x(0)= 0 y(0)= 0 (0)= angolo iniziale di lancio in radianti v(0) = 50 dove: D = CRS((x(t)-w(t))2 +y(t)2)/2 C=0.2 resistenza aerodinamica R=1.29 densit dellaria S =0.25 area sezione trasversale del proiettile w(t)= velocit del vento
2.4 Script proietwind.m Per quanto riguarda il modello con vento cambia solo per l' impostazione di w internamente al file: function f = proietwind(t, x)
w = -20; ...
3. ECCEZIONI PREVISTE In questo elaborato non sono stati inseriti particolari controlli.
4. ESEMPI DUSO Esempio di uso lanciando lo script AvvioProiettile.m