Функция Рунге-Кутта 4-го порядка с контроллером в Matlab - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь решить систему уравнений, определенных в функции ('f'), используя метод Рунге-Кутты 4-го порядка с учетом контроллера ПД для переменной ('c').

Вот как выглядит мой код:

 t_f = 100; % simulation end time
 h = 0.1;   % sample time
 K = 1;     % controller gain
 Td = 10;   % controller derivative time
 x = [...]; % initial conditions
 N = round(t_f/h); % number of samples
 xout = zeros(N+1,length(x)+2); % memory allocation

 for i=1:N+1
     time = (i-1)*h; % simulation time
     a = x(1);
     if (a<10)
        a_ref = 1; % desired 'a' value
        c = K*((a-a_ref)+Td); % controller

 [x v] = RK4('f',x,[c 0],h,i);
 xout(i,:) = [time,x',v]

Я изо всех сил пытаюсь написать функцию RK4 для решения уравнений из 'f', также убедившись, что контроллер используется.

Любые идеи будут очень признательны.

Большое спасибо.

EDIT:

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

function [x v] = RK4(f,a,t_f,x,N)
a = 0;
t_f = 100;
h = 0.1;
N = round(t_f/h);
% h = (t_f - a) / N;
halfh = h / 2;
x(1,:) = x;
v(1) = a;
h6 = h/6;

for i = 1 : N
    v(i+1) = v(i) + h;
    vh2 = v(i) + halfh;
    s1 = f(v(i), x(i,:));
    s2 = f(vh2, x(i,:) + halfh * s1);
    s3 = f(vh2, x(i,:) + halfh * s2);
    s4 = f(v(i+1), x(i,:) + h * s3);
    x(i+1,:) = x(i,:) + (s1 + s2+s2 + s3+s3 + s4) * h6;
end;

При запуске основного скрипта это возвращает ошибку в строке, начинающейся с "s1 = ..." в цикле for:

Subscript indices must either be real positive integers or logicals.

Плюс, я не уверен, должен ли вход контроллера быть включен в эту функцию.

Извините, если это просто, но я изо всех сил пытаюсь обдумать это.

Спасибо.

РЕДАКТИРОВАТЬ 2:

Самую последнюю версию кода можно найти здесь . Основной цикл находится в Tacking.m (вызов других функций), а интеграция Рунге-Кутты находится в RK4.m .

Я пробовал несколько формулировок, но, как вы можете видеть, я не уверен, как правильно написать это в этом случае.

Примечание: все остальные функции ранее использовались, мне нужно отсортировать "решатель".

Любая помощь будет приветствоваться. Спасибо!

...