Решения нелинейных уравнений
Достаточно мощными средствами для решения нелинейных уравнений обладает Maple 11. Рассмотрим основные функции.
Для решения уравнений в аналитическом виде используется функция:
solve (<уравнение>, <переменная>), где <уравнение> - это уравнение, содержащее функцию,
<переменная> - переменная, по которой необходимо найти peшeние. Возможны различные варианты записи этой функции,
например запис solve (F (х), х) означает, что решается уравнение f( х) = 0, а в случае solve (F (х) G (х), х)
решению относительно х подлежит выражение f(х) = g(x).
Функцию fsolve (<уравнение>, <переменная>, <опции>) применяют дл получения численного решения нелинейного
уравнения в форме веществе ных чисел. Параметры <уравнение> и <переменная> имеют те же значения, что в функции
solve, а параметр <опции> может принимать следующие значения:
complex - находит один или все корни полинома в комплексной форме;
folldigits - задает вычисления для полного числа цифр, заданного функцией Digits;
maxsols - задает вычисление только n корней полинома;
interval - обеспечивает поиск корней в указанном интервале и принимaет значения а.. b или х = а.. Ь.
Кроме того, в Maple встроены достаточно специфические функции решени нелинейных уравнений, такие как rsolve - решение рекуррентных уравнение isolve - решение уравнений в целочисленном виде, msolve - решение уравнений по модулю m и специальная функция вычисления корней полинома root (<полином>), результатом работы которой является список [ [ r1, m1 ] , ..., [ rn mn] ], где гi - корень полинома, a mi - его кратность. Мы остановимся на основных функцияx solve и fsolve и рассмотрим их применение на конкретных примерах.
Пример:
solve(2*х^4-8*х^3+8*х^2-1,х);
fsolve(2*х^4-8*х^3+8*х^2-1,х);
![]()
Понятно, что функция solve нашла все корни полинома в аналитическом виде, a fsolve - в более привычном численном.
Как известно, Maple 11 обладает собственным достаточно мощным языком программирования. Опишем при помощи Maple-языка численные методы решения алгебраических уравнений.
Пример: Решить алгебраические уравнения методом спуска. Как было сказано, реализация метода спуска требует определения значения многочлена в точке вычисления частного от деления многочлена на линейный множитель по схеме Горнера и расчета значения первой производной многочлена в точке. Приведем тексты соответствующих процедур на Maple-языке.
Процедура вычисления значения полинома в точке:
pol:=proc(n,а,х0)#Значение полинома степени n в точке х0
local i ::integer;
s:=0;
for i from 0 to n do
s:=s+a[i]*x0^(n-i)
od;
evalf(s);
end:
Warning, `s` is implicitly declared local to procedure `pol`
Процедура деления многочлена на линейный множитель
gorner:=proc(n,a,x0)#Деление многочлена на (х-х0) по схеме Горнера
local i ::integer;
b[0]:=a[0];
for i from 1 to n-1 do
b[i]:=a[i]+b[i-1]*x0
od;
eval(b);
end:
Warning, `b` is implicitly declared local to procedure `gorner`
Текст процедуры, представляет собой программную реализацию алгоритма вычисления значения производной в точкe.
proizv:=proc(n,a,m,х0)
local i,k::integer;
global b;
for i from 0 to n do
b[-1,i]:=a[i] od;
for k from 0 to m do
b[k,0]:=b[k-1,0];
for i from 1 to n-k do
b[k,i]:=b[k-l,i]+b[k,i-l]*xO od;
od;
Pr:=1;
for i from 2 to m do
Pr:=Pr*i
od;
Pr:=(Pr*b[m,n-m]);
Pr;
end:
Warning, `Pr` is implicitly declared local to procedure `proizv`
В следующей процедуре отражено вычисление корня алгебраического уравнения по методу спуска.
pol_nol:=proc(n,a,ер)
local i,gamma,alfa,betta,h,z0,t;
gamma:=-a[l]/a[0];
t:=pol(n,a,gamma);
z1:=evalf(gamma+I*(abs(t/a[0]))^(1/n));
while true do
z0:=z1;
alfa:=pol(n,a,z0);
betta:=evalf(proizv(n,a,l,z0));
h:=-alfa/betta;
z1:=z0+h;
if abs(h)<ep then break;fi;
od;
evalf(z1);
end:
И в итоге представлена основная процедура, которая позволяет найти все корни уравнения.
korni:=proc(n,a,ер)
local j,y;global m,c,d,x,k,r;
c:=a;m:=n;r:=n;
for k from 1 to r do
y:=evalf(pol_nol (m,c,ep));
x[k]:=y;
d:=eval(gorner(m,c,y));
m:=m-1;
for j from 0 to m do
c[j]:=evalf(d[j])od;
od;
for i from 1 to r do
if abs(Ia(x[i]))<ep then x[i]:=Re(x[i]) fi;od;
RETURN (eval(x));
end: