close all
theta = 50;
v0=200;
slope= 0.1;
vx=v0*cosd(theta); %horizontal component of velocity vector
vy=v0*sind(theta); %vertical component of velocity vector
g=9.807;
tf=2*vy/g; %total flight time
t=linspace(0,tf,150);
for r=1:length(t)
x(r)=vx*t(r); %horizontal postion
A(r)=vy*t(r)-0.5*g*t(r)^2; %vertical postion of particle
R(r)=x(r)*slope; %vertical postion of terrain
end
figure(1)
plot(x,A,'b')
hold on
plot(x,R,'m')
title('Altitude VS Range')
xlabel('Range')
ylabel('Altitude')
legend({'Range','Line of Terrain'},'Location','southwest')
grid on
hold on

 採用された回答

Star Strider
Star Strider 2021 年 4 月 8 日

0 投票

Try this:
theta = 50;
v0=200;
slope= 0.1;
vx=v0*cosd(theta); %horizontal component of velocity vector
vy=v0*sind(theta); %vertical component of velocity vector
g=9.807;
tf=2*vy/g; %total flight time
t=linspace(0,tf,150);
for r=1:length(t)
x(r)=vx*t(r); %horizontal postion
A(r)=vy*t(r)-0.5*g*t(r)^2; %vertical postion of particle
R(r)=x(r)*slope; %vertical postion of terrain
end
[Amax,idx] = max(A);
x_int = interp1(A(idx:end)-R(idx:end), x(idx:end), 0);
y_int = interp1(x, R, x_int);
figure(1)
plot(x,A,'b')
hold on
plot(x,R,'m')
plot(x_int, y_int, 'rs')
title('Altitude VS Range')
xlabel('Range')
ylabel('Altitude')
legend({'Range','Line of Terrain','Intercept'},'Location','southwest')
grid on
hold off
.

16 件のコメント

Image Analyst
Image Analyst 2021 年 4 月 8 日
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 8 日
thank you. do you know how to added so it shows the actual x and y intercept coordinates in the plot?
Star Strider
Star Strider 2021 年 4 月 8 日
As always, my pleasure!
Yes! Add this line after the hold off call:
text(x_int, y_int, sprintf('$(%.1f, %.1f)\\rightarrow$',x_int,y_int), 'Horiz','right', 'Vert','middle', 'Interpreter','latex')
Experiment with it to get the result you want. See the documentation on text for details.
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 9 日
thank you
Star Strider
Star Strider 2021 年 4 月 9 日
As always, my pleasure!
Star Strider
Star Strider 2021 年 4 月 13 日
I decided to create a function out of part of the previous code:
function distance = ballistics(theta)
v0=200;
slope= 0.1;
vx=v0*cosd(theta); %horizontal component of velocity vector
vy=v0*sind(theta); %vertical component of velocity vector
g=9.807;
tf=2*vy/g; %total flight time
t=linspace(0,tf,150);
for r=1:length(t)
x(r)=vx*t(r); %horizontal postion
A(r)=vy*t(r)-0.5*g*t(r)^2; %vertical postion of particle
R(r)=x(r)*slope; %vertical postion of terrain
end
[Amax,idx] = max(A);
x_int = interp1(A(idx:end)-R(idx:end), x(idx:end), 0);
y_int = interp1(x, R, x_int);
distance = -hypot(x_int,y_int);
end
then use the fminunc function to optimise it:
theta_est = fminunc(@ballistics, 60)
producing:
theta_est =
47.8559
Note that it returns the negative of the hypotenuse (by design), so the minimum value of the ‘ballistics’ function will be the maximum range angle.
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 13 日
i not sure how to use the fminunc function to ge the theta_est
Star Strider
Star Strider 2021 年 4 月 13 日
Just use the code I posted.
It will likely be necessary to save the ‘ballistics’ function somewhere on your MATLAB search path first.
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 13 日
its not comming out with the theta est
Star Strider
Star Strider 2021 年 4 月 13 日
The code I posted ran for me without error. I have no idea what the problem could be.
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 13 日
so i just copy the new code and put it at the bottom of the first code
Star Strider
Star Strider 2021 年 4 月 13 日
If you have R2016b or later (if I remember correctly that was when functions were first allowed at the end of scripts), open a new script and put the ‘ballistics’ function at the end of it. Then run the fminunc call from above it. (I first ran it in a function I use for such purposes, then later saved it as a separate file to be certain that worked, and did the fminunc call each time. Both worked.)
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 13 日
sorry i just dont know how to do all that
Star Strider
Star Strider 2021 年 4 月 13 日
Download the attached file to a directory in your MATLAB search path.
Then from the Command Window or a script, run it by running:
ballistics_fminunc_demo
or if you have it open in a tab in your Editor window, and you can do that with:
edit('ballistics_fminunc_demo.m')
click on the green Run arrow. The result will appear in your Command Window.
FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 13 日
got it thank you
Star Strider
Star Strider 2021 年 4 月 13 日
s always, my pleasure!

サインインしてコメントする。

その他の回答 (2 件)

FRANCISCO CORTEZ
FRANCISCO CORTEZ 2021 年 4 月 12 日

0 投票

How can i determine the initial angle of the projectile with respect to the horizontal in order to achieve maximum range
Image Analyst
Image Analyst 2022 年 5 月 22 日

0 投票

See attached demo that computes just about everything you could ever want to know about a projectile.

カテゴリ

ヘルプ センター および File ExchangeProgramming についてさらに検索

製品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by