Размеры входной матрицы для работы в Octave/Matlab

Я пытаюсь использовать свою собственную функцию Эйлера для решения небольших систем ОДУ с помощью обычного метода Эйлера в Octave. Я заставил его работать для матричного ввода 1x1, но я хочу использовать его и для матричного ввода 2x2.

Мой код выглядит так:

 %Euler method for an ODE system of 2x2 matrix input (equation 1) and 1x1 input (equation 2)
 function [t,x,y]=Euler(f1,f2,t0,tf,x0,y0,n)
    h=(tf-t0)/n; %Constant step size
    t=t0:h:tf;
    x=[x0 x0] ; y=[y0]; %Starting values

    for j=1:n
       keulerf1=f1(t(j),x,y); %f1=dx/dt (from first equation) % I think the problem with dimensions might be here****
       keulerf2=f2(t(j),x,y); %f2=dy/dt (from second equation)
       x=x+h*keulerf1; %Euler forward method for first variable
       y=y+h*keulerf2; %Euler forward method for second variable
       OUT=[t(j+1) x y]
    endfor
 endfunction

Пример:

 %Initial values:
 t0=0;tf=3;
 x0=10; %x(t0)
 y0=10; %y(t0)
 n=3;
 OUT_0=[t0 x0 x0 y0 y0]

 f1=@(t,x,y) [2*x 0]; %Equation 1 (arbitrary example): [dx/dt]=[2x 0]
 f2=@(t,x,y) [2*y]; %Equation 2 (arbitrary example): [dy/dt]=[2y]

 [t,x,y]=Euler(f1,f2,t0,tf,x0,y0,n)

  %It only works for f1, f2 of 1x1 size. I don't quite know why the dimensions aren't being consistent. 

Цените любые отзывы. Хорошего дня.


person Thunderboltwarrior    schedule 06.11.2019    source источник
comment
Если вы используете отладчик, вы увидите, что размер keulerf1 на первом шаге равен 1x3, который нельзя добавить к x с размером 1x2.   -  person Berger    schedule 06.11.2019
comment
пожалуйста, дайте мне знать, решило ли это ваш вопрос?   -  person Berger    schedule 06.11.2019


Ответы (1)


Если я правильно понял, вы должны использовать матричную аннотацию A * x для вашего f1

Это Эйлер:

function [t,x,y]=Euler(f1,f2,t0,tf,x0,y0,n)
    h=(tf-t0)/n; %Constant step size
    t=t0:h:tf;
    x=[x0]; % also define your two starting values better outside this function
    y=[y0]; %Starting values

    for j=1:n
       keulerf1=f1(t(j),x,y); %f1=dx/dt (from first equation)
       keulerf2=f2(t(j),x,y); %f2=dy/dt (from second equation)
       x=x+h*keulerf1; %Euler forward method for first variable
       y=y+h*keulerf2; %Euler forward method for second variable
       OUT=[t(j+1) x' y']
    endfor
 endfunction

Это будет ваша функция:

%Initial values:
 t0=0;tf=3;
 x0=[10 10]'; %x(t0)
 y0=10; %y(t0)
 n=3;
 OUT_0=[t0; x0; y0; y0]

 f1=@(t,x,y) [2 0; 0 0]*x;   %Equation 1 (arbitrary example): [dx/dt]=A*x
 f2=@(t,x,y) [2*y];          %Equation 2 (arbitrary example): [dy/dt]=[2y]

 [t,x,y]=Euler(f1,f2,t0,tf,x0,y0,n)
person Berger    schedule 06.11.2019
comment
Цените обратную связь. Но я вижу, что размер f1 не такой, как я предполагал. В идеале keulerf1 должен быть того же размера, что и f1, а также того же размера, что и x0. Это первое исправление сработало из-за того, что размерность f1=Ax привела к (2x2)*(2x1)=(2x1), и что добавление к x размерности (2x1) было возможно, верно? t, x, y должны быть переменными (возможно, символическими?), от которых зависят входные матрицы f1 и f2. Что я действительно хочу сделать, так это оценить f1 и f2 (матричные функции общих переменных t, x и y) в функции Эйлера и вернуть обновленные результаты, если это имеет смысл. - person Thunderboltwarrior; 06.11.2019