Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Maple для студентов физиков. Часть 1. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

Глава 9. Программирование: логика, циклы, процедуры

Задача 8.8

Учтите, что из вашей процедуры cosdeg вы не получите число. Исправим ее так, чтобы она возвращала число с плавающей запятой. Удостоверьтесь, что ваши исправления имеют место только внутри процедуры, а не в вызове процедуры.

Если вы посмотрите на то как используется новая процедура cosdeg, вы увидите, что она используется в точности как функция. Но поскольку это самостоятельная небольшая программа, она может быть достаточно сложной функцией. И в этом – причина того, зачем надо писать процедуры. Следует быть внимательным, поскольку определенная таким способом функция может не быть совместимой с другими командами Maple вроде plot, int, sum, dsolve, и т. п. Вдобавок процедуры медленнее, чем «родные» команды Maple.

Задача 8.9

Напишите процедуру, вычисляющую кубический B-сплайн, как в задаче 8.1. В ней мы обнаружили, что piecewise работает лучше, чем набор команд if, но здесь, if будет работать отлично, поскольку вы помещаете все внутрь собственной процедуры. Для доказательства того,

что это правда, не используйте в этой задаче piecewise. Нарисуйте график этой процедуры (функции) в интервале -3..3. Заметьте: если вы собираетесь рисовать результат процедуры, то возвращаемый ответ должен быть последним результатом, а внутрь передаются только соответствующие независимые переменные, т. е. для одномерной функции следует использовать B:=proc(x), для одномерной C:=proc(x,y), и т. д. При рисовании выдаваемого процедурой результата, его надо рассматривать как функцию применяя команду plot(f(x),x=a..b), или вы можете использовать операторное представление оператора Maple, в котором упоминание х отброшено: plot(B,-3..3).

Задача 8.10

См. вторую часть Пособия.

Задача 8.11

Напишите процедуру с входным параметром а, затем решите дифференциальное уравнение

191

Maple для студентов физиков

d2

 

3

 

 

 

a.

 

 

f (x) f (x)

с f(0) = 0 и

 

 

f (0)

dx

2

x

 

 

 

 

 

 

Пусть процедура возвращает f(1) как единственное число (вам, возможно, понадобится применить trace чтобы получить все правильно). Затем попробуйте задать разные значения а и посмотреть, можете ли вы найти хотя бы 2 значения а (иных, чем 0), для которых f(1) = 0. Найдите эти два значения а с точностью до 5 значащих цифр.

Вообще-то это сложная задача. Поэтому сделаем несколько подсказок.

Вам захочется подставить в процедуру dsolve(...type=numeric) и заставить ее возвратить число. Но выходом численной версии dsolve является набор уравнений, вроде таких:

>restart;

>f:=dsolve({diff(y(t),t$2)=-y(t),y(0)=2,D(y)(0)=0},{y(t)},type=numeric);

>g:=f(1);

Когда мы сталкивались с эти ранее, то использовали оператор присваивания для получения присвоенного y(t) числа, как ниже:

> assign(g);

Это не сработает, поскольку символ производной не есть правильная переменная для присваивания. Теперь есть два выбора:

(1)заменить ОДУ второго порядка набором связанных ОДУ и применить оператор присваивания для извлечения числа, или

(2)узнать, как применить команды Maple op или rhs для извлечения числа.

Команда op выдает элементы (величины), которые обычно генерирует Maple: выражения, функции, листы, наборы и т. п. Вернитесь наверх на команду restart выше, выполните restart, dsolve, и g:=f(1); но не исполняйте оператор assign. Тогда в операторе, который написан ниже изменится 1 на 2, и посмотрим, что возвратится

>op(1,g[2]);

Иначе ее можно использовать так:

> rhs(g[2]);

192

Глава 9. Программирование: логика, циклы, процедуры

Внутри процедуры вам надо использовать один из этих методов, чтобы она могла вернуть число.

