Численные методы и программирование с 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)$
![a=-3\\ a=4\\ a=11\\ a=18\\ a=25](/sites/default/files/tex_cache/811f9ebf88967085739569327f3dfb8a.png)
(%i2) s: 0$ for i: 1 while i <= 10 do s: s+i;
![done\leqno{(\%o3) }](/sites/default/files/tex_cache/489b94c7f98c16581f48eb247b5c5840.png)
(%i4) s;
![55\leqno{(\%o4) }](/sites/default/files/tex_cache/08a837cb80a1e529d584ad57b09d2c26.png)
(%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;
![\frac{{x}^{7}}{90}-\frac{{x}^{6}}{240}-\frac{{x}^{5}}{15}-\frac{{x}^{4}}{8}
+\frac{{x}^{2}}{2}+x+1\leqno{(\%o8) }](/sites/default/files/tex_cache/8f10e39734a580dcc87bf122c553507e.png)
(%i9) for count: 2 next 3*count thru 20 do display (count)$
![count=2\\
count=6\\
count=18](/sites/default/files/tex_cache/37938112382931c184cf66c02916e1cf.png)
Условия инициализации и завершения цикла можно опускать. Пример (цикл без явного указания переменной цикла):
(%i10) x:1000;
![1000\leqno{(\%o10) }](/sites/default/files/tex_cache/8596a67f8d1310b02421ebdb8be7a13c.png)
(%i11) thru 20 do x: 0.5*(x + 5.0/x)$(%i12) x;
![2.23606797749979\leqno{(\%o12) }](/sites/default/files/tex_cache/34d3938a50ce9b5a85aa0c2bd9f2d82d.png)
(%i12) float(sqrt(5));
![2.23606797749979\leqno{(\%o12) }](/sites/default/files/tex_cache/34d3938a50ce9b5a85aa0c2bd9f2d82d.png)
За 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;
![f\left( x\right) :={x}^{2}-5\leqno{(\%o2) }](/sites/default/files/tex_cache/39cd3f3d168c785cb4bdc63caba21663.png)
(%i3) float(newton(f,1000));
![2.236068027062195\leqno{(\%o3) }](/sites/default/files/tex_cache/1552d8ea3cac2bb58b0844ddca4c6c9f.png)
Ещё одна форма оператора цикла характеризуется выбором значений переменной цикла из заданного списка. Синтаксис вызова: 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)