Численные методы и программирование с 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:[];
(%i2) for f in [1,4,9,16] do a:cons(sqrt(f),a)$ (%i3) a;