Задача 8.12

См. вторую часть Пособия.

Рисование результатов fsolve

Этот пример несколько техничен, но вам, возможно, пригодится. Пусть вам надо решить сложное уравнение с варьируемым пара-

метром k:

cos(x) = kx,

где k изменяется от 0 до 20. Нужно построить функцию F(k), которая возвращает решение x этого уравнения при любом k, которое ему задается и затем построить график функции F(k).

Единственный способ сделать это – написать процедуру. После исполнения команд Maple внутри процедуры (приведена ниже), в F присваивается последний рассчитанный процедурой результат. В нашем случае – это значение x из fsolve, что нам и нужно, чтобы было в F.

Рассмотрите процедуру ниже, а затем постройте график.

> restart;

Объявление F процедурой

> F:=proc(k)

Объявление локальных внутренних переменных процедуры

> local s,x;

Использование fsolve для решения уравнения со значением k, полученным из заголовка процедуры proc(k)

>s:=fsolve(cos(x)-k*x,x,0..2);

Возврат

>end;

193

Maple для студентов физиков

Посмотрим результат для значений

> F(1);F(2);

Строим график в операторном представлении, поскольку форма plot(F(k),k=0..20) не сработает

> plot(F,0..20);

Задача 8.13

Рассмотрим полином x4 + ax3 + x2 + x + 1 с варьируемым параметром a. Можно применть к этому полиному fsolve и найти все четыре корня при значении a.

>a:=2.5;

>P:=x^4+a*x^3+x^2+x+1;

>s:=fsolve(P,x,complex);

Если хотите выбрать один из корней, например, второй, надо записать:

> s[2];

Скопируйте процедуру из начала раздела и измените ее так, чтобы нарисовать второй корень этого полинома для значений а, изменяющихся в интервале от 2 до 10. (Просто вставьте в процедуру мепловский код.) Заметьте: процедура возвращает последнее посчитанное ею значение, поэтому чтобы вернуть значение второго корня в новой процедуре после s:=fsolve(....) вам надо написать команду s[2];.

Задача 8.14

См. вторую часть Пособия.

Синтаксис и применение некоторых команд Maple

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

Функции пользователя Альтернативные определения функций

194

Глава 9. Программирование: логика, циклы, процедуры

Составной оператор Кусочные функции Процедуры и модули

procedure

Рекурсивные процедуры module

Управляющие структуры if

for

Объекты и операции

sequences, lists, sets, tables, arrays, vectors, matrices

Основные операции со структурами данных

Создание пустых структур Связанные структуры

Извлечение i-го элемента из структуры Определение числа элементов в структуре Замена i-го элемента структуры

Вставка элемента или нескольких элементов в структуру Создание структуры согласно формуле

или обладающей особыми свойствами

Операции с sets, matric

Применение функции к каждому элементу structure, map, apply, applyop

Функции пользователя:

функциональный оператор (см. ?->), т. е. функция одной или многих переменных:

f(x) = expr, f(x1, ..., xn) = expr,

векторные функции одной или многих переменных: f(x) = (x1, ..., xn), f(x1, ..., xn) = f1(x1, ..., xn), ..., fn(x1, …, xn)

f:=x->expr; f:=(x1,...,xn)->expr; f:=t-><x1 (t),... ,xn(t)>;

f:=(x1,...,xn)-><f 1(x1, .. .,xn) ,. ..,fm(x1,. .. ,xn)>;

195

Maple для студентов физиков

Альтернативные определения функций:

unapply преобразует выражение в функцию и процедура задается с помощью proc.

f:=proc(x) option operator,arrow; expr end proc; f:=proc(x) expr end;

f:=proc(x1,...,xn) expr end; f:=proc(t) <x1(t),...,xn(t)> end; f:=unapply(expr,x);

Расчет при x = a, {x = a,y = b}, и т. п.

