Kód: Vybrať všetko
function varargout = balis(varargin)
%
%[td, xd] = balis(v0, h0, alpha [, fileout])
%[td, xd] = balis(filein [, fileout])
%
% Vypise cas a misto dopadu strely a vykresli drahu letu.
%
% Vstup:
% v0 - Pocatecni rychlost vystrelu [m/s]
% h0 - Pocatecni vyska nad terenem [m]
% alpha - Uhel stoupani vystrelu [stupne]
% filein - Jmeno souboru pro vstup
% Ocekava se soubor v textovem formatu.
% V souboru budou kazdy na novem radky predchozi 3 parametry.
% fileout - Jmeno souboru pro vystup (nepovinne)
%
% Vystup (nepovinne - oba nebo zadny):
% td - Cas dopadu [s]
% xd - Dolet [m]
if ((nargin < 1) | (nargin > 4))
error('Nespravny pocet vstupnich parametru.');
end
if (not ((nargout == 0) | (nargout == 2)))
error('Nespravny pocet vstupnich parametru.');
end
if (nargin <= 2)
fin = fopen(varargin{1}, 'r');
v0 = str2num(fgetl(fin));
h0 = str2num(fgetl(fin));
alpha = str2num(fgetl(fin));
fclose(fin);
else
v0 = varargin{1};
h0 = varargin{2};
alpha = varargin{3};
end
if ((nargin == 2) | (nargin == 4))
fout = fopen(varargin{nargin}, 'w');
else
fout = 1;
end
global g
g = 9.81;
v0x = v0 * cos(alpha/180*pi);
v0y = v0 * sin(alpha/180*pi);
tmax = 100; % Maximalni doba letu
[t, r] = ode45(@bal_fce, [0, tmax], [0; v0x; h0; v0y], ...
odeset('Events', @bal_stop));
plot(r(:, 1), r(:, 3));
xlabel('vzdalenost [m]');
ylabel('vyska [m]');
title('Balisticka krivka');
lt = length(t);
if (nargout == 0)
fprintf(fout, 'Strela dopadne za %0.3f s ve vzdalenosti %0.3f m.\n\n', ...
[t(lt), r(lt, 1)]);
else
varargout{1} = t(lt);
varargout{2} = r(lt, 1);
end
if (fout ~= 1)
fclose(fout);
end
end
function result = bal_fce(t, s)
% vrati hodnotu derivaci
global g;
result = [s(2); 0 - s(2); s(4); 0 - s(4) - g];
end
function [value, isterminal, direction] = bal_stop(t, s)
% pri dopadu zastavi vypocet
value = s(3); % vyska == 0
isterminal = 1;
direction = -1; % dopad
end