Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-NonLinEqns_with_Maple5.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
296.45 Кб
Скачать

4. Решение систем нелинейных уравнений

Метод Ньютона

Для системы второго порядка

f(x,y) = 0,

g(x,y) = 0.

Последовательные приближения по методу Ньютона вычисляются по формулам

, ,

где , , .

Метод Ньютона сходится, если начальное приближение выбрано удачно и матрица Якоби невырожденная, причем сходимость квадратичная. На практике итерации обычно заканчивают, когда одновременно достаточно малы значения |f(xn,yn)| и |g(xn,yn)| или разности |xn+1xn| и |yn+1yn|. Для выбора начального приближения применяют графический метод, метод проб и т.д.

Пример. Решить систему уравнений

Решение в системе Maple:

1) Очистим оперативную память. Нам в дальнейшем потребуется функции det и implicitplot, которых нет в ядре системы, поэтому здесь подключим пакет линейной алгебры linalg и графических построений plots.

> restart;

> with(linalg): with(plots):

2) Зададим функции f(x,y) и g(x,y).

> f:=(x,y)->x^7-5*x^2*y^4+1510;

> g:=(x,y)->y^5-3*x^4*y-105;

3) Для отделения корней системы построим графики неявных функций f(x,y)=0 и g(x,y)=0.

> implicitplot({f(x,y)=0,g(x,y)=0},x=-5..5,y=-5..5);

Видим пять пересечений графиков, значит, система имеет (минимум) пять корней.

4) Определим якобиан

> J:=[[diff(f(x,y),x),diff(f(x,y),y)],[diff(g(x,y),x),diff(g(x,y),y)]];

5) Введём функцию Jn(x,y), являющуюся определителем матрицы J.

> Jn:=unapply(det(J),x,y);

6) Определим величины An и Bn в виде соответствующих определителей

> An:=det([[f(x,y),diff(f(x,y),y)],[g(x,y),diff(g(x,y),y)]]);

> Bn:=det([[diff(f(x,y),x),f(x,y)],[diff(g(x,y),x),g(x,y)]]);

7) Присвоим начальные значения переменным. x0 и y0 определяет точку начального приближения (определяется графически).

> x0:=-3; y0:=-1.; eps:=0.001: n:=0:

8) Организуем цикл вычислений по методу Ньютона

> while abs(f(x0,y0))+abs(g(x0,y0))>eps do

> if abs(Jn(x0,y0))<10^(-4) then print(`Якобиан = 0`); break fi;

> x0:=x0-subs(x=x0,y=y0,An)/Jn(x0,y0);

> y0:=y0-subs(x=x0,y=y0,Bn)/Jn(x0,y0);

> if n=50 then break fi;

> n:=n+1;

> od:

9) Вывод результата: (x0,y0) – решение системы, n – число итераций

> evalf({x0,y0});n;

10) Для вычисления остальных четырёх корней системы нужно выполнить шаги 7)–9), предварительно изменив в п. 7) начальные приближения соответственно на

> x0:=-3; y0:=-3.;

> x0:=2; y0:=-3.;

> x0:=-2; y0:=3.;

> x0:=2; y0:=3.;

5. Использование стандартных функций системы Maple

Maple имеет мощные средства для решения линейных и нелинейных уравнений. Для аналитического решения используется достаточно универсальная и гибкая функция solve. solve(eqn, var);

solve({eqn1,eqn2,…}, {var1,var2,…});

Здесь eqn, eqn1, … – уравнения, содержащие неизвестные переменные var, var1,

Используя функцию solve в комбинации с функциями evalf или convert, можно получить корни в численном виде. Если результат представлен через функцию RootOf, то зачастую можно получить все корни с помощью функции allvalues.

Для получения численного решения нелинейного уравнения или системы уравнений удобно использовать функцию

fsolve(eqns,vars,options);

Эта функция может быть использована со следующими параметрами:

complex – находит один или все корни (чаще полинома) в комплексной форме

fulldigits – определяет счет для полного числа цифр, заданного функцией Digits

maxsols=n – задает вычисление только n корней

interval – задается в виде a..b или x=a..b, или { x=a..b, y=c..d, … } и обеспечивает поиск корней в указанном интервале.

Для вычисления корней полиномов, зависящих от одной переменной, существует специальная функция roots. В простейшем варианте roots(a) (или roots(a,x) ) она возвращает рациональные корни полинома a с указанием их кратностей.

Примеры.

> solve(x^3-2*x+1,x);

> eq:= x^4-5*x^2+6*x=2:

> sols:= [solve(eq,x)];

sols := [–1+ , –1– , 1, 1]

> sols[1];

–1+

> evalf(sols);

[.732050808, –2.732050808, 1., 1.]

> solve(sqrt(ln(x))=2,x);

e4

> evalf(");

54.59815003

> solve(x^5-3*x^4+2*x^2-x+3,x);

RootOf(_Z5 – 3 _Z4 + 2 _Z2 – _Z + 3)

> allvalues(");

–1.127479307, .03687403922 – .8565945569 I,

.03687403922 + .8565945569 I, 1.327862375, 2.725868853

> solve({exp(x)=sin(x)},x);

{x = RootOf(_Z – ln(sin(_Z)))}

> allvalues(");

{x = .3627020561 – 1.133745919 I}

> fsolve(exp(x)=sin(x),x=–4..0);

–3.183063012

> fsolve(exp(x)=sin(x),x=–7..–4);

–6.281314366

> fsolve(exp(x)=sin(x),x,complex);

.3627020561 – 1.133745919 I

> solve( {x^2*y^2=0, x-y=1} );

{y = –1, x = 0}, {y = –1, x = 0}, {x = 1, y = 0}, {x = 1, y = 0}

> f:=x^7-5*x^2*y^4+1510:

> g:=y^5-3*x^4*y-105:

> s1:=solve({f,g},{x,y}); #Результат этой функции не приводится

> evalf(");

{x = –2.844483289, y = –.5348543088}

> allvalues(s1); # Ниже приводится только часть результата

{x = –2.844483289, y = –.5348543088}, {y = –2.573256586, x = –2.304767679},

{y = .1857181696+2.786617077 I, x = –2.107398990–.1931448896 I}

{x = –2.107398990+.1931448896 I, y = .1857181696–2.786617077 I},

{y = 2.957183542, x = –1.922332687},

--------------------------------------------------------

{x = 15.00039270, y = 19.74216374}

> fsolve({sin(x+y)-exp(x)*y=0,x^2-y=2},{x,y},{x=-1..1,y=-2..0});

{x = –.6687012050, y = –1.552838698}

> roots(2*x^3+11*x^2+12*x-9);

[[–3, 2], [ , 1]]