Циклы и последовательности

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

Модератор: Admin

Skandalli
Сообщения: 20
Зарегистрирован: Сб май 01, 2010 4:05 pm

Циклы и последовательности

Сообщение Skandalli » Вс май 26, 2013 8:55 pm

Снова я. Здравствуйт! И вновь вопрос от "чайника".
Предположим, я вычисляю по формуле
ряд значений с шагом 3. Это можно оформить через for:

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

for x from 1 by 2 to 5
do
var1:=x^n;
end do;

На выходе я буду иметь
x^1
x^3
x^5
....
1) Этот вывод - это же последовательность, правильно?
2)
Если бы я строил руками, то можно было бы сделать так:
x := Vector([1,3,5,7]);
y := Vector([x^1, x^3, x^5]);
DiscretePlot(x, y, style = stem)

Но хочется какого-то упрощения, и возникает вопрос, как лучше и грамотнее это сделать?
возможно ли сделать вывод var1 не последовательностью, а как-то по-другому? Запихать var1 в вектор, что ли. И n тоже запихать в вектор.
Как-то кажется, что для каждого вектора надо делать 2 вложенных цикла?
Поправьте, пожалуйста.

teolog
Сообщения: 111
Зарегистрирован: Вс янв 22, 2012 8:41 pm

Re: Циклы и последовательности

Сообщение teolog » Пн май 27, 2013 11:35 am

Skandalli писал(а):for x from 1 by 2 to 5
do
var1:=x^n;
end do;[/code]
На выходе я буду иметь
x^1
x^3
x^5

Во-первых: на выходе вы будете иметь 1^n, 3^n, 5^n ...
Во-вторых можете написать x:=Vector([seq(i, i=1..9,2)]); y:=Vector([seq(x^i, i=1..9,2)]);
Поясните что вы имеете ввиду по поводу построения? хотите ли вы чтобы по оси x откладывались числа 1, 3, 5, 7, ..., а по оси y откладывались значения 1^1, 3^3, 5^5 и т.д. ?

teolog
Сообщения: 111
Зарегистрирован: Вс янв 22, 2012 8:41 pm

Сообщение teolog » Пн май 27, 2013 11:58 am

То как я понимаю ваш пример:
with(DynamicSystems):
x1:=[seq(i,i=1..9,2)];
y1:=[seq(i^i,i=1..9,2)];
DiscretePlot(x1,y1,style=stem);

или
num:=21;
x2:=Vector([seq(i,i=1..num,2)]);
y2:=Vector([seq(i^i,i=1..num,2)]);
DiscretePlot(x2,y2,style=stem);

Skandalli
Сообщения: 20
Зарегистрирован: Сб май 01, 2010 4:05 pm

Re: Циклы и последовательности

Сообщение Skandalli » Пн май 27, 2013 10:56 pm

Строго говоря, я хочу понять, в цикле
я могу получить ряд значений

var_n=f(n)
где n меняется от a до b;
Если я запущу цикл у меня будет

var_n=f(a)
.....
var_n=f(b)

var_n будет перезаписываться на каждой итерации. А можно как-то все значения var_n убрать в вектор, куда-то еще?
что бы в дальнейшем оперировать только вектором? строить график, например, по нему. Или я вообще неправильно подхожу к проблеме?

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

Re: Циклы и последовательности

Сообщение Kitonum » Вт май 28, 2013 12:45 am

Skandalli писал(а):... А можно как-то все значения var_n убрать в вектор, куда-то еще?
что бы в дальнейшем оперировать только вектором? строить график, например, по нему...

Конечно, можно!

Два варианта решения проблемы:

1) Если для последовательности тех объектов, которые Вы строите, есть явная функция от номера каждого объекта в этой последовательности, то проще всего использовать не циклы, а команду seq.
Например, построить десяти мерный вектор, элементы которого являются последовательными квадратами натуральных чисел, проще всего так:

<seq(n^2, n=1..10)>;
Изображение

2) Если же такая простая формула неизвестна, то используется перебор в цикле, обычно с некоторым условием, определяющим Ваши объекты.
Например, нужно построить список 10 первых простых чисел, оканчивающихся на 1.

n:=0: L:=[]:
for k from 2 while n<10 do
if isprime(k) and irem(k, 10)=1 then L:=[op(L), k]: n:=n+1: fi:
od:
L;


[11, 31, 41, 61, 71, 101, 131, 151, 181, 191]

Пояснение к коду. Переменная n называется счётчиком и позволяет контролировать число шагов. Вначале создаём пустой список L , а затем на каждом шаге добавляем в него нужный нам объект.

Более сложный пример, требующий вложенных циклов. Нужно составить список 10 первых пифагоровых троек, упорядоченных по возрастанию гипотенузы. Если у двух треугольников гипотенузы равные, то упорядочиваем по возрастанию меньшего катета.

n:=0: L:=[]:
for c while n<10 do
for a to c-2 do
for b from a+1 to c-1 do
if a^2+b^2=c^2 then L:=[op(L), [a,b,c]]: n:=n+1: fi:
od: od: od:
L;


