Форум программистов, компьютерный форум, киберфорум
Наши страницы

Matlab

Войти
Регистрация
Восстановить пароль
 
Dmitriy010194
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2
#1

Пошаговое решение системы дифференциальных уравнений, с использование постоянно меняющихся условий и - Matlab

06.12.2016, 21:58. Просмотров 168. Ответов 2
Метки нет (Все метки)

Добрый вечер!! Возникла следующая проблема: имеется процедура написанная на Pascal Object (Delphi) для реализации интегрирования системы ДУ. Данную процедуру необходимо реализовать в МАТЛАБ с помощью функции (в чем возникли определенные сложности, в связи с отсутствием меток в матлаб). Код Delphi и матлаб приложены




procedure merson
(var x,xend :typereal; {начало и конец интегрирования}
var y :TipMass; {массив решений, он же входные начальные условия}
neqn :integer; {количество уравнений }
var acc,h,hmin:typereal; {относительная ошибка, максимальный и минимальный шаг}
var jtest :integer; {параметр контроля}
var ok :boolean; {вход-true,нормальный выход-true}
diff :extproce); {вложенная процедура, собственно система ДУ}
label 86,8,50,12,28,60,40,2,80,84,337;
const rzero=1e-13;
var nn,k,itest,iswh,n:integer;
s,z,zend,bcc,zmin,hsv,cof,ht:typereal;
w,yz,f,a,b:TipMass;
begin
n:=neqn;
if n > Maxeq then goto 86;
ok:=true; nn:=n;
for k:=1 to nn do w[k]:=y[k];
z:=x;
zend:=xend;
bcc:=acc;
zmin:=hmin;
itest:=jtest;
s:=h;
iswh:=0;
2:hsv:=s;
cof:=zend-z;
if abs(s) < abs(cof) then goto 8;
s:=cof;
if abs(cof/hsv) < rzero then goto 50;
iswh:=1;
8:for k:=1 to nn do yz[k]:=w[k];
12:ht:=0.33333333333*s;
diff(z,w,f);
z:=z+ht;
for k:=1 to nn do
begin
a[k]:=ht*f[k];
w[k]:=a[k]+yz[k]
end;
diff(z,w,f);
for k:=1 to nn do
begin
a[k]:=0.5*a[k];
w[k]:=0.5*ht*f[k]+a[k]+yz[k]
end;
diff(z,w,f);
z:=z+0.5*ht;
for k:=1 to nn do
begin
b[k]:=4.5*ht*f[k];
w[k]:=0.25*b[k]+0.75*a[k]+yz[k]
end;
diff(z,w,f);
z:=z+0.5*s;
for k:=1 to nn do
begin
a[k]:=2.0*ht*f[k]+a[k];
w[k]:=3.0*a[k]-b[k]+yz[k]
end;
diff(z,w,f);
for k:=1 to nn do
begin
b[k]:=-0.5*ht*f[k]-b[k]+2.0*a[k];
w[k]:=w[k]-b[k];
a[k]:=abs(5.0*bcc*w[k]);
b[k]:=abs(b[k]);
if abs(w[k]) <= rzero then goto 28;
if b[k] > a[k] then goto 60
end;
28:if iswh = 1 then goto 50;
40:for k:=1 to nn do if b[k] > 0.03125*a[k] then goto 2;
s:=s+s;
goto 2;
50:h:=hsv;
x:=z;
for k:=1 to nn do y[k]:=w[k];
goto 337;{выход}
60:cof:=0.5*s;
if abs(cof) >= zmin then goto 80;
if itest = 0 then goto 84;
s:=zmin;
if hsv < 0.0 then s:=-s;
if iswh =1 then goto 50;
goto 2;
80:for k:=1 to nn do w[k]:=yz[k];
z:=z-s;
s:=cof;
iswh:=0;
goto 2;
84:writeln ('procedure MERSON error***',itest,
'hh=',s,
'hhmin=',zmin,
'hx=',z);

ok:=false;
goto 50;
86:writeln('procedure MERSON error ,4h n=',n);
337:end; {end MERSON}




Вот то что натворил в матлабе:
function y1= merson(x,xend,y,neqn,acc,h,hmin,jtest,ok,diff)
rzero=1e-13;
n=neqn;
Maxeq=50;
if n>Maxeq
disp('Merson error n=');
disp(n);
return;
end
ok=true;
nn=n;
w=y;
z=x;
zend=xend;
bcc=acc;
zmin=hmin;
itest=jtest;
s=h;
iswh=0;
%метка 2
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end

