Underwater soundwave for different starting angles

3 views (last 30 days)
Hi!
I have previously asked about a similar problem but I will try again since I have since then corrected my codes a bit and thus can not use the previous answer that I received.
The assignment is to send out and underwater sound wave at a specific depth (2000 feet) with different starting angles and let the wave travel for a distance of 25 nautical miles (25*6076 feet). I want to be able to send out different sound waves with different starting angles and for each angle plot the specific path of the sound wave.
My codes so far looks like this:
function dZ=undervatten(x,Z)
p=[5.8796 14.4874 257.1923];
c=@(z) 4800+p(1)+(p(2)*z/1000)+(p(3)*exp(-z/1000));
c0=c(2000);
dZ=zeros(2,1);
dZ(1)=Z(2);
dZ(2)=-(c0/cosd(7.8))^2*(((-p(3)/1000)*exp(-Z(1)/1000))+p(2)/1000)/...
(4800+p(1)+p(2)*Z(1)/1000+p(3)*exp(-Z(1)/1000))^3;
end
This is my function using the information from the assignment and I have confirmed that it is correct. The value cosd(7.8) comes from the starting angle 7.8 degrees. I am then calling this function like this:
clear all, close all, clc
x=0:0.5:6076*25;
n=7.8;
[X,Z]=ode45(@undervatten,x,[2000 tand(n)]);
plot(X,Z(:,1),'-r')
xlabel('distance')
ylabel('depth')
axis ij
This is working just fine.
Now let's say I wanted to change n from 7.8 to -10 to 14 degrees. Hence, I want to send out waves with starting angle -10, call the function for this value, plot the curve and then move to angle -9.
Could someone please help me by showing how I can write this function so that I can call it for different values of n and getting all of the rays plotted in one graph?
Help would be much appreciated!
Thank you.

Accepted Answer

Torsten
Torsten on 16 Nov 2016
Edited: Torsten on 16 Nov 2016
What about
x=0:0.5:6076*25;
n=-10;
for i=1:25
[X,Z]=ode45(@(x,z)undervatten(x,z,n),x,[2000 tand(n)]);
Z_array(:,i)=Z(:,1);
n=n+1;
end
plot(x,Z_array)
function dZ=undervatten(x,Z,n)
p=[5.8796 14.4874 257.1923];
c=@(z) 4800+p(1)+(p(2)*z/1000)+(p(3)*exp(-z/1000));
c0=c(2000);
dZ=zeros(2,1);
dZ(1)=Z(2);
dZ(2)=-(c0/cosd(n))^2*(((-p(3)/1000)*exp(-Z(1)/1000))+p(2)/1000)/...
(4800+p(1)+p(2)*Z(1)/1000+p(3)*exp(-Z(1)/1000))^3;
end
?
Best wishes
Torsten.
  1 Comment
Alexander Engman
Alexander Engman on 16 Nov 2016
Thank.you.so.much!
This is exactly what I was trying to do. Thank you for a nice and efficient solution!
PS. I did not try the suggestion below, thanks for this answer as well, I am sure it might work just as fine!

Sign in to comment.

More Answers (1)

Jan
Jan on 16 Nov 2016
function dZ = undervatten(x, Z, n)
...
dZ(2) = -(c0/cosd(n))^2 * ...
And the calling:
n = 7.8;
[X,Z] = ode45(@(x,y) undervatten(x,y,n), x, [2000 tand(n)]);
...

Tags

Community Treasure Hunt

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

Start Hunting!