2

実行中の関数の値を配列に取り込もうとしています。この関数では、変数をからまでz2の増分で変更しています。同時に、これらの値を配列に入力したいと考えています。while ループと for ループを試しました。forループだけでこれを書く方法は?0.0100.99

私のコード:

Ys = y(2000);
Mp = ((max(y)-Ys)/Ys)*100;
[max, i] = max(y);
tp = t(i);
z = sqrt(((log(Mp))^2)/((pi*pi)+(log(Mp))^2));


%Given Equations
wd = pi/tp;
wn = wd/(sqrt(1-(z*z)));
ts = 4.6/(z*wn);
tr = 1.8/wn;

%for loop for z from 0 to 0.99
for i = 1:100;
   for z2 = 0:0.01:0.99
      %tr*wn = Fa
      Fa(i) = 2.917*z2^2 - 0.4167*z2 + 1;
      i = i + 1;
      if i >= 100;
          break;
      end
    end
end

find_zeta = interp1(Fa, 1.8);

disp(Fa);
disp(find_zeta);

発生しているエラー:1配列に s しか取得していません。

4

2 に答える 2

4

「ベクトル化された」matlabステートメントで、ループなしで実行できます

z2 = 0:0.01:0.99;
Fa = 2.917*z2.^2 - 0.4167.*z2 + 1;

まず、z2必要な値を計算します。次に、ベクトル要素を要素ごとに操作して (構文に注意 .^)、Fa を計算します。^演算子と演算子には根本的な違いがあり、.^その違いを本当に知りたいと思うでしょう。一般に、演算子に a を追加できます.。これは、配列の個々のスカラー要素に対して機能することを意味します。行列演算子と配列演算子については、こちらを参照してください。例えば:

A = rand(10);
B = rand(10);
% matrix multiplication
C=A*B; 
% element by element multiplication
C=A.*B

あなたが受け取った苦情は、あなたがしていることは非効率的であることを意味するだけです. matlab は事前に のサイズを認識していないためFa、配列に追加するたびに配列を再割り当てする必要があります。まだ使用できますが、非効率的です。

于 2012-10-08T13:31:32.703 に答える
1

matlab のインデックスは、他のプログラミング言語のように 0 からではなく、1 から始まります。

取得しているエラーは、配列の事前割り当てに関するものです。Fa = zeros(1,100);スクリプトの先頭に追加すると、消えます。

Fa = zeros(1,100);
i = 1;
for z2 = 0:0.01:0.99
   Fa(i) = 2.917*z2^2 - 0.4167*z2 + 1;
   i = i +1;
end

別の回答で提案されている「ベクトル化」の使用は、より適切な方法です。

于 2012-10-08T13:37:38.827 に答える