[[3, 4, 5], [6, 8, 10], [5, 12, 13], [9, 12, 15], [8, 15, 17], [12, 16, 20], [7, 24, 25], [15, 20, 25], [10, 24, 26], [20, 21, 29]]

teolog
Сообщения: 111
Зарегистрирован: Вс янв 22, 2012 8:41 pm

Re: Циклы и последовательности

Сообщение teolog » Вт май 28, 2013 2:35 am

Skandalli писал(а):Или я вообще неправильно подхожу к проблеме?

К проблеме вы подходите может быть и правильно, пытаясь избавиться от циклов, но постановка задачи у вас несколько расплывчатая. Дайте немножко больше исходных данных или конкретизируйте их. Как говорится не меньше необходимого, но не больше достаточного. В простом случае иногда можно обойтись без циклов, в сложном - скорее всего не получится.

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Вт май 28, 2013 4:38 pm

Kitonum, ваша процедура для троек Пифагора восхищает.
Просто класс! Не могли бы вы подсказать нечто подобное для треугольников Герона? Условием является целочисленность выражения (P*(P-a)*(P-b)*(P-c))^.5. где Р - полупериметр.

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

Сообщение Kitonum » Ср май 29, 2013 7:02 am

berg писал(а):...Не могли бы вы подсказать нечто подобное для треугольников Герона? Условием является целочисленность выражения (P*(P-a)*(P-b)*(P-c))^.5. где Р - полупериметр.

Решается аналогично. Вот первая десятка таких треугольников:

n:=0: L:=[]:
for c while n<10 do
for a to c do
for b from a to c do
p:=(a+b+c)/2:
if a+b>c and a+c>b and b+c>a and type(sqrt(p*(p-a)*(p-b)*(p-c)), integer) then L:=[op(L), [a,b,c]]: n:=n+1: fi:
od: od: od:
L;


[[3, 4, 5], [5, 5, 6], [5, 5, 8], [6, 8, 10], [10, 10, 12], [5, 12, 13], [10, 13, 13], [4, 13, 15], [9, 12, 15], [13, 14, 15]]

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

Список и массив

Сообщение Markiyan Hirnyk » Ср май 29, 2013 7:31 am

Лучше создавать массив, чем список. Это на порядок быстрее и экономнее: вопрос обсуждался на MaplePrimes. Массив можно потом преобразовать в список.

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

Re: Список и массив

Сообщение Kitonum » Ср май 29, 2013 7:52 am

Markiyan Hirnyk писал(а):Лучше создавать массив, чем список. Это на порядок быстрее и экономнее: вопрос обсуждался на MaplePrimes. Массив можно потом преобразовать в список.

Пожалуйста, дайте ссылку.

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

Re: Список и массив

Сообщение Markiyan Hirnyk » Ср май 29, 2013 8:32 am

Kitonum писал(а):
Markiyan Hirnyk писал(а):Лучше создавать массив, чем список. Это на порядок быстрее и экономнее: вопрос обсуждался на MaplePrimes. Массив можно потом преобразовать в список.

Пожалуйста, дайте ссылку.

Затрудняюсь, т. к. это было не отдельным вопросом, а замечанием.

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Ср май 29, 2013 1:19 pm

Спасибо, Kitonum! Я пытался ввести в процедуру условие igcd(a,b,c)=1, чтобы исключить подобные треугольники, но не получается. Как это можно сделать?

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Ср май 29, 2013 3:13 pm

Извиняюсь, все получилось. Еще раз спасибо.

Skandalli
Сообщения: 20
Зарегистрирован: Сб май 01, 2010 4:05 pm

Re: Циклы и последовательности

Сообщение Skandalli » Ср май 29, 2013 4:01 pm

teolog писал(а):Дайте немножко больше исходных данных или конкретизируйте их.

Вот то, что я делал. Да, это очень грубо, и неправильно. Теперь хочу упростить скрипт, чтобы было удобно строить более сложные конструкции...

teolog
Сообщения: 111
Зарегистрирован: Вс янв 22, 2012 8:41 pm

Сообщение teolog » Ср май 29, 2013 5:51 pm

Skandalli, по поводу представленного кода хотел бы заметить следующее: T/t*(sin(Pi*T/t)/(Pi*T/t)) равнозначно sin(Pi*T/t)/Pi. Зачем вводить сокращаемую конструкцию?
А так, этот же ваш код можно написать например следующим образом:
restart;
with(DynamicSystems);
t := 0.001;
T:=t/2;
x:=Vector([seq(i,i=1..7)]);
y:=Vector([evalf(seq(T/t*sin(Pi*i*T/t)/(Pi*i*T/t),i=1..7))]);
DiscretePlot(x, y, style = stem, color = "Black");


или

restart;
with(DynamicSystems);
t := 0.001;
T:=t/2;
num:=7;
x:=Vector([seq(i,i=1..num)]);
y:=Vector([evalf(seq(T/t*sin(Pi*i*T/t)/(Pi*i*T/t),i=1..num))]);
DiscretePlot(x, y, style = stem, color = "Black");