Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+1

Код из матлаба

Не могу понять почему выдает ошибку в коде и не строит графики, помогите пожалуйста понять
% Принцип максимума. Пример к л. р. №4
clc; clear
syms u x1 x2 psi1 psi2
%% Исходные данные
f1=x2+5*u;
f2=-1+u;
a=1; a1=-a; a2=a;
T=3.5;
%% Решение
% Гамильтониан
H=psi1*f1+psi2*f2
% Уравнения Эйлера-Лагранжа
eq3=-diff(H,x1)
eq4=-diff(H,x2)
e3=['Dpsi1=' char(eq3)];
e4=['Dpsi2=' char(eq4)];
r=dsolve(e3,e4);
psi1=r.psi1
psi2=r.psi2
% Выражаем u из принципа максимума вручную
%% часть 1
u=a1;
eq1=subs(f1); % и подставим в f1 и f2
eq2=subs(f2);
% Сформируем систему уравнений в строковом виде
e1=['Dx1=' char(eq1)];
e2=['Dx2=' char(eq2)];
% Выведем уравнения на экран
fprintf('1-й участок. Система уравнений движения: \n%s\n%s\n',e1,e2);
% Решение системы 2х уравнений
result=dsolve(e1,e2,'x1(0)=10','x2(0)=10');
x11=result.x1;
x21=result.x2;
fprintf('Решение: x11 = %s; x21 = %s\n',char(x11),char(x21));
%% часть 2
u=a2;
eq1=subs(f1); % и подставим в f1 и f2
eq2=subs(f2);
% Сформируем систему уравнений в строковом виде
e1=['Dx1=' char(eq1)];
e2=['Dx2=' char(eq2)];
% Выведем уравнения на экран
fprintf('2-й участок. Система уравнений движения: \n%s\n%s\n',e1,e2);
% Решение системы 4х уравнений
result=dsolve(e1,e2,'x2(3.5)=0');
x12=result.x1;
x22=result.x2;
fprintf('Решение: x12 = %s; x22 = %s\n',char(x12),char(x22));
%% Условие неразрывности x11(t1)-x12(t1)=0
eq1=subs(x11,'t','t1')-subs(x12,'t','t1');
eq2=subs(x21,'t','t1')-subs(x22,'t','t1');
% Выведемуравнениянаэкран
fprintf('Условиенеразрывности: \n%s = 0\n%s = 0\n',char(eq1),char(eq2));
result=solve(eq1,eq2,'Real',true);
t1=eval(result.t1(1));
C1=eval(result.C1(1));
fprintf('Решение: t1 = %g; C = %g\n',t1,C1);
x11=subs(x11);
x12=subs(x12);
x21=subs(x21);
x22=subs(x22);
%вывод уравнений для отчета
x11=vpa(expand(x11),4)
x12=vpa(expand(x12),4)
x21=vpa(expand(x21),4)
x22=vpa(expand(x22),4)
%% Ответ
fprintf('Ответ: \nx11 = %s; x12 = %s\n',char(x11),char(x12));
fprintf('x21 = %s; x22 = %s\n',char(x21),char(x22));
fprintf('Точка переключения: t1 = %g с\n',t1);
%% Графики
% участок 1
tt1=[0:0.01:t1]; n1=length(tt1); xx11(n1)=0; xx21(n1)=0; uu1(n1)=0;
for i=1:n1
t=tt1(i);
xx11(i)=subs(x11);
xx21(i)=subs(x21);
uu1(i)=a1;
end
% участок 2
tt2=[t1:0.01:T]; n2=length(tt2); xx12(n2)=0;xx22(n2)=0; uu2(n2)=0;
for i=1:n2
t=tt2(i);
xx12(i)=subs(x12);
xx22(i)=subs(x22);
uu2(i)=a2;
end
figure(1);
subplot(3,1,2); plot(tt1,xx11,'b',tt2,xx12,'b','LineWidth',2); grid on; xlabel('t, с'); ylabel('x_1*');
subplot(3,1,3); plot(tt1,xx21,'b',tt2,xx22,'b','LineWidth',2); grid on; xlabel('t, с'); ylabel('x_2*');
subplot(3,1,1); plot(tt1,uu1,'b',tt2,uu2,'b','LineWidth',2); grid on; xlabel('t, с'); ylabel('u*');

Ошибка вот такая как на фото

По дате
По рейтингу
Аватар пользователя
Мастер

Я не особо шарю, что ты тут хочешь сделать, т. к. в школе шаурмы матлаб не преподавали. Но очевидно, что когда ты задаешь массив tt2, у тебя t1 больше T, а шаг положительный. Кстати, значение переменных можно смотреть окне workspace.