Математические модели в естественнонаучном образовании
Шрифт:
disp ('чтобы задать границы изображения на графике:')
limits=input('(По умолчанию [pmin pmax]=[0 20]) [pmin pmax]= ');
if isempty(limits) limits=[0 20]; end;
pinc=(limits(2)-limits(1))/50;
x=limits(1):pinc:limits(2);
%
p=limits(1); y=eval (next_p);
for i=x(2):pinc:limits(2); % цикл для создания вектора значений P
p=i;
p=eval (next_p);
y=[y p];
end;
%
figure %
plot(x,y,x,x)
axis([limits(1),limits(2),limits(1),limits(2)]);
xlabel ('P_t');
ylabel ('P_{t+1}');
title (['следующее\_p=',next_p]);
%
continueb=1; % логическое значение продолжения цикла
while continueb % цикл пока кнопку не нажали
[p,q,button]=ginput(1); % получить начальную численность
if button==1
%
plot (x,y,x,x); % построение графика
axis([limits(1),limits(2),limits(1),limits(2)]);
hold on
xlabel ('P_t');
ylabel ('P_{t+1}');
title (['следующее\_p=',next_p]);
%
for i=1:50; % цикл построения секций паутины
w=p;
p=eval (next_p);
plot([w,w],[w,p],'k','EraseMode','none'); % рисуем вертикальный фрагмент
pause(.1);
if p<0; break; end; % фильтрация отрицательных значений P
plot([w,p],[p,p],'k','EraseMode','none'); % рисуем горизонтальный фрагмент
pause(.1);
end;
hold off;
else continueb=0; % конец цикла
end
end
%
% cobweb2.m
%
% Паутинная диаграмма для моделирования одной популяции разностным уравнением.
%
% У пользователя запрашивается уравнение, определяющее модель. Затем по
% щелчку на начальной численности популяции на графике будет отображаться
% «паутина» будущих численностей популяции. Старые линии постепенно стираются
% с течением времени.
%
m=[];
s=16; % количество линий для рисования
p=0; % инициализируем начальное значение
% % численности популяции
disp (' ')
disp (' Введите формулу, определяющую модель популяции, используя "p" для')
disp ('обозначения численности: (По умолчанию: next_p = p+2.5*p*(1-p/10) ) ')
next_p=input ('next_p = ','s');
if isempty(next_p) next_p='p+2.5*p*(1-p/10)';
end;
p=eval (next_p); %
%
disp (' ')
disp ('Введите верхний и нижний пределы P в момент времени t, чтобы задать')
disp ('границы изображения графика:')
plimits=input ('(По умолчанию [pmin pmax]=[0 20]) [pmin pmax]= ');
if isempty(plimits) plimits=[0 20]; end;
%
% Формируем данные для построения модели
pinc=(plimits(2)-plimits(1))/20; % устанавливает интервал между
% % соседними значениями
h=[plimits(1):pinc:plimits(2)];
for k=1:21; % цикл создания вектора значений
p=h(k);
p=eval (next_p);
m=[m p];
end;
% начало построения нового графика с изображением функции модели и диагональной линии
figure;
hold on;
axis([plimits plimits]);
curve=plot(h,m,'Color','b');
diag=plot(h,h,'Color','g');
xlabel ('P_t');
ylabel ('P_{t+1}');
title (['следующее\_p=',next_p] );
% создаём вектор фрагментов для ступенек
stephan=ones(1,2*s);
button=1;
% получаем начальное значение численности популяции от пользователя
disp(' ')
disp(' Щелкните левой кнопкой на начальном значении или правой, чтобы выйти.')
[p,x,button]=ginput(1);
%
while(button==1)
%
x=p;
for i=1:s; % цикл для начала создания паутины
p=eval (next_p);
stephan(2*i-1)=plot([x;x],[x;p],'k','EraseMode','background');
pause(.1);
stephan(2*i)=plot([x;p],[p;p],'k','EraseMode','background');
pause(.1);
x=p;
end
%
for i=1:64; % цикл удаления первого элемента
p=eval(next_p); % вычисляем следующий член
delete(stephan(1)) % удаляем вертикальную линию
stephan(1:2*s-1)=stephan(2:2*s); % и указатель на неё
for k=1:2*s-1
set(stephan(k),'EraseMode','background');% перерисовываем линии
end;
set(curve,'Color','b'); % перерисовываем кривые
set(diag,'Color','g');
stephan(2*s)=plot([x;x],[x;p],'k','EraseMode','background');% добавляем линию
pause(.1);