时变输入ODE求解

问题描述 投票:0回答:1

我正在尝试使用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维度

如何解决这个问题?

matlab ode differential-equations equation-solving ode45
1个回答
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是时间依赖的值,因此需要在求解器的每个步骤中重新计算。您必须将它放在求解器函数中。

© www.soinside.com 2019 - 2024. All rights reserved.