2017-11-01 3 views
0

2つの初期変数を使用して値を計算しようとしていますが、最後の答えが上書きされて最終値のみが出力されています。私は2つのネストされたforループを変数に使用しようとしましたが、これは同様の応答を生成します。計算からの回答をセル配列に保存する方法

% inc = [0:1:360]; 
% axis = [0:416.6*10^3:15*10^7]; 
e = []; 
Re = 3390*10^3; 
om = 270;` 
J2 = 1.95545*10^3; 
J3 = 3.14498*10^-5; 
J4 = -1.53774*10^-5; 
J22 = 6.30692*10^-5; 

for inc = 0:1:360 
    for a = 0:416.6*10^3:15*10^7 
     E1 = ((6-169/2*sin(inc).^2+365/48*sin(inc).^4) 
     E2 = 35*J4/18*(J2)^2*(12/7-93*sin(inc).^2+21/4*sin(inc).^4); 
     E = E1-E2; 

     e1 = (J3*Re/2*J2*axis).*sin(inc).*sin(270); 
     e2 = (1-(3*E*J2*Re^2/axis.^2)*(5.*(sin(inc).^2)-4)); 
     e = -(e1/e2); 
    end 
end 

私は変数をincとaxisに対してプロットできるように、最後のセルに値を設定しようとしています。

また、私の数式の構文が間違っている場合は、ここで私が自動化しようとしている数式があります。

enter image description here

どこ

enter image description here

この問題を解決する方法上の任意のヘルプやアドバイスをいただき、ありがとうございます。

答えて

1

コードをベクトル化してループなしで解を得ることができます。 @ schnobi1が述べたように、分子と分母の除算と乗算による実装にもっと注意を払う必要があります。

Re = 3390*10^3; 
om = 270; 
J2 = 1.95545*10^3; 
J3 = 3.14498*10^-5; 
J4 = -1.53774*10^-5; 
J22 = 6.30692*10^-5; 
inc = 0:360; 
a = 0:416.6*10^3:15*10^7; 
E1 = (6-169/2*sin(inc).^2+395/48*sin(inc).^4); % 1 x 361 vector 
E2 = 35*J4/18*(J2)^2*(12/7-93*sin(inc).^2+21/4*sin(inc).^4); % 1 x 361 vector 
E = E1-E2;          % 1 x 361 vector 
e1 = [sin(270)*(J3*Re./(2*J2*a))].'*sin(inc); % vector multiplication, this is now 361 x 361 matrix 
e2 = 1-([3*J2*Re^2./a.^2].'*(E./(5*(sin(inc).^2)-4))); % vector multiplication, this is now 361 x 361 matrix 

e = -(e1./e2); 

結果、行がaの値に基づいている場合、361 X 361行列であり、列はincの値に記載されています。 例えば、4位でaとあなたが得る第十二場所でinc用:

a(4)= 

    1249800 

inc(12)= 

    11 

e(4,12)= 

    -8.9796e-18 
+0

私のエラーを見るためにあなたのコードを実行しようとしていましたが、 "エラーを使用しています。 Matlabのバージョンが異なるためですか? –

+0

されていません。 'すべてをクリア 'してから、もう一度実行してみてください。 'e1'と' e2'のサイズは? – Adiel

+0

e1は361x361の行列ですが、このエラーのためにe2を計算することはできません./ –

0

実装にはいくつかのエラーがあります。すべての条件を慎重に再確認してください(395/48は365/48です)。また、大括弧が正しくない場合もあります。私はこれらの問題のすべてを見つけたらいいのに、もう一度それをもう一度確認してください。

定義済みの変数 "axis"を使用しています。プロットに使用され、[0 1 0 1]と定義されています。それがあなたのコードが機能していなかった理由です。 これを試してみてください。

%% Clearing 
clc; clear all; close all 

%% Variables 
e = []; 
Re = 3390*10^3; 
om = 270; 
J2 = 1.95545*10^3; 
J3 = 3.14498*10^-5; 
J4 = -1.53774*10^-5; 
J22 = 6.30692*10^-5; 

inc=1 
a = 1 

%% Calculate e 
for inc = 0:1:360 
    for a = 0:416.6*10^3:15*10^7 
     E1 = 6-(169/12)*sin(inc).^2 + 395/48*sin(inc).^4; 
     E2 = 35*J4/(18*J2^2)*(12/7-(93/15*sin(inc).^2+21/4*sin(inc).^4)); 
     E = E1-E2; 

     e1 = (J3*Re)/(2*J2*a) * sin(inc)*sin(270); 
     e2 = 1-((3*J2*Re^2*E)/(a^2*(5*sin(inc)^2-4))); 
     e = [e, -(e1/e2)]; 
    end 
end 

eを行列に格納するには、単にe = [e, -(e1/e2)];を使用します。しかし、気をつけてください、これは "良い方法"ではありません。すべての実行で、eがコピーされ、それが遅くなるので。 eを最初からゼロで割り当て、後でその値を書き込むほうがずっと速くて速いです。

0

U uは更新したいすべてのベクトルポイントに直接インデックスを使用することができます。ループの使用例e1(Inc)=あなたの計算; e2(Inc)=あなたの計算; e(Inc)= - (e1(Inc)/ e2(Inc));しかし、遅くなるかもしれませんが、あなたはあなたの期待に応えます

関連する問題