Как
известно, итерационный метод дает возможность
получать последовательные все более точные
значения искомой величины по ее предыдущему
значению. Один из наиболее известных
итерационных методов - метод касательных Ньютона
для нахождения корней алгебраических функций.
В качестве примера символьного
программирования напишем процедуру NutonIteration ,
дающую по заданной функции формулу итерации.
Формальными параметрами процедуры будут
алгебраическое выражение и имя переменной.
Результатом процедуры должна быть функция,
выражающая формулу по которой будут вычисляться
последовательные значения переменной.
> restart;
NewtonIteration:=proc(expr::algebraic,x::name)
local iteration;
iteration:=x-expr/diff(expr,x);
unapply(iteration,x);
end;
Чтобы получить функцию по заданному
выражению в процедуре применена команда unapply.
В качестве примера возьмем выражение.
> expr:=x*sin(x)-sqrt(x);
График его изображен на рис. 69.
> plot(expr,x=-1..10);
Рис. 69
Применим процедуру
> Form:=NewtonIteration(expr,x);
Зададим начальное значение переменной
> x0:=9.0;
и найдем несколько Ньютоновских
итераций
> to 4 do x0:=Form(x0);od;
Мы видим, что значение x0 очень быстро
приближается к значению корня функции.
Можно эту же процедуру записать в виде,
когда формальным параметром процедуры является
также процедура
> restart;NewtonIteration:=proc(f::procedure)
(x->x)-f/D(f);
end;
> g:= x-> x*sin(x)-sqrt(x);
> Form2:=NewtonIteration(g);
> x0:=9.0;
> to 4 do x0:=Form2(x0) od;
|