0

適用電流に関してプロペラ角速度の Matlab プロットを作成したいと思います。ポイントは、これには相互に依存する 2 つのデータ セットを組み合わせる必要があるということです。

まず、以下のプロットに見られるように、抗力係数c_dは角速度に依存します (式はありません。データのみです)。特性は として簡単に線形化できます。omegac_d(omega)c_d(omega) = p*omega + p_0

次に、印加電流だけでなく抗力係数にもomega依存します。ic_d(omega)

ケースを解決するスクリプトc_d。以下は定数です。Matlab コマンドを使用して、これら 2 つを結合することは何らかの形で可能でなければなりません。助けてくれてありがとう。

%%Lookup table for drag coefficient c_d
c_d_lookup = [248.9188579 0.036688351; %[\omega c_d]
    280.2300647 0.037199094;
    308.6091183 0.037199094;
    338.6636881 0.03779496;
    365.8908244 0.038305703;
    393.9557188 0.039156941;
    421.9158934 0.039667683;
    452.2846224 0.040348674;
    480.663676  0.041199911;
    511.032405  0.042051149;
    538.9925796 0.042561892;
    567.2669135 0.043242882;
    598.4734005 0.043668501;
    624.1297405 0.044264368;
    651.9851954 0.044604863;
    683.6105614 0.045200729];

subplot(2,1,1)
plot(c_d_lookup(:,1), c_d_lookup(:,2))
title('This is how c_d depends on \omega')
ylabel('c_d')
xlabel('\omega [rad/s]')



%%Calculate propeller angular speed in terms of applied current. omega
%%depends on c_d, which in turn depends on omega. The formula is:

% omega(i) = sqrt(a*i / (b * c_d(omega)))

% Where:
% i - applied current
% omega - propeller angular velocity
% a,b - coefficients

i = [1:15];
a = 0.0718;
b = 3.8589e-005;

%If c_d was constant, I'd do:
omega_i = sqrt(a .* i / (b * 0.042));

subplot(2,1,2)
plot(i, omega_i)
ylabel({'Propeller ang. vel.', '\omega [rad/s]'})
xlabel('Applied current i[A]')
title('Propeller angular velocity in terms of applied current')

ここに画像の説明を入力

編集:

bdecafのソリューションに従おうとしています。だから私は次のc_d_findように関数を作成しました:

function c_d = c_d_find(omega, c_d_lookup)
    c_d = interp1(c_d_lookup(:,1), c_d_lookup(:,2), omega, 'linear', 'extrap');
end

私はMatlab関数ハンドルについて何も知りませんが、アイデアを理解しているようです... Matlabコマンドウィンドウで次のように入力しました:

f = @(omega) omega - sqrt(a .* i / (b * c_d_find(omega, c_d_lookup)))

これで正しい関数ハンドルが作成されたと思います。次に何をすればいいですか?以下を実行してもうまくいきません。

>> omega_consistent = fzero(f,0)
??? Operands to the || and && operators must be convertible to logical scalar
values.

Error in ==> fzero at 333
    elseif ~isfinite(fx) || ~isreal(fx)
4

1 に答える 1

1

うーん...

私が正しく理解しているかどうか疑問に思いますが、一貫した解決策を探しているようです。

あなたの方程式は複雑に見えません。私はこのような解決策の概要を説明します。

  1. function c_d = c_d_find(omega)補間などを行う関数を書く
  2. 次のような関数ハンドルを作成しますf = @(omega) omega - sqrt(a .* i / (b * c_d_find(omega)))-これは一貫したオメガの場合はゼロです
  3. 一貫したオメガを計算するomega_consistent =fzero(f,omega_0)
于 2012-07-17T08:46:13.510 に答える