【问题标题】:Time varying input ODE solving时变输入 ODE 求解
【发布时间】:2019-09-04 00:51:45
【问题描述】:

我正在尝试使用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,但不断收到错误:

Assignment 的非单例右轴维度比非单例下标多

如何解决这个问题?

【问题讨论】:

  • 您没有向odo 声明输入或输出,这是为什么呢?
  • “obz、vr 和 vl 都是向量”是什么意思?你的意思是像之后的​​代码一样,它们是作为函数表给出的 t 的函数吗?或者它们是作为公式给出的函数?

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


【解决方案1】:

这里有一些语法错误。首先,您不能只输入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 是与时间相关的值,因此在求解器的每一步都需要重新计算。你必须把它放在你的求解器函数中。

【讨论】:

  • 嗨,卡尔斯。谢谢。我按照你说的做了,但现在它无法识别 x 和 t,因为我猜你描述它的方式,t 和 x 都将被视为方程的参数,而不是需要求解的参数。Undefined function or variable 'x'. 以下信息可以使用:`t=1:1:12;`vr=sin(t),vl=cos(t);obz=0.05*sin(t)b=0.2
  • 好的,现在很清楚了。我编辑了我的答案,现在它应该可以正常运行了。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多