2017-11-24 25 views
0

私はMATLABを使用して変数のセットを見つけようとしています。ed、ec、ef、efn、et、enのように、理論的推力と実際の推力は.001未満です。私のコードは、条件が満たされてもwhile文を終了しません。何か案は?式の複数の従属変数MATLAB

clear; clc; 

B=5; Prf=1.5; M=.85; QR=43400000; Prc=30; Ta=288.2; Pa=101300; T04=1700; R=287; %ed=.97; ec=.85; et=.9; en=.98; 

% Turbojet Efficiencies and gammas 
gd=1.4; gc=1.33; gb=1.35; gt=1.33; gn=1.36; ActSpecificThrust = 800; ThSpecificThrust = 1020; g=1.4; gf=1.4; 

% Bypass Efficiencies (g/((g-1)*R)) T02 = Ta*(1+((g-1)/2)*M^2); 

while abs(ThSpecificThrust - ActSpecificThrust) >= .001 
    for ed = 0.8: .05: .95 
     for ec =.8:.05:.95 
      for ef=.8:.05:.95 
       for efn=.8:.05:.95 
        for et=.8:.05:.95 
         for en=.8:.05:.95 

P02 = Pa*(1+ed*(T02/Ta-1))^(gd/(gd-1)); 
P03 = P02*Prc; T03 = T02*(1+(1/ec)*(Prc^((gc-1)/gc)-1)); 
f = (T04-T03)/((QR/1107)-T04); P04 = P03; P08 = P02*Prf; T08 = T02*(1+(1/ef)*(Prf^((gf-1)/gf)-1)); 
uef = (2*efn*(gf/(gf-1))*R*T08*(1-(Pa/P08)^((gf-1)/gf)))^(1/2); 
T05 = T04-(T03-T02)-B*(T08-T02); 
P05 = P04*(1-(1/et)*(1-(T05/T04)))^(gt/(gt-1)); 
T06 = T05; P06 = P05; P7=Pa; 
ue = (2*en*(gn/(gn-1))*R*T06*(1-(P7/P06)^((gn-1)/gn)))^(1/2); 
u = M*(g*R*Ta)^(1/2); 
ThSpecificThrust = (1+f)*ue+B*(uef)-(1+B)*u; 
%TSFC = f/ASpecificThrust; 
%ep = (SpecificThrust*u)/((1+f)*ue^2/2+B*uef^2/2-(1+B)*u^2/2); 
%eth = ((1+f)*ue^2/2+B*uef^2/2-(1+B)*u^2/2)/(f*QR); 
%e0 = ep*eth; 

         end 
        end 
       end 
      end 
     end 
    end 
end 

答えて

1

すべてのforループの外側で条件をテストします。したがって、MATLABは条件をテストし、すべての変数の組み合わせを実行し、再度条件をテストします。

おそらく実行する必要があるのは、内部ループ内の条件をテストし、条件が満たされていればすべてのループを終了します。 。スクリプトではなく、機能を持って考えると、すべてのループを終了する最も簡単な方法は、ブールを設定することです:あなたが6つのループを持っているので

done=false; 
for ... 
    for ... 
    % compute 
    if condition 
     done=true; 
     break % exits inner for loop 
    end 
    end 
    if done 
    break % exits outer loop 
    end 
end 

、あなたは6 break文が必要になります。

ループを含む関数を記述し、条件が満たされたときに内部ループにreturnを実行する方がよいでしょう。

さらにfminsearchなどを使用することもできます。

-1

要件が満たされていることを確認しましたか?

forループごとに作成するベクトルには5つの値(0.8、0.85、0.9、0.95)しかありません。これらの値を組み合わせても期待値が得られない場合があります。

もう一度コードを確認します。while条件に使用しているThSpThrustの値は、各forループ(0.95)の最後の値を使用して計算されています。基本的には、abs(ThSpThrust(0.95,0.95 ...) - AcSpThrust)> = 0.001を確認しています。

適切な値を見つけたら、フラグとbreak文を使用してください。しかし、ループごとに休憩が必要です。

function = abs(ThSpThrust - AcSpThrust)を最小限に抑えるためにfminsearchを使用します。

+0

これは私が考えていたことですが、要件が満たされていることを確認してループを> 10にしても、ループでは満たされていても終了しませんでした。 –

+0

編集された元の回答。 –

+0

内側のforループ内で(ThSpecificThrust - ActSpecificThrust)をテストするとき、forループのすべての反復を繰り返し実行しています。問題は、要件を満たしてもループを破らないということです。私はその差異の関数をプリントアウトし、答えの無限反復のうちの1つで望む答えを見ることができます。 –

関連する問題