在不使用while循环的情况下迭代Matlab中的收敛

时间:2015-08-23 12:52:32

标签: matlab while-loop convergence

我必须迭代一个过程,我对马赫数(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)

非常感谢

2 个答案:

答案 0 :(得分:0)

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

你可以在概念上引入一些停止在一定数量的迭代中的东西:

while((err> tolerance)&&(numIterations< limit))

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

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

答案 1 :(得分: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循环(或用其他语言执行)是唯一的方法。