12
Руководство пользователя
×

7.5.2 Список по шаблону

 Метод создает список заданного размера, содержащий однотипные объекты, созданные указанным методом создания. Если в качестве типа объектов создаваемого списка задается список, то в результирующий список включаются все элементы (скаляры, точки и т.д.) создаваемых списков в том же порядке как они в них расположены.
Синтаксис метода создания
listT(type_flag, Method, N, criterion =…, startList=…)
Обязательные позиционные параметры метода
flag type_flag
Флаг, указывающий тип объектов создаваемого списка (за исключением type_flag = list: – в этом случае флаг не определяет тип создаваемых объектов). Для создания списка силовых элементов используется флаг forceElement:.
string Method
Строка, описывающая метод создания объектов.
Примеры строк, описывающих методы создания объектов списка:
«point(LX[~], 0[m], 0[m])»
«general( listB[~], nodePoint( LP[~+1] ), listB[~+1], LP[~+1], stifn1 )»
scalar N [-]
Размер создаваемого списка объектов (в случае type_flag = list: размер результирующего списка может не совпадать с указанным значением).
Необязательные именованные параметры метода
 criterion = string
Логическое условие для создания элементов списка. Параметр criterion не может быть задан одновременно с параметром startList.
 startList = list(obj1, …)
Список начальных элементов для рекуррентного задания списка. Тип элементов должен совпадать с типом создаваемого списка или представлять собой список с соответствующим типом элементов. Параметр startList не может быть задан одновременно с параметром criterion.
Описание
Для создания каждого элемента вызывается метод создания объектов, описанный в строке Method. Эта строка может содержать символ «~» (тильда), который при создании элемента списка заменяется индексом создаваемого элемента, т.е. при создании первого элемента символ тильда заменяется числом 1, при создании второго элемента – числом 2, и т.д.
Строка описания метода создания объектов не должна содержать в себе строк, создаваемых по месту. Для того чтобы использовать некоторую строку для создания элементов списка, необходимо предварительно создать объект типа строка с нужным значением и далее использовать имя этого объекта в строке описания метода создания.
Описание метода должно соответствовать принятому синтаксису, в противном случае выдается диагностическое сообщение о невозможности создать элемент списка.
Например:
list listS=listT( scalar:, "(~-1)*0.5[m]", 5 );
равносильно
list listS2=list( 0.5[m]*(1-1), 0.5[m]*(2-1), 0.5[m]*(3-1), 0.5[m]*(4-1), 0.5[m]*(5-1) );
Пример
//Моделирование вала набором жестких звеньев, соединенных шарнирами
//и силовыми элементами
//
scalar L "длина вала"=1 [ m ];
scalar p "показатель степени"=3;
scalar N "число элементов"=pow(2,p);
scalar n "количество точек"=N+1;
//
scalar l=L/N;
scalar ro=7800 [ kg/ m3 ];
scalar k=0.5;
//
// основные параметры
scalar r "радиус вала "=0.5 [ cm ];
scalar E "модуль упругости"=2e11 [N/m2];
scalar nu "коэффициент Пуассона"=0.3;
scalar G "модуль сдвига"=E/(2*(1+nu));
scalar damp "относительный коэффициент демпфирования"=1e-3 [s]*(p-1);
//
// расчет жесткости вала
scalar EJ_изг_вал=E*PI*r*r*r*r/4;
scalar GJ_круч_вал=G*PI*r*r*r*r/2;
scalar k_изг "жесткость изгибная отрезка"=EJ_изг_вал/(l);
scalar k_круч "жесткость крутильная отрезка"=GJ_круч_вал/(l);
stifness6x6 stifn1=diagonal( 0 [ kg/ s2 ], 0 [ kg/ s2 ], 0 [ kg/ s2 ], 0[kg m2/ s2],
0[kg m2/ s2], k_изг );
//
vector vector1=projectZ;
//
// список цветов
color color_F1=RGB( 107, 118, 190 );
color color_F2=RGB( 168, 174, 217 );
function parity(i[ ]) "=1 - нечетное i; =2 - четное i"=abs(#i-int(#i/2+0.1)*2) < 0.5 -> 2, 1;
list color_F12=list( color_F1, color_F2 );
// color_S [ i ] = color_F12 [ parity ( i ) ], i = 1 .. n - 1
list color_S=listT( list:, "list( color_F12[parity(~)] )", n-1 );
//
// список точек
// lX [ i ] = ( i - 1 ) * l, i = 1 .. n
list lX=listT( scalar:, "(~-1)*l", n );
// lP [ i ] = point ( lX [ i ], 0[m], 0[m] ), i = 1 .. n
list lP=listT( point:, "point(lX[~], 0[m], 0[m])", n );
// lC [ i ] = pointOnRay ( lP [ i ], lP [ i + 1 ], k ), i = 1 .. n - 1
list lC=listT( point:, "pointOnRay( lP[~], lP[~+1], k )", n-1 );
//
// список solid
// listS [ i ] = cylinder ( lP [ i ], lP [ i + 1 ], r, density = ro, color = color_S [ i ] ), i = 1 .. n - 1
list listS=listT( solid:, "cylinder( lP[~], lP[~+1], r, density = ro, color = color_S[~])", n-1 );
//
// звенья
// listB [ i ] = body ( bodyGC = lC [ i ] ), i = 1 .. n - 1
list listB=listT( body:, "body( bodyGC = lC[~] )", n-1 );
// body listB [ i ] < (listS [ i ], lC [ i ] );
list listB < ( listS, lC );
//
// шарниры
// lJ [ i ] = rotational ( listB [ i ], listB [ i + 1 ], lP [ i + 1 ], vector1 ), i = 1 .. n - 2
list lJ=listT( joint:, "rotational( listB[~], listB[~+1], lP[~+1], vector1 );", n-2 );
//
// силовые элементы
// listF [ i ] = general ( listB [ i ], nodePoint( lP [ i + 1 ] ), listB [ i + 1 ], lP [ i + 1 ], stifn1,
// damp = damp ), i = 1 .. n - 2
list listF=listT( forceElement:, "general( listB[~], nodePoint( lP[~+1] ), listB[~+1], lP[~+1],
stifn1, damp = damp )", n-2 );
 
Отметим важные особенности работы метода при использовании необязательного именованного параметра startList. Пусть в качестве startList задан список  размера . Тогда для создаваемого списка  будут выполняться следующие условия:
      общее количество элементов создаваемого списка равно ;
      первые  элементов совпадают с элементами списка  (, );
      оставшиеся  элементов создаются по строке Method, где «~» (тильда) заменяется индексом создаваемого элемента, т.е. пробегает значения от  до .
С помощью необязательного именованного параметра startList можно задавать рекуррентные списки, т.е. списки, в которых для создания -го элемента  используются  предыдущих элементов списка: , …, . Чтобы список был определен, необходимо задать  первых элементов списка с помощью параметра startList. Тогда первые  элементов создаваемого списка  будут совпадать с элементами списка startList, следовательно, в строке Method становятся допустимыми для использования выражения вида «L[~-j]» для натуральных , что соответствует зависимости элементов списка от предыдущих элементов этого же списка. Ссылка на текущий элемент «L[~]» является недопустимой.
Классическим примером рекуррентно заданной последовательности является последовательность чисел Фибоначчи, которая определяется следующими соотношениями:
Для того чтобы в ПК EULER задать список чисел Фибоначчи, необходимо определить список начальных элементов и задать последовательность нужной длины (в данном примере создается список из первых 10 чисел Фибоначчи).
Пример задания чисел Фибоначчи
list L0=list( 1, 1 );
list L=listT( scalar:, "L[~-2]+L[~-1]", 10, startList = L0 );
 
В результате получим список скаляров .
Приведем еще один пример использования рекуррентного задания списка, с помощью которого можно получить произведение элементов списка. Пусть есть список , число элементов  которого заранее не определено. Необходимо вычислить произведение всех его элементов.
Пример перемножения элементов списка
//A – произвольный список скаляров
list B0=list( A[1] );
list B=listT( scalar:, "A[~]*B[~-1]", A.size, startList = B0 );
//элемент B[A.size] содержит произведение всех элементов списка A
 
В результате получим список , в котором -й элемент является произведением первых  элементов списка , следовательно, последний элемент  равен произведению всех элементов списка , что и требовалось. Например, для списка  получим  и, следовательно, произведение элементов равно .
Рекуррентные списки могут быть созданы не только для простейшего типа, каким является scalar, но и для произвольного, с тем лишь ограничением, что при создании объекта данного типа может быть использован другой объект этого типа.