* Данный текст распознан в автоматическом режиме, поэтому может содержать ошибки
Функциональное программирование в Derive 5/6
1105
Для этого несколько необычно использована функция вычисления предела – в данном случае она просто вычисляет значение функции y(x) в точке a. В этом примере параметры y и x передают в тело функции F(y,x a) вначале функцию x^2, а затем функцию x^3. Итак, с помощью функции IF, а также функций STEP и CHI можно осуществ лять условный выбор нужных функций. Создание Derive на языке muLISP позво ляет в полной мере реализовать возможности рекурсии, путем задания рекурсив ных функций, которые могут обращаться к самим себе. Наглядным примером может служить рекурсивная функция задания факториала:
FACT(n) := IF(n=0, 1, n FACT (n-1))
Она соответствует рекурсивному определению факториала: n! = 1 если n=0 n! = n (n 1)! если n>0 и содержит внутри себя обращение к самой себе. При задании рекурсивных функций следует не забывать об условиях их завер шения. Обычно они создаются с помощью условных функций IF. К примеру, в функции FACT (n–1) значение n при каждой рекурсии уменьшается на 1, пока не станет равным нулю – в итоге работа функции прекращается. Возможна также взаимная рекурсия. При ней одна функция обращается к дру гой, та – к третьей и т. д., причем последующие функции могут обращаться к пер вой функции. Глубокая рекурсия и взаимная рекурсия могут потребовать больших затрат памяти. Тем не менее рекурсия – основополагающий прием программиро вания. Следует отметить, что сам по себе язык muLISP базируется на множестве функций, реализующих взаимную рекурсию. А вот так в Derive выглядит программа решения системы дифференциальных уравнений методом Рунге Кутта четвертого порядка:
RK_AUX3(p,v,u_,c1,c2,c3):=(c1+LIM(p,v,u_+c3)+2*(c2+c3))/6 RK_AUX2(p,v,u_,c1,c2):=RK_AUX3(p,v,u_,c1,c2,LIM(p,v,u_+c2/2)) RK_AUX1(p,v,u_,c1):=RK_AUX2(p,v,u_,c1,LIM(p,v,u_+c1/2)) RK_AUX0(p,v,v0,n):=ITERATES(u_+RK_AUX1(p,v,u_,LIM(p,v,u_)),u_,v0, n)RK(r,v,v0,h,n):=RK_AUX0(h*APPEND([1],r),v,v0,n)
Это определение дает прекрасный пример техники функционального про граммирования на языке системы Derive и свидетельствует о компактности про грамм. В этой функции r – вектор левых частей системы обыкновенных диффе ренциальных уравнений первого порядка вида: y’ = f1(...x,y,z) ... z’ = fn(...x,y,z). Вектор v должен содержать перечисление всех переменных x, y, z, а вектор v0 – их начальные значения. Шаг решения по переменной x задается значением h, а число точек решения – значением n. Решение представляется в виде матрицы, столбцы которой дают значения переменных ...x, y, z. Примеры использования этой функции были приведены выше.