我正在尝试使用四阶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 中。
我已经尝试了几种公式,但是,如您所见,在这种情况下,我不确定如何正确编写它。
注意:以前使用了所有其他函数,这是我需要排序的“求解器”。
任何帮助都将受到欢迎。谢谢!