Underwater soundwave for different starting angles

2 次查看(过去 30 天)
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.

采纳的回答

Torsten
Torsten 2016-11-16
编辑:Torsten 2016-11-16
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 个评论
Alexander Engman
Alexander Engman 2016-11-16
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!

请先登录,再进行评论。

更多回答(1 个)

Jan
Jan 2016-11-16
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)]);
...

标签

Community Treasure Hunt

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

Start Hunting!

Translated by