0

我必须迭代一个过程,在该过程中我对马赫数 (M0) 有一个初始猜测。通过使用两个方程(Mn),这个初始猜测将给我另一个马赫数的猜测。最终,我想迭代这个过程,直到 M0 和 Mn 之间的误差很小。我有以下一段代码,它实际上适用于while循环。

但是,我担心 while 循环对于某些输入会花费很多迭代和计算时间,因为这将是更大代码的一部分,很可能会为 while 循环提供不可行的输入。

因此,我的问题如下。如何在 Matlab 中迭代这个过程而不咨询 while 循环?我现在正在实现的代码如下:

%% Input
gamma = 1.4;
theta = atan(0.315);
cpi = -0.732;
%% Loop
M0 = 0.2; %initial guess 
Err =  100;
iterations = 0;

while Err > 0.5E-3  
B = (1-(M0^2)*(1-M0*cpi))^0.5; 
Mn = (((gamma+1)/2) * ((B+((1-cpi)^0.5)*sec(theta)-1)^2/(B^2 + (tan(theta))^2)) - ((gamma-1)/2) )^-0.5;
Err = abs(M0 - Mn);
M0 = Mn;
iterations=iterations+1;
end

disp(iterations) disp(Mn)

非常感谢

4

2 回答 2

0

我认为你需要澄清这个问题。如果您要解决的问题是某些输入需要很长时间来计算,则不是 while 循环需要时间,而是代码多次执行导致它。任何循环的方法都将受到代码块执行时间乘以收敛所需的迭代次数的限制。

从概念上讲,您可以引入一些东西以在一定数量的迭代处停止:

While ((err > 容差) && (numIterations < limit))

如果您想要一个不需要迭代代码的答案,这类似于找到一个封闭形式的解决方案,我怀疑这不存在。

编辑添加:不存在是指以一种实用的形式,可以以更有效的方式实现,然后迭代到解决方案。

于 2015-08-23T13:09:28.027 回答
0

由于M0在每次迭代中计算并且您有三角函数,因此您不能使用迭代结构以外的其他方式(即while)。

如果在 处有特定的增加或减少M0,则可以初始化 的向量并为和M0进行向量计算。BErr

但是,有了sectan这是不可能的。

另一种方法是使用并行处理。但是,由于您M0在每次迭代时都更改了,所以您不能使用parfor循环。

至于for循环,在 MATLAB 中,您需要一个用于“命令”参数的数组for(例如 1:10 或 1:length(x) 或 i = A,其中 A = 1:10 或 A = [1:10;11:20 ])。由于您评估条件并根据评估结果判断您是否继续执行,因此似乎 while 循环(或另一种语言的 do while)是唯一的方法。

于 2015-08-23T14:11:12.097 回答