Перекрестные характеристики нелинейного уравнения в Matlab

Я хотел бы создать график угловой скорости пропеллера в Matlab с точки зрения приложенного тока. Дело в том, что это требует объединения двух взаимозависимых наборов данных.

Во-первых, коэффициент лобового сопротивления c_d зависит от угловой скорости omega (у меня нет формулы, только данные), как видно на графике ниже - характеристики c_d(omega) можно легко линеаризовать как c_d(omega) = p*omega + p_0.

Во-вторых, omega зависит не только от приложенного тока i, но и от коэффициента сопротивления c_d(omega).

Скрипт, который решает случай, когда c_d является константой ниже. Должна быть какая-то возможность объединить эти два с помощью команд Matlab. Спасибо за любую помощь.

%%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)

person mmm    schedule 16.07.2012    source источник
comment
Итак, вы хотите решить это для omega или i? Нижний график показывает C_d0 по отношению к omega. Что показывает верхний график? Какие два значения вы хотите построить в конечном итоге?   -  person Eitan T    schedule 16.07.2012
comment
Вы правы, вопрос был неясен - извините за это. Я перефразировал его, надеюсь, теперь будет легче ответить.   -  person mmm    schedule 17.07.2012
comment
Я все еще не совсем понимаю вас. У вас есть график угловой скорости винта в зависимости от приложенного тока, чего вам не хватает?   -  person Eitan T    schedule 17.07.2012
comment
Да, но график угловой скорости с точки зрения приложенного тока был построен в предположении, что c_d(omega) = 0.042 было постоянным, что не так (см. первый график). Я хотел бы, чтобы omega(i) отразил это.   -  person mmm    schedule 17.07.2012
comment
о, и ваш c_d_find имеет больше входных данных, поэтому вам нужно настроить дескриптор функции.   -  person bdecaf    schedule 17.07.2012
comment
нет, уже поменял :). Сам дескриптор работает и возвращает вектор.   -  person mmm    schedule 17.07.2012
comment
Удивил меня. Но проблема в том, что вам нужно искать каждый i отдельно. Используйте f = @(omega) omega - sqrt(a * i(1) / (b * c_d_find(omega, c_d_lookup)))   -  person bdecaf    schedule 17.07.2012


Ответы (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)
person bdecaf    schedule 17.07.2012
comment
Спасибо, bdecaf, я отредактировал свой вопрос. Я думаю, что сейчас действительно мало чего не хватает. - person mmm; 17.07.2012
comment
о, это просто - omega_0 - это просто начальное значение для оптимизации. Просто укажите разумное значение. - person bdecaf; 17.07.2012
comment
Отредактировал вопрос, проблема все равно есть. - person mmm; 17.07.2012
comment
Спасибо бдекаф. В итоге я запрограммировал цикл, но результаты правильные — вот что важно. - person mmm; 17.07.2012