Разрешение ODE в Matlab

Я пытаюсь создать программу для решения следующей системы с ode23:

2y’ + z’–y + 2z = 0
y’ + 3z’ –3y +z = 0

с начальными значениями:

y(0) = 1
z(0) = 0

и аналитическое решение:

y = cos (x)
z = sin (x)

но когда я меняю переменную 4:

function dy = eqdif2(t,y)
%2y’ + z’ –y + 2z = 0;
%y’ + 3z’ –3y +z = 0
% y(0) = 1, Z(0) = 0
% y=y(1), z=y(2), y'=y(3), z'=y(4)
dy = [-2*y(3)+y(1)-2*y(2);3*y(1)-y(2)-3*y(4)];

У меня проблема с ode23, сообщаю только о 2 решениях:

clc,clear;
yp = [1 0];  %initial values
options = odeset('RelTol', 1e-4);
[t,y]= ode23('eqdif2',[0 20],yp,options); 
ya=cos(x);
za=sin(x);
figure;
plot(t,y(:,1),'-');
figure;
plot(t,ya,t,za);

person user243380    schedule 26.05.2015    source источник
comment
Что вы подразумеваете под сообщением только о 2 решении? y и dy - 2 на 1, но вы по какой-то причине пытаетесь проиндексировать в y(3) и y(4). Я предполагаю, что ваш код выдает ошибку? Если да, укажите это в вопросе. У вас есть два ODE первого порядка. Вам нужно будет их разъединить. Вектор состояния составляет всего 2 на 1. Также отформатируйте свой вопрос. Я уже один раз убирал.   -  person horchler    schedule 27.05.2015
comment
Да, я не понимаю, как сделать только с y (1) и y (2), но это причина использовать y (3) и y (4), но не найденная ошибка   -  person user243380    schedule 27.05.2015
comment
привет, на данный момент мне никто не отвечает, если вы можете мне помочь, я буду великолепен @hypfco   -  person user243380    schedule 27.05.2015


Ответы (1)


Вот так...

ОДУ линейны, мы это знаем, есть алгебраическое решение и так далее. Для использования ode23 необходим набор explicit, на форме - ps. обратите внимание на использование векторной формы для зависимой переменной x и независимой переменной t в дальнейшем:

x'=f(t,x)

Что в данном случае сводится к тривиальному, но бесполезному набору:

x(1)' = x(2) x(2)' = -x(1)

Это решается как:

f=@(t,x)([-x(2);x(1)]);
y0=[1 0];
% f(0,y0) %Check IC = y'
[t, x] = ode23(f,[0 pi*2],y0);
plot(t,x)

введите описание изображения здесьОднако, если нам нужно или хотим или мы вынуждены решить непосредственно система как есть -ie implicit-, у нас должен быть набор, определенный как - опять же, g может быть вектором уравнений:

g(t,x,x')=0

используя ode15i - i, обозначающий "неявный":

g=@(t,x,dx)([ 2*dx(1)+dx(2)-x(1)+2*x(2); ...
    dx(1)+3*dx(2)-3*x(1)+x(2)]);
y0=[1;0];
dy0=[0;1]; % kind of magic to find...
% g(0,y0,dy0) %Check IC = 0
[t, x] = ode15i(g, [0 pi*2],y0,dy0);
plot(t,x)

Решение одинаково для обоих вариантов ...

person Brethlosze    schedule 27.05.2015
comment
если возможно, у меня есть еще одна подсказка, если начальное условие изменится на y (pi) = 1 z (pi) = 0, я должен что-то изменить? @hypfco Большое спасибо - person user243380; 27.05.2015
comment
Я предполагаю, что изменение не влияет на начальное значение y0 = [1 0] (но это не нормально, для вашего комментария), и я не знаю, как настроить отображение, @hypfco - person user243380; 27.05.2015