我正在尝试使用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
其中obz
,vr
和vl
都是例如:
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维度
如何解决这个问题?
这里有一些语法错误。首先你不能只输入function odo
并让MATLAB猜测它应该做什么。第二,你在解算器表达式中两次调用t
和x
。保持一致,这样在ode求解器中调用函数:
t_span=1:1:12;
b=0.2;
[t, x] = ode45(@odo, t_span, [0;0;0], b);
你不需要手动传递t
和x
,求解器自己做。只有附加参数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;
如您所见,vr
,vl
和obz
是时间依赖的值,因此需要在求解器的每个步骤中重新计算。您必须将它放在求解器函数中。