Изменение входного ODE во времени - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь решить систему уравнений ОДУ, используя 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, 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, чем не-одноэлементных индексов

Как решить эту проблему?

1 Ответ

0 голосов
/ 13 апреля 2019

У вас есть некоторые синтаксические ошибки здесь. Во-первых, вы не можете просто набрать function odo и позволить MATLAB угадать, что он должен здесь делать. Во-вторых, вы вызываете t и x дважды в выражениях решателя. Будьте последовательны, вызовите функцию в ode solver следующим образом:

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 являются зависящими от времени значениями, поэтому их необходимо пересчитывать на каждом шаге решателя. Вы должны поместить его в функцию решения.

...