Как связать два набора дифференциальных уравнений и моделировать с помощью ode45 [MATLAB]? - PullRequest
0 голосов
/ 30 января 2020

Обзор: В основном я пытаюсь сделать что-то, что легко сделать в среде simulink, но я хочу сделать это с помощью команды Ode45. У меня есть два набора дифференциальных уравнений, и мне нужно связать их вместе. Я знаю, как использовать команду Ode45, когда существует только один набор дифференциальных уравнений, а также я знаю, как использовать команду Ode45 с зависящими от времени членами ( здесь используется ).


Итак, я пытаюсь имитировать приведенный ниже файл simulink, используя скрипт MATLAB и ode45: enter image description here

  • Block1 и Block2 содержат 2 набора ODE
  • Входы Simulink 1, 2 и 3 являются зависимыми от времени входами
  • Выход 1 Simulink, необходимо сохранить альфа и гамму

Ограничение для симуляции: дифференциал Уравнения Блока 1 должны быть записаны в отдельный файл функций, а также дифференциальные уравнения Блока 2.


Что я могу сделать:

  • Я могу создать файл функций, содержащий дифференциальные уравнения блока 1: Блок1
[Xdot_Block1, beta] = Block1(t,X_Block1,input1_t,input1,alfa)
input1 = interp1(input1_t,input1,t);
...
end
  • Аналогично дифференциальные уравнения для блока 2 в другом файле функций:
[Xdot_Block2, out1, alfa] = Block2(t,X_Block2,input2_t,input2,input3_t,input3,gamma)
input2 = interp1(input2_t,input2,t);
input3 = interp1(input3_t,input3,t);
...
end

ВОПРОС

Можете ли вы показать, как я могу смоделировать эти два набора дифференциальных уравнений, которые зависят друг от друга?

Для подхода я создал другой файл функций, который связывает их обоих и создает больший набор ODE, но я чувствую, что в этом есть ошибки:

[Xdot,out1,alfa,gamma]=system(t,X,input1,input1_t,input2,input2_t,input3,input3_t,alfa_initial,gamma_initial)
X_Block1=X(1:3);
X_Block2=X(4:11);

[Xdot_Block2, out1, alfa] = Block2(t,X_Block2,input2_t,input2,input3_t,input3,gamma)

[Xdot_Block1, beta] = Block1(t,X_Block1,input1_t,input1,alfa)

gamma=K*beta;

    Xdot=[Xdot_Block1;Xdot_Block2];
end

Кроме того, как бы я использовал начальные значения альфа и гамма (которые мне известны)?

...