switch logic
case 1
if iswh==1
h=hsv;
x=z;
y1=w;
return;
else
for k=1:nn
if b(k)>0.03125*a(k)
logic1=1;
break;
else
logic1=2
end
end
end
switch logic1
%перейти на метку 2
case 1
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8;
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end
case 2
s=s+s;
%перейти на метку 2
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8;
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end
end
case 2
cof=0.5*s;
if abs(cof)>=zmin
w=yz;
z=z-s;
s=cof;
iswh=0;
%перейти на метку 2
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8;
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end
else
if itest==0
disp('merson error');
ok=false;
h=hsv;
x=z;
y1=w;
return;
else
s=zmin;
if hsv<0
s=-s;
end
if iswh==1
h=hsv;
x=z;
y1=w;
else
%перейти на метку 2
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8;
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end
end



end
end
case 3
if iswh==1
h=hsv;
x=z;
y1=w;
return;
else
for k=1:nn
if b(k)>0.03125*a(k)
logic1=1;
break;
else
logic1=2;
end
end
end
switch logic1
%перейти на метку 2
case 1
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8;
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end
case 2
s=s+s;
%перейти на метку 2
hvs=s;
cof=zend-z;
if abs(s)<abs(cof) %переход на метку 8
logic=metka8;
else
s=cof;
if abs(cof/hsv)<rzero
h=hsv;
x=z;
y1=w;
return;
else
iswh=1;
logic=metka8;
end
end
end
end

function logic = metka8% метка 8
yz=w;
ht=0.3333333333*s;
f=diff(z,w);
z=z+ht;
a=ht*f;
w=a+yz;
f=diff(z,w);
a=0.5*a;
w=0.5*ht*f+a+yz;
f=diff(z,w);
z=z+0.5*ht;
b=4.5*ht*f;
w=0.25*b+0.75*a+yz;
f=diff(z,w);
z=z+0.5*s;
a=2*ht*f+a;
w=3*a-b+yz;
f=diff(z,w);
for k=1:nn
b(k)=-0.5*ht*f(k)-b(k)+2*a(k);
w(k)=w(k)-b(k);
a(k)=abs(5*bcc*w(k));
b(k)=abs(b(k));
if abs(w(k))<=rzero
logic=1;
break;
elseif b(k)>a(k)
logic=2;
break;
else logic=3;
end
end
end

end

Добавлено через 1 минуту
Большая просьба указать на ошибки и помочь добиться конечного результата

Добавлено через 34 минуты
Если что то не корректно написано в плане читаемости кода могу вложить файлы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2016, 21:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Пошаговое решение системы дифференциальных уравнений, с использование постоянно меняющихся условий и (Matlab):

Решение системы дифференциальных уравнений - Matlab
Помогите, пожалуйста, решить данные системы дифференциальных уравнений в матлабе. Буду премного благодарна.

Решение системы дифференциальных уравнений - Matlab
Вот код: function dy = dvig(t,y) dy = zeros(4,1); % вектор колонка с нулевыми элементами ...

Решение системы дифференциальных уравнений - Matlab
Помогите, пожалуйста, с системой дифференциальных уравнений и построением графиков: ...

Решение системы дифференциальных уравнений - Matlab
В этой системе второй день.Помогите пожалуйста найти числовые значения системы(W5,W6,W7,W8). artel.m function x= artel(t,x) %y(1)=W5 ...

Решение системы дифференциальных уравнений - Matlab
Возможно ли такое решить в Matlab: \begin{cases} &amp; \text{ } \ddot{y}=-y+x-\dot{y}+\dot{x} \\ &amp; \text{ }...

Решение системы дифференциальных уравнений - Matlab
Доброго времени суто. Помогите пожалуйста решить систему \begin{cases} &amp; \text{ } dh=-g*t-a*G/k \\ &amp; \text{ } dG= ...

2
Centurio
Модератор
711 / 640 / 184
Регистрация: 13.09.2015
Сообщений: 2,308
06.12.2016, 22:07 #2
Dmitriy010194, как эта процедура интегрирования выглядит в математических формулах? Буквально переводить на Матлаб - занятие, так сказать, несерьёзное...
0
Dmitriy010194
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 2
06.12.2016, 22:33  [ТС] #3
Если я не ошибаюсь то это метод Рунгу_Кутта 2 порядка
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2016, 22:33
Привет! Вот еще темы с ответами:

Решение системы дифференциальных уравнений - Matlab
Всем Доброго времени суток. Нужна помощь в решении системы методом Рунге-Кутта в среде матлаб. Подскажите пожалуйста как можно записать...

Решение системы дифференциальных уравнений - Matlab
Добрый день! Понадобилось решить вот такую систему диф.уравнений: \begin{cases} &amp; \text{} \dot{x}-x-2y=t \\ &amp; \text{}...

Решение системы дифференциальных уравнений - Matlab
Собственно дана система диф. уравнений и дан решатель ОДУ. но при решении график выдает в форме прямой. а надо сделать в форме кривых...

Решение системы дифференциальных уравнений в MATLAB - Matlab
Всем привет. Помогите решить задачу... a,b константы (нужно чтобы их можно было менять). Заранее спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru