Главная  Длительная эволюция 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [ 73 ] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

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

zz = D[f[t,x,y],{t,2},x,y,x]

/(2.2.1)[t,X,J/]

должно быть представлено на экране как

fuxxy[t,X,y]

Уточним, что так должны быть представлены любые производные от любых функций от произвольных аргументов.

Для решения задачи напишем функцию preformat, которая, будучи примененной к выражениям вида zz, создает нужное представление. Воспользуемся тем, что полная форма zz имеет вид

ZZ / /FuUForm

Derivative[2,2, l][f][t,x,y]

верхние индексы. Функции Subscript и Superscript отсылают свои аргументы соответственно в нижние и верхние индексы.

{Subscript[a,b], Superscript [а, b]}

{аЬ,

При форматировании тензоров последние функции особенно удобны, поскольку они убирают запятые между последовательными аргументами.

Format[f[xl,x2,x3]] := SequenceForm[f, Subscript[xl, х2], Superscript[x3]] f[xl,x2,x3]



И будем извлекать из этой полной формы блоки искомого представления. Сначала извлечем аргументы функции:

za= List@@zz

Затем извлекаем индекс (2,2,1):

zb = List @@ Head® Head @zz

{2,2,1}

С помощью выражений za и zb сконструируем вспомогательный список

ZC = Transpose[za, zb]

{{2}, {х,2}, {у,1}}

необходимый, чтобы получить последовательность аргументов, по которым вычисляется производная, в виде ttxxy.

zd = (сс = First[#]; cc&/@Range[Last[#])&/@zc Flatten

{<,f,i,i,y}

К каждому элементу списка zd мы впоследствии применим функцию Subscript, чтобы они сформировали нижний индекс. Заголовок функции, производная которой вычисляется, есть значение выражения

ze = First@Head@zz /

С помощью SequenceForm получаем заголовок отформатированной производной:

zf = SequenceForm[ze, Sequence @@ Subscript/@zd]

fttxxy



который применяем к za:

zf@@za

fuxxy[t,x,y]

Оформляем промежуточные вычисления в виде функции:

preformat[z /; Nest[Head,z,3] ===

Derivative] := Module[{aa,ab,cc},

aa = Transpose[{List@@z, List@@Head® Head@z}];

ab = Subscript /@ (cc = First [#];

cc&/@Range[Last[]#])&/@zc Flatten;ac =

SequenceForm[First @ Head @ z, Sequence @@ ab];

ac@@List@@z]

Наконец, форматируем всевозможные производные: Format[z:(Derivative[ ][ ][ ])] := preformat[z]

Проверим, как работает форматирование: D[h[x,y],{x,3},y]

hxxxy[x,y]

Упражнения

1. Пусть в результате занявшего много времени расчета в выходную ячейку помещен список численных данных. Как воспользоваться ими, не повторяя расчета? Смоделируйте эту ситуацию следующим образом. Откройте Записную книжку и вычислите выражение Sin[Range[100]] N. Сохраните Записную книжку, начните новую сессию „Математики" и вновь откройте эту Записную книжку. Присвойте символу I значение выражения в выходной ячейке, предварительно изменив ее свойства, и проверьте справедливость равенства 1-2 == 1 - Co8[Range[100]]2 / / N.



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [ 73 ] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

0.0009