Построение графика по координатам из цикла

Форум пользователей пакета Maple

Модератор: Admin

BlackDragon
Сообщения: 10
Зарегистрирован: Пн фев 24, 2014 7:58 pm

Построение графика по координатам из цикла

Сообщение BlackDragon » Пн фев 24, 2014 8:11 pm

Добрый день! Я только начал изучать Maple и столкнулся с такой проблемой. У меня есть система из 3 дифференциальных уравнений. Она решается численно и в результате решения получаем значения трех переменных,зависящих от параметра s: x(s), y(s), fi(s). Эти значения получаем в цикле for s from 0 by 0.1 to 1 do P(s) end do, где P := dsolve({cond, sys}, fcns, numeric). Мне нужно нарисовать график по точкам x(s), y(s). Результат решения системы привожу ниже
Изображение

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Пн фев 24, 2014 8:30 pm

По полученным данным сформируйте список cписков
L:=[[x1,y1], [x2,y2], ..., [x11,y11]] , a затем стройте командой plot(L);

Если не знаете как это сделать - загрузите текст (не картинку) своего кода.

Другой способ - использовать команду plots[odeplot]

BlackDragon
Сообщения: 10
Зарегистрирован: Пн фев 24, 2014 7:58 pm

Сообщение BlackDragon » Пн фев 24, 2014 9:06 pm

Как раз с формированием подобного списка я и не могу разобраться

Код:

sys :=
diff(x(s), s) = cos(fi(s)),
diff(y(s), s) = sin(fi(s)),
diff(fi(s), s) = 5-x(s);
cond := x(0) = 0, y(0) = 0, fi(0) = 0;
fcns := {x(s), y(s), fi(s)};
P := dsolve({cond, sys}, fcns, numeric);

for i from 0 by 0.1 to 1 do
P(i)
end do;

Markiyan Hirnyk
Сообщения: 1366
Зарегистрирован: Вс дек 04, 2011 11:07 pm

output=Array

Сообщение Markiyan Hirnyk » Пн фев 24, 2014 9:59 pm

Примените
P := dsolve({cond, sys}, fcns, numeric, output = Array([seq(s, s = 0 .. 1, .1)]))
и
plots:-odeplot(P, [s, x(s)])

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Пн фев 24, 2014 10:12 pm

Два способа.

1) По точкам как в Вашем коде. Я только увеличил число точек для лучшего качества:

sys :=
diff(x(s), s) = cos(phi(s)),
diff(y(s), s) = sin(phi(s)),
diff(phi(s), s) = 5-x(s):
cond := x(0) = 0, y(0) = 0, phi(0) = 0:
fcns := {x(s), y(s), phi(s)}:
P := dsolve({cond, sys}, fcns, numeric):
L1:=[]: L2:=[]:
for i from 0 by 0.01 to 1 do
L1:=[op(L1),[i,rhs(P(i)[3])]]: L2:= [op(L2),[i,rhs(P(i)[4])]]:
end do:
plots[display](plot(L1, color=red, thickness=2), plot(L2, color=blue, thickness=2));


2) С помощью plots[odeplot]:

sys :=
diff(x(s), s) = cos(phi(s)),
diff(y(s), s) = sin(phi(s)),
diff(phi(s), s) = 5-x(s):
cond := x(0) = 0, y(0) = 0, phi(0) = 0:
fcns := {x(s), y(s), phi(s)}:
P := dsolve({cond, sys}, fcns, numeric):
plots[odeplot](P, [[s,x(s)],[s,y(s)]], s=0..1, color=[red,blue], thickness=2, numpoints=1000);


Конечно, второй способ проще в реализации.

BlackDragon
Сообщения: 10
Зарегистрирован: Пн фев 24, 2014 7:58 pm

Сообщение BlackDragon » Вт фев 25, 2014 7:57 am

Спасибо за ответы! Но у меня стоит немного другая задача (если я не ошибаюсь и правильно понял Ваши коды). Мне надо нарисовать не два отдельных графика x(s) и y(s). Мне нужен график зависимости y(s) от x(s). Т.е. по оси абсцисс должна быть не переменная s, a x(s), а по оси ординат y(s). Мне нужно получить точки с координатами [x(s),y(s)] и по ним уже построить график.

Markiyan Hirnyk
Сообщения: 1366
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re

Сообщение Markiyan Hirnyk » Вт фев 25, 2014 8:26 am

BlackDragon писал(а):Спасибо за ответы! Но у меня стоит немного другая задача (если я не ошибаюсь и правильно понял Ваши коды). Мне надо нарисовать не два отдельных графика x(s) и y(s). Мне нужен график зависимости y(s) от x(s). Т.е. по оси абсцисс должна быть не переменная s, a x(s), а по оси ординат y(s). Мне нужно получить точки с координатами [x(s),y(s)] и по ним уже построить график.
Тогда
plots:-odeplot(P, [x(s),y(s)]).
См. справку http://www.maplesoft.com/support/help/M ... ts/odeplot

BlackDragon
Сообщения: 10
Зарегистрирован: Пн фев 24, 2014 7:58 pm

Сообщение BlackDragon » Вт фев 25, 2014 4:07 pm

Спасибо большое! Наконец то разобрался c этим моментом.

Правда задачка сейчас усложнилась. В систему введен еще один параметр F, который задается циклом, т.е. в итоге получается цикл в цикле. При каждом значении параметра F я получаю график зависимости [x(s),y(s)]. А можно ли в конце свести все эти графики на 1 лист? Т.е. получить набор кривых зависимостей [x(s),y(s)] при различных значениях параметра F на одном графике.

Код:
F :=k ;
sys :=
diff(x(s), s) = F*cos(fi(s)),
diff(y(s), s) = F*sin(fi(s)),
diff(fi(s), s) = (5-x(s))*F;
cond := x(0) = 0, y(0) = 0, fi(0) = 0;
fcns := {x(s), y(s), fi(s)};
P := dsolve({cond, sys}, fcns, numeric);

printlevel := 2;
for k from 50 by 50 to 200 do
F;
for i from 0 by .1 to 1 do
P(i)
end do;
plots[odeplot](P, [x(s), y(s)], s = 0 .. 1)
end do

Markiyan Hirnyk
Сообщения: 1366
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Сообщение Markiyan Hirnyk » Вт фев 25, 2014 7:43 pm

Как Вам это?
restart;sys :=
diff(x(s), s) = F*cos(fi(s)),
diff(y(s), s) = F*sin(fi(s)),
diff(fi(s), s) = (5-x(s))*F;
cond := x(0) = 0, y(0) = 0, fi(0) = 0;
fcns := {fi(s), x(s), y(s)};
P := dsolve({cond, sys}, fcns, numeric, parameters = [F]);
for k from 50 by 50 to 200 do P(parameters = [k]); plots[odeplot](P, [x(s), y(s)], s = 0 .. 1) end do;

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Вт фев 25, 2014 8:25 pm

Код: Выделить всё

 ...
for k from 50 by 50 to 200 do P(parameters = [k]); plots[odeplot](P, [fi(s), x(s), y(s)], s = 0 .. 1) end do;

BlackDragon
Сообщения: 10
Зарегистрирован: Пн фев 24, 2014 7:58 pm

Сообщение BlackDragon » Ср фев 26, 2014 10:14 am

Спасибо за ответы! Постараюсь разобраться