0

マッハ数 (M0) の初期推定を行うプロセスを反復する必要があります。この最初の推定値から、2 つの方程式 (Mn) を使用してマッハ数の別の推定値が得られます。最終的には、M0 と Mn の誤差が小さくなるまでこのプロセスを繰り返したいと考えています。次のコードがあり、実際には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)

どうもありがとう

4

2 に答える 2

0

問題を明確にする必要があると思います。解決したい問題が、一部の入力の計算に時間がかかることである場合、時間のかかるのは while ループではなく、コードの複数回の実行です。ループするすべてのメソッドは、コード ブロックの実行にかかる時間に収束に必要な反復回数を掛けたものによって制限されます。

概念的には、特定の反復回数で停止する何かを導入できます。

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

コードの繰り返しを必要としない答えが必要な場合、これは閉じた形式のソリューションを見つけることに似ており、これは存在しないと思います。

追加する編集:存在しないということは、より効率的な方法で実装してからソリューションを反復できる実用的な形式を意味します。

于 2015-08-23T13:09:28.027 に答える
0

は各反復で計算され、三角関数があるためM0、反復構造 (つまり ) 以外の方法を使用することはできませんwhile

で特定の増加または減少があった場合M0、 のベクトルを初期化し、およびのM0ベクトル計算を行うことができます。BErr

しかし、secこれtanは不可能です。

もう 1 つのワットは、並列処理を使用することです。ただし、繰り返しごとに変更するため、ループM0を使用できません。parfor

ループに関しては、MATLAB では「コマンド」引数forの配列が必要です(例: 1:10 または 1:length(x) または i = A、A = 1:10 または A = [1:10;11:20) for]))。条件を評価し、その評価結果によって実行を継続するかどうかを判断するので、while ループ (別の言語では do while) しか方法がないようです。

于 2015-08-23T14:11:12.097 に答える