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

[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]

данное определение. В противном случае в операторе Do происходило бы присваивание списку 1 другого списка, скажем, списка Delete[l,-1]. Создадим теперь три списка 11,12,13, а символу /4 присвоим значение выражения х + у.

{11 = {}, 12 = {а,Ь,с}, I3 = {a,b,c,d,e,f,g}, l4 = x-Hy} {{}, {а,Ь,с}, {a,b,c,d,e,f,g}, х + у}

{norm[ll], norm[l2], norm[l3], norm[l4]}

{{}, {a,b,c,Q,0,}, {a,b,c,d,e}, input is not a list}

Таким образом, поставленная нами задача решена.

7.3. Условные циклы

Цикл с заголовком While имеет вид

While[test,expr]

Его вычисление начинается с проверки условия test. Если оно имеет значением True, то вычисляется ехрг, которое при вычислении каким-либо образом изменяет test. Далее опять проверяется тест, и так происходит до тех пор, пока test не получит значения, отличного от True. По окончании цикла формальным результатом вычислений является Null. Таким образом, цикл While никогда не остается невычисленным. Проиллюстрируем сказанное простейшими примерами:

x=l;While[x<7,t=x2;x-(-+];t 36

X = 10; While[x > 5,Print[x" > 5"];х - -]

10 > 5

9> 5

8> 5

7>5

6> 5



Более содержательный пример доставляет следующая программа, реализующая метод бисекций нахождения нулей функций. Метод состоит в следующем. Допустим, что мы нашли две точки а и Ь в окрестности нуля функции f{x), такие, что в этих точках функция принимает значения противоположных знаков. Тогда отрезок [а,Ь] делится пополам, и если знак функции / в середине отрезка совпадает с ее знаком в точке а, то середина отрезка принимается за новую точку а. Если же знак в середине отрезка совпадает со знаком функции в точке Ь, то середина отрезка принимается за новую точку Ь. Процесс деления продолжается, пока модули значений функции на концах отрезка не сделаются достаточно малы.

bisect[f ,a ,b ,eps ] := (If[N[f[a]f[b]] > О,

2 = "а, b are not good", t = a; s = b;

While[Max[N[f [t]],N[f[s]]] > eps, u = N[f[t]];

V = N[f[s]];w = N[f[(t + s)/2]]; If[uw >= 0,t = (t -H s)/2];

If[vw > 0,s = (t -H s)/2]; 2 = N[t]]]; z)

В программу включена проверка условия противоположности знаков функции на концах отрезка.

bisect[AiryAiPrime, 1,2,0.001] a,b are not good

bisect[AiryAiPrime, -2,2,0.001]

-1.01953

Оператор условного цикла с заголовком For устроен следующим образом. Выражение

For[start, test, step, ехрг]

инициирует некоторые начальные данные start, затем вычисляет многократно выражения step и ехрг, пока условие test



7.4. Функция Module 173

вычисляется на True. Как и для цикла с заголовком While, формальны»! результат вычисления цикла For есть Null. Вот простой пример применения этого цикла.

For[i= 2,i < 5,i + +,Print[Expand[(l + x)i]]] 1 + 2a; + a;2

1 + ix + 6x + 4x + X* 7.4. Функция Module

Интерактивный характер проведения сеансов работы с „Математикой" приводит к необходимости писать программы во время текущей работы, в момент, когда, возможно, уже не одному десятку символов присвоены определенные значения. В то же время при написании программ приходится использовать вспомогательные переменные, относительно которых пользователь молчаливо предполагает, что им не присвоены какие-либо значения. Если это предположение ошибочно, то программа может начать вести себя непредсказуемым образом. Даже после безошибочной работы программы в качестве побочного эффекта ее выполнения таким вспомогаг-тельным переменным оказываются присвоенными некоторые значения. Это явление носит название конфликта символов. Правда, переменные итераторов в операторе Do, скажем, переменная i в t = 0;Do[t = t--i*2,{i,4}] локализована, поэтому после выполнения рассмотренного составного выражения символ г имеет то же значение, что и до его выполнения, но использованный в качестве вспомогательной переменой символ t получил значение 30. В операторе For переменная цикла не локализована, поэтому после выполнения программы

t = 0;For[i = l,i < 5,i----,t = t-Нi-2]



[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