Всем привет надо запрограммировать Bungee Jump, тоесть прыжок с верёвкой.
Работаем с "ODE Solver".
естъ две ODE между которыми матлаб переключается. Тоесть 2 случая когда верёвка натянутая и не натянутая. (переключается на метке 50 метров)
вот functions (тут всё правильно)
верёвка не натянута
- function dz = dgl1(t,z)
global m c h l g
x=z(1); %x
dx=z(2); %dx
Fl=z(2)+z(2)^2*sign(z(2));
ddx=-g-Fl/m; %ddx
dz=[dx;ddx];
% z=[z1;z2]=[x;dx]
% dz=[dx;ddx] = [dx; -g-Fl/m]
верёвка натянута
- function dz = dgl2(t,z)
global m c h l g
x=z(1);
dx=z(2);
Fl=z(2)+z(2)^2*sign(z(2));
ddx=-g-Fl/m+c*(h-l-x)/m;
dz=[dx;ddx];
переключатель для первой function
- function [q,isterminal,direction]=seilngesp(t,z)
global m c h l g
q=z(1)-l; % x<50
isterminal=1; % Integration abbrechen, wenn q durch 0
direction=-1; % Nur sinkende Nullstellen erkennen
переключатель для 2 function (верёвка натянута)
- function [q,isterminal,direction]=seilgesp(t,z)
global m c h l g
q=z(1)-l; % x>=50
isterminal=1; % Integration abbrechen, wenn q durch 0
direction=1; % Nur sinkende Nullstellen erkennen
а вот теперь скрипт для решения. тут проблема в петле
- % Initialisieren c=[10 25 35 45 55 70 100 200 300
% h=80m l=30m
clear;
global m c h l g
m=84; h=80; l=30; c=300; g=9.81;
tstart=0; tmax=120;
xstart=[0;0];
tges=[]; xges=[];
s=0; % Schleifenzähler
% Seil gespannt bei dgl1
% Seil nicht gespannt bei dgl2
options1=odeset('Events',@seilgesp,'Refine',1,'Max Step',2);
options2=odeset('Events',@seilngesp,'Refine',1,'Ma xStep',2);
% Berechnen in Schleife
tic
while s==0 || tges(end)<tmax
s=s+1;
[t1,x1]=ode45(@dgl1,[tstart tmax],xstart,options1);
в это месте проблема
% ПЕРЕХОД на вторую ODE как замутить??? Петля нужна вобще??
[t2,x2]=ode45(@dgl2,[t1(end) tmax],x1(end,: ),options2);
tstart=t2(end);
xstart=x2(end,: );
tges=[tges;t1;t2];
xges=[xges;x1;x2];
end
toc;