Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инстр_Mathem_v8.doc
Скачиваний:
4
Добавлен:
16.11.2019
Размер:
1.91 Mб
Скачать

14.2. Обращение к элементам выражений

К элементам любого выражения можно обращаться точно так же, как к элементам списков, используя команды:

Part[expr, n] или (expr)[[n]] – выделение элемента выражения expr с номером n;

Part[expr, {n1, n2,...}] или (expr)[[{n1, n2,...}]] – выделение списка из нескольких частей выражения. При этом заголовок выражения имеет номер “0”.

К заголовку выражения можно обращаться также с помощью команды Head[expr].

Пример 14.1 Рассмотрим заголовки выражений:

In[ ] := Head[2] Out[ ] = Integer In[ ] := “a”[[0]] Out[ ] = String

In[ ] := Head[2.] Out[ ] = Real In[ ] := f[x, y][[0]] Out[ ] = f

In[ ] := Head[2/3] Out[ ] = Rational

14.3. Представление выражения в виде дерева

Любое выражение может быть представлено в виде дерева. Пример приведен на рис. 14.1.

Соответственно, можно говорить о глубине и об уровнях выражения. Команда Depth[expr] – подсчитывает количество уровней в выражении expr, а команда Level[epxr, lev] – выводит список частей выражения, стоящих на уровнях, указанных в спецификации lev.

Варианты спецификации уровней:

{

In[ ] := TreeForm[ h = 1 + (3 + x)2 + y ]

Out[ ] // TreeForm =

Plus[ 1, | , y ]

Power[ | , 2 ]

Plus[ 3, x ]

Рис. 14.1

n}
– только один уровень с номером “n”;

n – все уровни от 1 до n;

Infinity - все уровни;

{-1} – “листья” дерева - концевые узлы.

Например, Depth[h] равно четырем; команда Level[h, {0}] выводит список нулевого уровня, включающий все выражение: {1 + (3 + x)2 + y}; команда Level[h, {1}] выводит список всех трех элементов выражения h: {1, (3 + x)2, y}; команда Level[h, {3}] выводит список элементов самого нижнего уровня: {3, x}; команда Level[h, {-1}] выводит список концевых узлов: {1, 2, 3, x, y}.

14.4. Операции преобразования выражений

Применение операций преобразования списков.

Приведенные в разделе 9 команды преобразования списков применимы также к любым выражениям. Рассмотрим примеры.

Пример 14.2

Введем выражение: In[ ] := g = 1 + y + z^2;

Выделим первый подэлемент третьего элемента: In[ ] := g [[3,1]] Out[ ] = z

Заменим первый подэлемент третьего элемента:

In[ ] := g [[3,1]]=x+3; g Out[ ] =1 + (3 + x)2 + y

Пример 14.3

Введем выражение: In[ ] := a=E^x Out[ ] =ex

Добавим к выражению еще один элемент: In[ ] := b=Append[a, y] Out[ ] =

Применим циклическую перестановку: In[ ] := RotateLeft[b, 1] Out[ ] =

Операции с заголовками выражений.

В выражении типа f[x] имя функции f само является выражением, и с ним можно производить те же действия, что и с другими выражениями.

  • Можно изменять имя по правилу замены.

Пример 14.4 In[ ] := {x, a, 5} /. List -> Plus Out[ ] = 5 + a + x

  • Можно присваивать имени новое значение.

Пример 14.5 In[ ] := f = Sin; {f[x], f[Pi/2]} Out[ ] = {Sin[x], 1}

  • Можно использовать имя как аргумент.

Пример 14.6 In[ ] := g[f_, x_] := f[x^2]; g[Sin, y] Out[ ] = Sin[y2]

Оператор Apply.

Оператор Apply[f, expr] или f@@expr заменяет заголовок выражения на f. Apply[f, expr, lev] – применяет функцию f на уровне или уровнях, указанных в спецификации lev.

Пример 14.7 Вычисление среднего арифметического.

In[ ] :=mean[list_] := Apply[Plus, list] / Length[list];

L1 = Table[Random[Integer, {0, 10}], {100}]; mean[L1]//N Out[ ] = 4.79

Применение операторов к частям выражений.

Функциональный оператор Map[f, expr] – применяет функцию f к каждому элементу выражения expr.

Пример 14.8 In[ ] := Map[Cos, {a, b, Pi}] Out[ ] = {Cos[a], Cos[b], -1}

Оператор Map[f, expr, lev] – применяет функцию f к каждому элементу выражения expr на уровне, определяемом спецификацией lev.

Пример 14.9 Создадим простое выражение e1=a/b. С помощью команды Level выделим в этом выражении элементы, стоящие на первом уровне, а затем применим к ним функцию Sin. Аналогично выделим элементы второго уровня и применим к ним ту же функцию Sin. Наконец, применим функцию Sin ко всем уровням выражения e1 от первого до второго.

In[ ] := {e1=a/b; Level[e1, {1}], Map[Sin, e1], Level[e1, {2}], Map[Sin, e1, {2}], Map[Sin, e1, 2]}

Out[ ] = {{a, 1/b}, Sin[a] Sin[1/b], {b, -1}, a Sin[b]-Sin[1], Sin[a] Sin[Sin[b]-Sin[1]]}