Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
~Экзамен~ / 1999_Ответы_.doc
Скачиваний:
32
Добавлен:
19.04.2013
Размер:
964.1 Кб
Скачать

10. Основные концепции работы с матричными переменными в системе имитак.

81 год – работа с одномерными массивами, вложенность, работа с другими языками, скалярные переменные. =>Переход к ИМИТАК2 – векторные многомерные матричные переменные.

Одной из версий системы ИМИТАК – ИМИТАК2 является вариант, когда мы работаем с векторными переменными. При этом введение многомерных массивов (1,2 и 3-х мерные) не должно нарушать основные концепции системной динамики. Основным действием ИМИТАК2 является представление в виде 1 оператора (уравнения) нескольких однообразных (одинаковых) операторов и наборов исходных данных (матриц). Такой набор операторов и исходных данных будем называть массивом. При реализации массивов в ИМИТАК2 объявление размерностей ведется не с помощью специального оператора, а внутри самого уравнения. Т.о. при адаптации модели упрощено введение новых массивов.

ИМИТАК1

ИМИТАК2

У А1.Н = …….

У А2.Н = …….

У А: (3).Н = …….

У А3.Н = …….

- варианты одномерного массива

Д А11.Н = …

Д А12.Н = …

Д А21.Н = …

Д А: (3, 2).Н = ……

Д А22.Н = …

Д А31.Н = …

Д А33.Н = …

- варианты многомерного массива (2-х мерного)

Считается, что если массив стоит в левой части оператора, то правая часть используется многократно для расчета любого элемента этого массива. В правой части такого уравнения могут быть как скаляры, так и массивы с той же размерностью, что и в левой части. Для выделения какого – нибудь одного элемента массива используется знак #. Например:

У А: (3).Н = …

Д В.Н = А#(2).Н*К1 – используется только второй элемент массива А при расчете В.

В 2-х и 3-х мерных массивах могут использоваться несколько переменных, объединенных в группу – так называемое сечение (строка, столбец в матрице). Причем указание на сечение ведется с использованием значка (*). Пример: Есть следующий фрагмент модели – программы:

Д А: (3,3).Н = …. (1)

Д В: (3).Н = А#(2,*).Н (2)

Д С: (3).Н = RANGE(А#(*, 1).Н, А#(*, 3).Н) (3)

Ф.Н = RANGE(А.Н, В.Н), т.е. Ф(t) = (А (t))^B (t) – степенная функция.

После выполнения (1) будем иметь:

| А11 А12 А13|

| А21 А22 А23| = А: (3, 3)

| А31 А32 А33|

После (2): В: (3) = | А21 А22 А23 |

После (3): С#(1) =(А11)^А13

С#(2) =(А21)^А23

С#(3) =(А31)^А33

При расчете правой части в матричных выражениях необязательно в правой части могут быть одинаковые алгоритмы. Тогда работает следующий механизм задания специфических алгоритмов: после написания (общей части) одинаковых алгоритмов для всего массива или сечений строго следующим оператором вводится «во изменении» специфический алгоритм. Пример:

ИМИТАК1

ИМИТАК2

Д А1.Н = RAND(20, 40)

Д А2.Н = sin(время)

Д А: (3).Н = RAND(20, 40)

Д А3.Н = RAND(20, 40)

Д А#(2).Н =sin(время)

Т.е. 1 и 3 элемент массива А1 и А3 рассчитываются как случайная величина, а А2 как синусоидальная. При этом между 2 операторами ИМИТАК2 не должно стоять никакого значимого оператора (к незначимым относят комментарии).

При введении сечения мы используем значок *для отображения всех индексов элементов, входящих в сечение. Если необходимо использовать определенный порядок движения индексов, то вводятся 3 скалярные ячейки:I1, I2, I3, что соответствует ортам i, j, kсоответственно.

I1, I2, I3могут использоваться в правой части, причем для каждого оператора задается свой вариант, где максимальные значения индекса объявляются в левой части оператора.

Пример: Пусть имеется матрица А: (20, 10). Задача – её надо транспонировать, т.е. получить матрицу В(10,20).

У А: (20, 10).Н = (1)

Д В: (10, 20).Н = А#(I2, I1).H(2)

Т.е. в первом операторе (1) есть I1, I2, тогда во (2) I1 (2) = I2, I2 (1) = I1.

Следствия:

1. В первый момент времени уровням присваиваются начальные значения, соосветственно объявленным значениям.

2. Для массивов констант объявление размерностей ведется не в левой части оператора, а непосредственно в правой части в момент его использования.

Пример:

У А: (3, 2).Н = А.П + ТВХ.ПН - ТВП.ПН (1)

Т ТВХ: (3, 2).НБ = А#(I1, I2).H* К: (3, 2)#(I1, I2) (2)

Т ТВП: (3, 2).НБ = А#(I1, I2).H- К: (2, 3)#(I2, I1) (3)

Е

И А = 3/4/6/7/3/2

И К = 1/2/3/4/5/6

Результат: в первый момент времени (1):

в первый момент времени (1):

А#(1, 1) = 3

А#(1, 2) = 4| 3 4 |

А#(2, 1) = 6 А: (3, 2) =| 6 7 |

А#(2, 2) = 7 | 3 2 |

А#(3, 1) = 3

А#(3, 2) = 2

(2)

| 1 2 | ТВХ (1, 1) = 3 * 1

Квх = | 3 4 | ТВХ (1, 2) = 4 * 2

| 5 6 | ТВХ (2, 1) = 6 * 3

ТВХ (2, 2) = 7 * 4

ТВХ (3, 1) = 3 * 5

ТВХ (3, 2) = 2 * 6

(3)

ТВП (1, 1) = 3 - 1

Квых = | 1 2 3 | ТВП (1, 2) = 4 - 4

| 4 5 6 | ТВП (2, 1) = 6 - 2

ТВП (2, 2) = 7 - 5

ТВП (3, 1) = 3 - 3

ТВП (3, 2) = 2 - 6

При использовании матричных переменных сталкиваются с понятием «массивы необъявленной размерности». Массивы необъявленной размерности возникают потому, что в скалярных встроенных функциях типа TABLEи QUANTобязательно используются одномерные массивы. При работе с векторными (встроенными) функциями (операторами) в правых частях оператора могут встретиться функцииTABLEили QUANT, размерность которых в левой части оператора не может быть объявлена. Кроме того, если в левой части оператора объявляется размерность меньше, чем объявленная ранее размерность массива, используемого в правой части, то фактически используется только часть массива, находящегося в правой части.

Пример:

Д В: (3).Н = TABLE (MAC: (5, 4)#(I1,*), время, 0,1)

Е

И МАС = 10/20/30/40/0.1/0.2/0.3/0.4/1/2/3/4/9/8/7/6/30/25/20/15

Результат:

Время

B#(1)

B#(2)

B#(3)

0

10

0.1

1

1

20

0.2

2

2

30

0.3

3

3

40

0.4

4

4

40

0.4

4

5

40

0.4

4

I = {1, 2, 3}, т.к. В: (3)

Предположим, что имеется другой фрагмент: пусть вместо В записана следующая строчка, т.е. надо рассчитать С.

Д С: (4) = QUANT (MAC: (5, 4)#(I1,*),0)

Результат:

Время

С#(1)

С#(2)

С#(3)

С#(4)

0

10

0.1

1

9

1

20

0.2

2

8

2

30

0.3

3

7

3

40

0.4

4

6

4

10

0.1

1

9

5

20

0.2

2

8

Соседние файлы в папке ~Экзамен~