Главная Длительная эволюция [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.001 |