Численные методы и программирование с Maxima
4.1 Программирование на встроенном макроязыке
4.1.1 Условные операторы
Основная форма условного оператора: if then
else
. Если условие
истинно, то выполняется выражение
, иначе — выполняется выражение
. Пакет Maxima позволяет использовать различные формы оператора
, например: if
then
elseif
then
elseif ...else
Если выполняется условие , то выполняется выражение
, иначе — проверяется условие
, и если оно истинно — выполняется выражение
, и т.д. Если ни одно из условий не является истинным — выполняется выражение
.
Альтернативные выражения — произвольные выражения Maxima (в т.ч. вложенные операторы
). Условия — действительно или потенциально логические выражения, сводимые к значениям
или
. Способ интерпретации условий зависит от значения флага
. Если
, выдаётся ошибка, если значения какого-либо из выражений
отличается от
или
. Если
и значения какого-либо из выражений
отличается от
или
, результат вычисления
— условное выражение.
4.1.2 Операторы цикла
Для выполнения итераций используется оператор textttdo. Могут использоваться три варианта его вызова, отличающиеся условием окончания цикла:
for thru
do
for while
do
for unless
do
Здесь — переменная цикла;
— начальное значение;
— шаг (по умолчанию равен 1);
— конечное значение переменной цикла;
— операторы тела цикла.
Ключевые слова thru, while, unless указывают на способ завершения цикла:
- по достижении переменной цикла значения
;
- пока выполняется условие
;
- пока не будет достигнуто условие
.
Параметры , и
могут быть произвольными выражениями. Контрольная переменная по завершении цикла предполагается положительной (при этом начальное значение может быть и отрицательным). Выражения
, условия завершения (
) вычисляются на каждом шаге цикла, поэтому их сложность влияет на время выполнения цикла.
При нормальном завершении цикла возвращаемая величина — атом . Принудительный выход из цикла осуществляется при помощи оператора return, который может возвращать произвольное значение.
Контрольная переменная цикла — локальная внутри цикла, поэтому её изменение в цикле не влияет на контекст (даже при наличии вне цикла переменной с тем же именем).
Примеры:
(%i1) for a:-3 thru 26 step 7 do display(a)$

(%i2) s: 0$ for i: 1 while i <= 10 do s: s+i;

(%i4) s;

(%i5) series: 1$ term: exp (sin (x))$ (%i7) for p:1 unless p > 7 do (term: diff (term, x)/p, series: series + subst (x=0, term)*x^p)$ (%i8) series;

(%i9) for count: 2 next 3*count thru 20 do display (count)$

Условия инициализации и завершения цикла можно опускать. Пример (цикл без явного указания переменной цикла):
(%i10) x:1000;

(%i11) thru 20 do x: 0.5*(x + 5.0/x)$(%i12) x;

(%i12) float(sqrt(5));

За 20 итераций достигается точное значение .
Несколько более изощрённый пример — реализация метода Ньютона для уравнения с одной неизвестной (вычисляется та же величина — корень из пяти):
(%i1) newton (f, x):= ([y, df, dfx], df: diff (f ('x), 'x), do (y: ev(df), x: x - f(x)/y, if abs (f (x)) < 5e-6 then return (x))) $(%i2) f(x):=x^2-5;

(%i3) float(newton(f,1000));

Ещё одна форма оператора цикла характеризуется выбором значений переменной цикла из заданного списка. Синтаксис вызова: for in
do
Проверка условия завершения до исчерпания списка
может отсутствовать.
Пример:
(%i1) a:[];
![[\ ]\leqno{(\%o1) }](/sites/default/files/tex_cache/4e8489ca194c111ab6ee6127a24cfd5d.png)
(%i2) for f in [1,4,9,16] do a:cons(sqrt(f),a)$ (%i3) a;
![[4,3,2,1]\leqno{(\%o3) }](/sites/default/files/tex_cache/a38b154e6b3dd455a85deda6eee92f2d.png)