Matlab: Finding the right angle

  • Context: MATLAB 
  • Thread starter Thread starter Adel A
  • Start date Start date
  • Tags Tags
    Angle Matlab
Click For Summary
SUMMARY

The discussion focuses on solving a projectile motion problem in MATLAB, specifically determining the angle "a" that allows a rock to land 20 meters away from the shooter. The user has successfully implemented the Runge-Kutta method to simulate the motion but requires assistance in creating a loop to refine the angle calculation. The suggested approach includes encapsulating the existing code into a function and utilizing the bisection method for root finding to achieve precise results.

PREREQUISITES
  • Understanding of multivariable second-order differential equations
  • Familiarity with the Runge-Kutta method for numerical integration
  • Basic knowledge of MATLAB programming and syntax
  • Concepts of projectile motion and angle calculations
NEXT STEPS
  • Implement a function in MATLAB that calculates the landing distance based on angle "a"
  • Research the bisection method for root finding in numerical analysis
  • Explore MATLAB's function handles for better code encapsulation
  • Learn about optimizing MATLAB code for performance improvements
USEFUL FOR

Students and educators in physics and engineering, MATLAB programmers, and anyone involved in numerical methods for solving differential equations.

Adel A
Messages
5
Reaction score
0
Hi!

I have a question about an assignment.
It is about throwing a rock which should land 20 meters away from the "shooter". My job is to find the angle "a" which makes the rock land 20 meters away.

The motion is given by a multivariable, second order differential equation which I have already "converted" into a first order differential equation. I am only allowed to use the Runge-Kutta-method, and not allowed to use ODE45.

I have managed to write a code which works fine, but I need help with making a loop of some sort, in order to find a precise angle, a, which makes the rock land 20 meters away from the shooter.
I know that the angle should be approximately 1 radian.

Here is the code:

Code:
clear all
close all
clc

format long

%g = 9.81;
a = pi/4;
a = 1;

x0 = [0;1.5];
xPrim0 = 19.*[cos(a);sin(a)];

K = [0.02 0; 0 0.065];
f = [0; -9.81];

x = [];                         % Vi ska räkna ut X (positionen), men vad skickar vi till funktionen?
xPrim = 19.*[cos(a);sin(a)];    % Ska det multipliceras med 19?
                                % xPrim är väl inte en funktion av vinkeln
                                % efter kastet?
h = 0.3;
T = 100;
hojd = 1.5;

%Q = [0.1 1 1.5 3.1];

%c0 = [0.1;0];
u = [x0; xPrim0];
u0 = [x0;xPrim0];

%F = [xPrim; f - norm(xPrim).*K*xPrim];

W = [];

% for i = 1:4

% u0 = [u(i);0];

u = u0;
U = u;

tt = 0:9;

for t=tt(1:end-1)

    k1 = Fproj(u);
    k2 = Fproj(u+0.5*h*k1);
    k3 = Fproj((u+0.5*h*k2));
    k4 = Fproj((u+k3*h));

    u = u + (1/6)*(k1+2*k2+2*k3+k4)*h;

    U = [U u];

end

% W = [W U];

plot(U(1,1:end),U(2,1:end))
hold on
line([0 25], [0 0])
line([20 20], [-5 5])
 
Physics news on Phys.org
I suggest that you encapsulate some of that code in a function that, given an angle a, calculates where the rock lands. It would be also easier if it returned the number as the distance to the desired value, such that it returns 0 when it is on target.

What you need then is to use some method for finding roots. You could use the Newton-Raphson method, but it is probably overkill for such a simple 1D problem. The simplest you could try is the bisection method.
 
Last edited:
  • Like
Likes   Reactions: FactChecker and Adel A

Similar threads

  • · Replies 18 ·
Replies
18
Views
4K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 8 ·
Replies
8
Views
3K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 36 ·
2
Replies
36
Views
6K
  • · Replies 15 ·
Replies
15
Views
3K
  • · Replies 2 ·
Replies
2
Views
5K
  • · Replies 1 ·
Replies
1
Views
2K
Replies
5
Views
8K