f(a); subs(x=a, f(x)); eval(f(x),x=a);

f(a,b); subs(x=a,y=b,f(x,y)); eval(f(x,y),{x=a,y=b});

Составной оператор

@, т. е. составная функция.

(f @ @ n)(x); (f1 @ f2 @ f3 @ ... @ fn)(x);

Кусочные функции:

можно определять куски, или процедуры с оператором if.

f:=x->piecewise(cond1,expr1,expr2); g:=x->piecewise(cond1,expr1,co nd2,expr2,expr3);

f:=proc(x) if cond1 then expr1 else expr2 end if; end proc; g:=proc(x) if cond1 then expr1 elif cond2 then expr2

else expr3 end if; end proc;

Процедуры и модули

В языке Maple есть два виде модулей: procedures и modules. procedure (см. ?procedure) – это многократно используемый блок

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

196

Глава 9. Программирование: логика, циклы, процедуры

proc(args) local v1; global v2; options ops; stats; end proc; proc(args) local v1; global v2; options ops; stats; end;

Здесь args – это последовательность аргументов, vl и v2 имена локальных или глобальных переменных, ops – опции (см. ?options) и stats – операторы, реализуемые внутри процедуры.

Задача 8.15

В лагранжевой механике голономная система с N-степенями свободы описывается уравнениями Лагранжа:

d L

 

L

Qi , i 1,...,N,

 

 

 

 

dt qi

 

 

qi

где L = T–U – функция Лагранжа системы, T – кинетическая, U – потенциальная энергия, qi – обобщенные координаты, Qi – обобщенные силы, а

d L

N

 

 

 

L

 

 

 

L

 

 

 

 

 

 

 

 

qj

 

 

 

qj .

dt qi

qj qi

qj qi

j 1

 

 

 

Пусть обобщенные силы, кинетическая и потенциальная энергии известны.

Напишите процедуру для вычисления уравнения Лагранжа.

Для примера рассмотрим движение двойного маятника массой m и длиной L в вертикальной плоскости под действием гравитации. Для маятника (N = 2), обобщенными координатами являются углы A и B, а обобщенные непотенциальные силы равны нулю.

Eq_Lagrange:=proc(q,L,Q)

local i,j,N,dq,d2q,Lq,Ldq,dLdq,Eq; N:=nops(q);

for i from 1 to N do dq[i]:=cat(q[i], `’`); end do; for i from 1 to N do d2q[i]:=cat(q[i], `’’`); end do; for i from 1 to N do

Lq:=diff(L,q[i]); Ldq:=diff(L,dq[i]); dLdq:=add(diff(Ldq,q[j])*dq[j]+diff(Ldq,dq[j])*d2q[j],j=1..N); Eq[i]:=dLdq-Lq-Q[i]; end do;

197

Maple для студентов физиков

RETURN(normal(convert(Eq,list))); end proc;

T:=m*x 2*`A’` 2+ m*x 2*`A’` 2*`B’`*cos(A-B)+1/2*m*x 2*`B’`2; U:=-m*g*x*cos(A)-m*g*x*(cos(A)+cos(B)) ;

q:=[A,B]; g:=omega"2*x; Q:=[0,0];

Eq_L:=Eq_Lagrange(q,T-U,Q); Eq_L1:=factor(Eq_L);

Рекурсивные процедуры процедуры, которые обращаются сами к себе, пока не выполнится условие (см. ?remember).

Задача 8.16

Вычислить числа Фибоначчи и время расчета для F(n) = F(n – 1) +

F(n – 2), F(0) = 0, F(1) = 1. Fib:=proc(n::integer) option remember;

if n<=l then n else Fib(n-l)+Fib(n-2) end if; end proc; NF:=NULL:

for i from 10 to 40 do NF:=NF,Fib(i); end do: NF:=[NF];

ti:=time():

Fib(3000); tt:=time()-ti; op(4,eval(Fib)); forget(Fib);

