时变输入ODE解决

时间:2019-04-13 12:32:02

标签: matlab ode differential-equations equation-solving ode45

我正在尝试使用ode45求解一组ODE方程。我的许多参数已经是时间的函数,但是我一直在出错。

function odo
dx(1,1) = (vl+vr)/2*cos(x(3));
dx(2,1) = (vl+vr)/2*sin(x(3));
dx(3,1) = obz

其中obzvrvl都是向量,例如:

obz = sin(t),    t = 0:dt:tf;

我使用以下语法:

[t, x1] = ode45(@(t,x) odo(t,x,b,obz,vr,vl), 0:dt:tf, [0;0;0]);

R15一起出现,但不断出现错误:

  

分配的非单数rhs尺寸比非单数下标

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

您在这里有一些语法错误。首先,您不能只输入function odo并让MATLAB猜测它应该在这里做什么。第二个,您在求解器表达式中两次调用tx。一致的是,以这种方式在ode求解器中调用函数:

t_span=1:1:12;
b=0.2;
[t, x] = ode45(@odo, t_span, [0;0;0], b);

您不需要手动传递tx,而求解程序可以自己完成。仅附加参数b(但是在您的示例中未使用)。同样在函数声明中,请执行以下操作:

function dx = odo(t,x,b)

vr=sin(t); %Non-OD equations here
vl=cos(t);
obz=0.05*sin(t);

n=numel(x); %this generate a holder for results
dx=zeros(n,1);

dx(1) = (vl+vr)/2*cos(x(3)); %All ODEs formatted like this
dx(2) = (vl+vr)/2*sin(x(3));
dx(3) = obz;

如您所见,vrvlobz是随时间变化的值,因此需要在求解器的每个步骤中重新计算。您必须将其放置在您的求解器函数中。