在不使用 while 循环的情况下在 Matlab 中迭代收敛
Iteration for convergence in Matlab without using a while loop
我必须重复一个过程,在这个过程中我对马赫数 (M0) 有一个初步的猜测。这个初始猜测将通过使用两个方程 (Mn) 为我提供另一个马赫数猜测。最后,我想重复这个过程,直到 M0 和 Mn 之间的误差很小。我有以下代码,它实际上与 while 循环配合使用效果很好。
但是,我担心 while 循环将对某些输入进行多次迭代和计算时间,因为这将是更大代码的一部分,很可能会为 while 循环提供不可行的输入。
因此我的问题如下。我如何在不使用 while 循环的情况下在 Matlab 中迭代这个过程?我现在实现的代码如下:
%% 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)
非常感谢
我认为你需要澄清这个问题。如果您要解决的问题是某些输入需要很长时间才能计算出来,那么不是 while 循环花费时间,而是多次执行代码导致的。任何循环的方法都将受到代码块执行时间乘以收敛所需的迭代次数的限制。
你可以引入一些东西在一定数量的迭代中停止,概念上:
While ((err > tolerance) && (numIterations < limit))
如果你想要一个不需要迭代代码的答案,这类似于找到一个封闭形式的解决方案,我怀疑这不存在。
编辑添加:我的意思是不存在,可以以更有效的方式实现,然后迭代到解决方案。
由于 M0
是在每次迭代中计算的,并且您有三角函数,因此除了迭代结构(即 while
)之外,您不能使用其他方法。
如果你在M0
有一个特定的增加或减少,那么你可以初始化一个M0
的向量并为B
和Err
做向量计算。
但是,对于 sec
和 tan
,这是不可能的。
另一个优点是使用并行处理。但是,由于您在每次迭代中都更改了 M0
,因此您不能使用 parfor
循环。
至于 for
循环,在 MATLAB 中您需要一个用于 for
"command" 参数的数组(例如 1:10 或 1:length(x) 或i = A,其中 A = 1:10 或 A = [1:10;11:20])。由于您评估条件并根据评估结果判断是否继续执行,因此 while 循环(或在另一种语言中执行)似乎是唯一的方法。
我必须重复一个过程,在这个过程中我对马赫数 (M0) 有一个初步的猜测。这个初始猜测将通过使用两个方程 (Mn) 为我提供另一个马赫数猜测。最后,我想重复这个过程,直到 M0 和 Mn 之间的误差很小。我有以下代码,它实际上与 while 循环配合使用效果很好。
但是,我担心 while 循环将对某些输入进行多次迭代和计算时间,因为这将是更大代码的一部分,很可能会为 while 循环提供不可行的输入。
因此我的问题如下。我如何在不使用 while 循环的情况下在 Matlab 中迭代这个过程?我现在实现的代码如下:
%% 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)
非常感谢
我认为你需要澄清这个问题。如果您要解决的问题是某些输入需要很长时间才能计算出来,那么不是 while 循环花费时间,而是多次执行代码导致的。任何循环的方法都将受到代码块执行时间乘以收敛所需的迭代次数的限制。
你可以引入一些东西在一定数量的迭代中停止,概念上:
While ((err > tolerance) && (numIterations < limit))
如果你想要一个不需要迭代代码的答案,这类似于找到一个封闭形式的解决方案,我怀疑这不存在。
编辑添加:我的意思是不存在,可以以更有效的方式实现,然后迭代到解决方案。
由于 M0
是在每次迭代中计算的,并且您有三角函数,因此除了迭代结构(即 while
)之外,您不能使用其他方法。
如果你在M0
有一个特定的增加或减少,那么你可以初始化一个M0
的向量并为B
和Err
做向量计算。
但是,对于 sec
和 tan
,这是不可能的。
另一个优点是使用并行处理。但是,由于您在每次迭代中都更改了 M0
,因此您不能使用 parfor
循环。
至于 for
循环,在 MATLAB 中您需要一个用于 for
"command" 参数的数组(例如 1:10 或 1:length(x) 或i = A,其中 A = 1:10 或 A = [1:10;11:20])。由于您评估条件并根据评估结果判断是否继续执行,因此 while 循环(或在另一种语言中执行)似乎是唯一的方法。