0

我正在尝试使用ode45. 我的一些参数已经是时间的函数,但我不断收到错误。

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

其中obz和是每个向量,例如vrvl

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收到错误:

赋值比非单子下标有更多的非单子右轴维度

如何解决这个问题?

4

1 回答 1

0

这里有一些语法错误。首先,您不能只键入function odo并让 MATLAB 猜测它应该在这里做什么。第二个,您在求解器表达式中调用tandx两次。保持一致,以这种方式调用 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是与时间相关的值,因此需要在求解器的每一步中重新计算。你必须把它放在你的求解器函数中。

于 2019-04-13T18:33:37.667 回答