在这种情况下,迭代是一种有效的算法吗?

计算科学 matlab 算法 数值分析
2021-12-11 05:06:31

我在数值分析中的任务是

我们感兴趣的是找到 z(x) = 2500 的 β0 值。使用有效的算法来确定通过接收器的射线。

现在我只是循环并打印和绘制它,并从检查中看到介于 8 和 9 之间以及介于 -8 和 -9 之间的值是候选值:

x=0:1:6076*25;
hold on

for w = -10:14

[X,Z] = ode45(@(t,Z) sys(t,Z,w),x,[2000 tand(7.8)]);

w
Z(end,[1,end])


plot(X,Z(:,1),'r')  %Z(:,1) is z(x) and Z(:,2) is z'(x).

end

hold off

能不能做得更有效率?β0 是声源的角度,z(x) 是声音的深度。我的系统是:

function dZ=sys(t,Z,w)

% inline function for c(z)
c=@(z)4800 - 20.2090 + (17.3368)*z/1000+ (272.9057)*exp(-z*0.7528/1000); 
% inline function for c'(z)

dc=@(z) 17.3368/1000 - (272.9057)*(0.7528/1000)*exp(-z*0.7528/1000); 
q=c(2000);
dZ=zeros(2,1);    % a column vector
dZ(1)=Z(2);
dZ(2)=-(q/cosd(w))^2* dc(Z(1))/c(Z(1))^3; 
end
1个回答

我想到了这两件事可以帮助你。

1)由于我看到您使用的是 ode45 即 runge kutta 方法,如果您想让您的算法更有效,您可能可以使用自适应 runge kutta 方法。这可能会消除在指定间隔之间使用每个 β 值的限制。你可以在这里找到我很久以前看过的视频:http: //nptel.ac.in/courses/122106033/33

2) 因为你想要一个 z 等于 2500 的 β。你可以使用额外的数组,比如 Y 来存储你得到的那个 β 值的值。还有一个数组,比如 A 使得 A=|zY| 即当前 β 值的 z 与所需的 z 之间的差异。该数组的最小元素对应于您要查找的 β。您可以在以下位置查看:http ://www.mathworks.com/help/matlab/ref/min.html?refresh=true这从您的身边删除了检查方面,程序本身将告诉哪个 β 最适合。

希望能帮助到你!