Matlab中带有控制器的四阶Runge-Kutta函数

时间:2018-09-05 18:56:36

标签: function controller runge-kutta

我正在尝试使用四阶Runge-Kutta方法求解在函数('f')中定义的方程组,同时考虑了变量('c')上的PD控制器。

这是到目前为止我的代码的样子:

 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'中的方程,同时还要确保使用了控制器。

任何想法都会非常感激。

非常感谢。

编辑:

在此link之后,我现在编写了一个单独的函数,如下所示:

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;

运行主脚本时,这会在for循环中以“ s1 = ...”开头的行返回错误:

Subscript indices must either be real positive integers or logicals.

此外,我不确定是否需要在此功能中合并控制器输入。

很抱歉,这很简单,但是我正在努力解决这个问题。

谢谢。

编辑2:

可以找到最新版本的代码here。 主循环在 Tacking.m 中(调用其他函数),而Runge-Kutta集成在 RK4.m 中。

我已经尝试了几种公式,但是,如您所见,在这种情况下,我不确定如何正确编写它。

注意:以前使用了所有其他函数,这是我需要排序的“求解器”。

任何帮助都将受到欢迎。谢谢!

0 个答案:

没有答案