Если мы включим опцию remember (см. ?remember), Maple создаст таблицу памяти, в которой будут храниться все вычисленные величины, и Maple не будет вычислять их заново. Таблица памяти доступна как op(4,eval(Fib)) и с нею можно работать как с табличным объектом. Таким способом увеличивается эффективность вычислений, экономится время, но занимается память. Чтобы очистить таблицу памяти процедуры можно использовать функции forget или restart.

module (см. ?module) – это обобщение концепции процедуры. Как процедура группирует последовательность операторов в один оператор (блок операторов), так модуль группирует соответствующие функции и данные.

198

Глава 9. Программирование: логика, циклы, процедуры

module() export v1; local v2; global v3; option ops; stats; end module;

Здесь vl, v2, and v3 – имена экспортируемой, локальной и глобальной переменных соответственно, ops – специальные опции (см. ?module[options]) и stats – операторы, которые реализуются внутри модуля.

Управляющие структуры

В Maple имеются две управляющие структуры:

выбор if и повторение for

if cond1 then expr1 else expr2 end if;

if cond1 then expr1 elif cond2 then expr2 else expr3 end if; for i from i1 by step to i2 do stats end do;

for i from i1 by step to i2 while cond1 do stats end do; for i in expr1 do stats end do;

for i in expr1 do stats od;

for i in expr1 while expr2 do stats end do;

где cond1 и cond2 – условия, expr1, expr2 – выражения, stats – операторы, i, i1, i2 – соответственно переменная цикла, начальное и конечное значения i. Эти операторы могут быть вложенными. Внутри цикла: для прерывания цикла, для продолжения до следующей итерации, или для наложения дополнительных условий применяются операторы break, next, while, end if и fi, end do и od эквивалентны.

Задача 8.17

Определить функцию двойной факториал для любого целого n,

n(n 2)(n 4) ... (4)(2),

n 2i, i 1,2, ...

n!!

 

n(n 1)(n 3) ...(3)(1),

n 2i 1, i 0,1, ...

N1:=20; N2:=41;

 

FD:=proc(N) local P, i1, i;

 

P:=1;

 

if modp(n,2)=0 then i1:=2 else i1:=1 end if:

199

Maple для студентов физиков

for i from i1 by 2 to N do P:=P*i; end do: end proc:

printf(‘’%7.0f!! = %20.0f”, N1, FD(N1)); printf(‘’%7.0f!! = %20.0f”, N2, FD(N2));

Задача 8.18

Вычислите значения хi, где хi =(xi–1 + 1/xi–1), x0 = 1, пока xi хi-1 <

(i = 1,2,..., n, n = 10, = 10–3). n:=10; x:=1; epsilon:=10 (-3);

for i from 1 to n do xp:=x: x:=evalf((x+1/x));

if abs(x-xp)<=epsilon then break else printf("x= %20.8f \n", x) end if: end do:

Задача 8.19

Найдите целое N(x), x [a, b] такое, что

b = 2 и c = 2.

for x from a to b by 0.01 do S:=0: for i from 1 to 100 while S<c do S:=S+evalf(i^(-x));

end do:

printf("x= %7.4f N(x)= %7d \n", x, i); end do:

N(x)

i x c , где a = 1,

i 1

Объекты и операции

Для представления сложных данных применяются объекты

Maple: sequences, lists, sets, tables, arrays, vectors, matrices.

a:=val1; b:=val2; n:=vall; m:=val2; Sequence1:=expr1,...,exprn; Sequence2:=seq(f(i),i=a..b); Sequence3:='f(i)'$'i'=a..b; Listl:=[Sequence1]; Range1:=a..n;

Set1:={Sequence1}; Table1:=table([expr1=A1,...,exprN=AN]);

Arr1:=Array(a..n, a,,m); Arr2:=Array(); Arr3:=Array(l..n,fill=l);

200