Введение в Octave

Нелинейные уравнения и системы

Разбить на страницы
Показывать лекцию целиком

В общем случае аналитическое решение уравнения $$f (x) = 0$$ можно найти только для узкого класса функций. Чаще всего приходится решать это уравнение численными методами. Численное решение уравнения проводят в два этапа. На первом этапе отделяют корни уравнения, т.е. находят достаточно тесные промежутки, в которых содержится только один корень. Эти промежутки называют интервалами изоляции корня. Определить интервалы изоляции корня можно, например, изобразив график функции. Идея графического метода основана на том, что непрерывная функция $$f (x)$$ имеет на интервале $$[a, b]$$ хотя бы один корень, если она поменяла на этом интервале знак: $$f (a) \cdot f (b) < 0$$. Границы интервала $$a$$ и $$b$$ называют пределами интервала изоляции Графический метод весьма приблизителен, отделить корни для функции $$f(x)=xsin \left (\frac{1}{x}\right)$$, при $$x \not = 0$$ и $$f (x) = 0$$ при $$x =0$$ ни на каком интервале, содержащем нуль $$(x = 0)$$ таким способом не удастся. (Прим. редактора). . На втором этапе проводят уточнение отделённых корней, т.е. находят корни с заданной точностью.

7.1 Решение алгебраических уравнений

Любое уравнение $$P (x) = 0$$, где $$P (x)$$ это многочлен (полином), отличный от нулевого, называется алгебраическим уравнением относительно переменной $$x$$. Всякое алгебраическое уравнение относительно $$x$$ можно записать в виде

$$a_0+a_1x+a_2x^2+\cdots+a_nx^n=0, где a_0 \not=0, n\ge 1$$

$$a_i$$— коэффициенты алгебраического уравнения $$n$$–й степени. Например, линейное уравнение это алгебраическое уравнение первой степени, квадратное — второй, кубическое — третьей и так далее.

В Octave определить алгебраическое уравнение можно в виде вектора его коэффициентов $$p={a_n,a_{n-1},...,a_1,a_0}$$. Например, полином $$2x^5+3x^3-1=0$$ задаётся вектором:

	
>>> p =[2,0,3,0, -1]
p = 2 0 3 0 -1

Рассмотрим функции, предназначенные для действий над многочленами.

Произведение двух многочленов вычисляет функция $$q =conv(p1, p2)$$, где $$p1$$ — многочлен степени $$n$$, $$p2$$ — многочлен степени $$m$$. Функция формирует вектор $$q$$, соответствующий коэффициентам многочлена степени $$n + m$$, полученного в результате умножения $$p1$$ на $$p2$$.

Пример 7.1. Определить многочлен, который получится в результате умножения выражений $$3x^4-7x^2+5$$ и $$x^3+2x-1.$$

Как видно из листинга 7.1 в результате имеем: $$(3x^4-7x^2+5)(x^3+2x-1)=3x^7-x^5-3x^4-9x^3+7x^2+10x-5.$$

	
>>> p1=[3 0 -7 0 5];
>>> p2=[1 0 2 -1];
>>> p=conv (p2, p1)
p = 3 0 -1 -3 -9 7 10 -5

Частное и остаток от деления двух многочленов находит функция $$[q, r] = deconv(p1, p2)$$, здесь, $$p1$$ — многочлен степени $$n,\ p2$$ — многочлен степени $$m$$. Функция формирует вектор $$q$$ — коэффициенты многочлена, который получается в результате деления $$p1$$ на $$p2$$ и вектор $$r$$ — коэффициенты многочлена, который является остатком от деления $$p1$$ на $$p2$$.

Пример 7.2. Найти частное и остаток от деления многочлена $$x^6-x^5+3x^4-8x^2+x-10$$ на многочлен $$x_3+x-1=0$$.

В результате имеем (см. листинг 7.2):

$$\frac{x^6-x^5+3x^4-8x^2+x-10}{x^3+x-1}=x^3-x^2+2x+2+\frac{1}{-11x^2+x-8}.$$
	
>>> p1=[1 -1 3 0 -8 1 -10];
>>> p2=[1 0 1 -1];
>>> [q, r]=deconv(p1, p2)
q = 1 -1 2 2
r = 0 0 0 0 -11 1 -8

Выполнить разложение частного двух многочленов, представляющих собой правильную дробь на простейшие рациональные дроби вида

$$\frac{P_1(x)}{P_2(x)}=\sum\limits_{j=1}^M \frac{a_j}{(x-b_j)^{k^j}}+\sum \limits_{i=1}^Nc_ix^{N_-i}$$

можно с помощью функции $$[a, b, c, k] = residue(p1, p2)$$, где $$p1$$ — многочлен степени $$n$$ (числитель), $$p2$$ — многочлен степени $$m$$ (знаменатель), причём $$n < m$$.

В результате работы функция формирует четыре вектора: $$a$$ — вектор коэффициентов, расположенных в числителях простейших дробей, $$b$$ — вектор коэффициентов, расположенных в знаменателях простейших дробей, $$k$$ — вектор степеней знаменателей простейших дробей (кратность), $$c$$ — вектор коэффициентов остаточного члена.

Пример 7.3. Разложить выражение $$\frac{x^3+1}{x^4-3x^3+3x^2-x}$$ на простейшие дроби.

Проанализировав листинг 7.3 запишем решение:

$$\frac{x^3+1}{x^4-3x^3+3x^2-x}=\frac{2}{x-1}+\frac{1}{(x-1)^2}+\frac{2}{(x-1)^3}+\frac{-1}{x}.$$

Значение вектора $$c =[](0 \times0)$$ говорит об отсутствии остаточного члена.

	
>>> p1=[1 0 0 1 ];
>>> p2=[1 -3 3 -1 0];
>>> [a, b, c, k]= residue (p1, p2)
a =
	2.00000
	1.00000
	2.00000
	-1.00000
b =
	1.00000
	1.00000
	1.00000
	0.00000
	c = [ ] ( 0 x0 )
k =
	1
	2
	3
	1

Пример 7.4. Разложить выражение $$\frac{7x^2+26x-9}{x^4+4x^3+4x^2-9}$$ на простейшие дроби.

Из листинга 7.4 видно, что значения векторов $$a$$ и $$b$$ — комплексные числа, то есть, на первый взгляд кажется, что выражение невозможно разложить на простейшие рациональные дроби. Однако задача имеет решение:

$$\frac{7x^2+26x-9}{x^4+4x^3+4x^2-9}=\frac{1}{x-1}+\frac{1}{x+3}+\frac{-2x+5}{x^2+2x+3}.$$

>Выражение $$\frac{-2x+5}{x^2+2x+3}$$— простейшая дробь вида $$\frac{Mx+N}{x^2+px+q}$$. Здесь знаменатель невозможно разложить на простые рациональные множители первой степени. Таким образом, функция $$residue(p1, p2)$$ выполняет разложение только на простейшие дроби вида $$\frac{a}{(x-b)^k}$$.

	
>>> p1=[1 26 -9];
>>> p2=[1 4 4 -9];
>>> [a, b, c, k]= residue(p1, p2)
a =
	-0.100000 - 6.120680i
	-0.100000 + 6.120680i
	 1.200000 + 0.000000i
b =
	-2.50000 + 1.65831i
	-2.50000 - 1.65831i
	 1.00000 + 0.00000i
c = [ ] (0x0)
k =
	1
	1
	1

Вычислить значение многочлена в заданной точке можно с помощью функции $$polyval(p, x)$$, где $$p$$ — многочлен степени $$n,\ x$$ — значение, которое нужно подставить в многочлен.

Пример 7.5. Вычислить значение многочлена $$x^6-x^5+3x^4-8x^2+x-10$$ в точках $$x_1=-1,x_2=1$$ (листинг 7.5).

	
>>> p=[1 -1 3 0 -8 1 -10];
>>> x=[-1,1];
>>> polyval(p, x)
ans = -14 -14

Вычислить производную от многочлена позволяет функция $$polyder(p)$$, где $$p$$ — многочлен степени $$n$$. Функция формирует вектор коэффициентов многочлена, являющегося производной от $$p$$.

Производную произведения двух векторов вычисляет функция $$polyder(p1, p2)$$, где $$p1$$ и $$p2$$ — многочлены.

Вызов функции в общем виде $$[q, r] = polyder(p1, p2)$$ приведёт к вычислению производной от частного p1 на $$p2$$ и выдаст результат в виде отношения полиномов $$q$$ и $$r$$.

Пример 7.6. Вычислить производную от многочлена $$x^6-x^5+3x^4-8x^2+x-10$$

Листинг 7.6 показал, что решением примера является многочлен $$6x^5-5x^4+12x^3-16x+1$$.

	
>>> p=[1 -1 3 0 -8 1 -10];
>>> polyder(p)
ans = 6 -5 12 0 -16 1

Пример 7.7. Вычислить производную от произведения многочленов $$(3x^4-7x^2+5)(x^3+2x-1)$$.

Листинг 7.7 показал, что решением примера является многочлен $$21x^6-5x^4-12x^3-27x^2+14x+10$$.

	
>>> p1=[3 0 -7 0 5];
>>> p2=[1 0 2 -1];
>>> polyder(p1, p2)
ans = 21 0 -5 -12 -27 14 10

Пример 7.8. Вычислить производную от выражения

$$\frac{x^3+1}{x^4-3x^3+3x^2-x.$$

Из листинга 7.8 видно, что решение примера имеет вид

$$\frac{-x^4-2x^3-4x+1}{x^6-4x^5+6x^4-4x^3+x^2.$$
	
>>> p1=[1 0 0 1];
>>> p2=[1 -3 3 -1 0];
>>> [q, r]= polyder(p1, p2)
q = -1 -2  0  -4  1
r = 1 -4  6  -4  1  0  0

Взять интеграл от многочлена позволяет функция $$polyint(p[, k])$$, где $$p$$ — многочлен степени $$n,\ K$$ — постоянная интегрирования, значение $$K$$ по умолчанию равно нулю. Функция формирует вектор коэффициентов многочлена, являющегося интегралом от $$p$$.

Пример 7.9. Найти $$\int(x^2+2x+3)dx$$.

Согласно листингу 7.9 решение имеет вид:

$$\int(x2+2x+3)dx=\frac{1}{3}x^3+x^2+3x.$$

Если определить значение постоянной интегрирования (вторая часть листинга 7.9), то решение будет таким:

$$\int(x^2+2x+3)dx=\frac{1}{3}x^3+x^2+3x+5.$$
	
>>> p=[1 2 3];
>>> polyint(p)
ans = 0.33333 1.00000 3.00000 0.00000
% Указываем постоянную интегрирования
>>> polyint(p, 5)
ans = 0.33333 1.00000 3.00000 5.00000

Построить многочлен по заданному вектору его корней позволяет функция $$poly(x)$$, где $$x$$ — вектор корней искомого полинома.

Пример 7.10. Записать алгебраическое уравнение, если известно, что его корни $$x_1=-2,x_2=3$$.

Согласно листингу 7.10 решение примера имеет вид: $$x^2-x-6=0$$

	
>>> x=[-2 3];
>>> poly(x)
ans = 1 -1 -6

Решить алгебраическое уравнение $$ P (x) = 0$$ можно при помощи встроенной функции $$roots(p)$$, где $$p$$ — многочлен степени $$n$$. Функция формирует вектор, элементы которого являются корнями заданного полинома.

Пример 7.11. Решить алгебраическое уравнение $$x^2-x-6=0$$.

Из листинга 7.11 видно, что значения $$x_1=-2,x_2=3$$ являются решением уравнения.

	
>>> p=[1 -1 -6];
>>> roots(p)
ans =
	 3
	-2

Пример 7.12. Найти корни полинома $$2x^3-3x^2-12x-5=0$$.

Найдём корни полинома, так как показано в листинге 7.12.

	
>>> p=[2 -3 -12 -5];
>>> x=roots(p)
x =
	3.44949
	-1.44949
	-0.50000

Графическое решение заданного уравнения показано в листинге 7.13 и на рис. 7.1. Точки пересечения графика с осью абсцисс и есть корни уравнения. Не трудно заметить, что графическое решение совпадает с аналитическим (листинг 7.12).

	
cla; okno1=figure();
x = - 2:0.1:5.5;
y=2-x.^3-3-x.^2-12-x-5;
pol=plot(x, y);
set(pol, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-2, 4]);
set(gca, ’ylim’, [-30, 30]);
set(gca, ’xtick’, [-2:0.5:4]);
set(gca, ’ytick’, [-30:5:30]);
grid on;
xlabel(’x’); ylabel(’y’);
title(’Plot y=2*x^3-3*x^2-12*x-5’);
(рис 7.1) Графическое решение примера 7.12

Пример 7.13. Найти решение уравнения $$x^4+4x^3+4x^2-9=0$$.

Графическое решение примера было получено при помощи последовательности команд приведённых в первой части листинга 7.14. На рис. 7.2 видно, что заданное алгебраическое уравнение имеет два действительных корня. Аналитическое решение примера, представленное во второй части листинга 7.14 показывает не только действительные, но и комплексные корни.

	
% Графическое нахождение корней
cla; okno1=figure();
x = -4:0.1:2;
y=x.^4+4-x.^3+4-x.^2-9;
pol=plot(x, y);
set(pol, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-4, 2]);
set(gca, ’ylim’, [-10, 5]);
set(gca, ’xtick’, [-4:0.5:2]);
set(gca, ’ytick’, [-10:1:5]);
grid on;
xlabel(’x’); ylabel(’y’);
title(’Plot y=x^4+4*x^3+4*x^2-9’);
% Аналитическое нахождение корней
>>> p=[1 4 4 0 -9];
>>> x=roots(p)
x =
	-3.00000 + 0.00000i
	-1.00000 + 1.41421i
	-1.00000 - 1.41421i
	 1.00000 + 0.00000i
(рис 7.2) Графическое решение примера 7.13

7.2 Решение трансцендентных уравнений

Уравнение, в котором неизвестное входит в аргумент трансцендентных функций, называется трансцендентным уравнением. К трансцендентным уравнениям принадлежат показательные, логарифмические, тригонометрические.

Для решения трансцендентных уравнений вида $$f (x) = 0$$ в Octave существует функция $$fzero(name, x0)$$ или $$fzero(name, [a, b])$$, где $$name$$ — имя функции, вычисляющей левую часть уравнения, $$x0$$ — начальное приближение к корню, $$[a, b]$$ — интервал изоляции корня.

Если функция вызывается в формате: $$[x, y] = fzero(name, x0)$$, то здесь $$x$$ — корень уравнения, $$y$$ — значение функции в точке $$x$$.

Пример 7.14. Найти решение уравнения:

$$\sqrt[3]{(2x-3)^2}- \sqrt[3]{(x-1)^2}=0.$$

Начнём решение данного трансцендентного уравнения с определения интервала изоляции корня. Воспользуемся для этого графическим методом. Построим график функции, указанной в левой части уравнения (листинг 7.15), создав предварительно функцию для её определения.

	
% Функция для вычисления левой части уравнения f(x)=0
function y=f1(x)
	y=((2-x-3).^2).^(1/3)-((x-1).^2).^(1/3);
end;
% Построение графика функции f(x)
cla; okno1=figure();
x = -1:0.1:3;
y=f1(x);
pol=plot(x, y);
set(pol, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-1, 3]); set(gca, ’ylim’, [-1,1.5]);
set(gca, ’xtick’, [-1:0.5:3]); set(gca, ’ytick’,[-1:0.5:1.5]);
grid on; xlabel(’x’); ylabel(’y’);
title(’Plot y=(2x-3)^{2/3}-(x-1)^{2/3}’);

На графике (рис. 7.3) видно, что функция $$f (x)$$ дважды пересекает ось $$Ox$$. Первый раз на интервале [1, 1.5], второй — [1.5, 2.5].

Уточним корни, полученные графическим методом. Воспользуемся функцией, вычисляющей левую часть заданного уравнения из листинга 7.15 и обратимся к функции $$fzero$$, указав в качестве параметров имя созданной функции и число (1.5) близкое к первому корню:

	
>>> x1=fzero(’f1’, 1.5)
x1 = 1.3333

Теперь применим функцию $$fzero$$, указав в качестве параметров имя функции, и интервал изоляции второго корня:

	
>>> x2=fzero(’f1’, [1.52.5])
x1= 2

Не трудно заметить, что и в первом и во втором случае функция $$fzero$$ правильно нашла корни заданного уравнения.

(рис 7.3) Графическое решение примера 7.14

Ниже приведён пример некорректного обращения к функции $$fzero$$, здесь интервал изоляции корня задан неверно. На графике видно, что на концах этого интервала функция знак не меняет, или, другими словами, выбранный интервал содержит сразу два корня.

	
>>>fzero(’f1’, [1 3])
error: fzero: not a valid initial bracketing
error: called from:
error: /usr/share/octave/3.4.0/m/optimization/fzero.m at line 170, column 5

В следующем листинге приведён пример обращения к функции $$fzero$$ в полном формате:

	
>>> [X(1),Y(1)]= fzero(’f1’, [1 1.5]);
>>> [X(2),Y(2) ]= fzero(’f1’, [1.5 2.5]);
>>> X % Решение уравнения
X = 1.3333 2.0000
>>> Y % Значения функции в точке Х
Y = -2.3870e-15  0.0000e+00

Пример 7.15. Найти решение уравнения $$x^4+4x^3+4x^2-9=0$$.

Как видим, левая часть уравнения представляет собой полином. В примере 7.13 было показано, что данное уравнение имеет четыре корня: два действительных и два мнимых (листинг 7.14).

Листинг 7.16 демонстрирует решение алгебраического уравнения при помощи функции $$fzero$$. Не трудно заметить, что результатом работы функции являются только действительные корни. Графическое решение (рис. 7.2) подтверждает это: функция дважды пересекает ось абсцисс.

	
function y=f2(x)
	y=x.^4+4-x.^3+4-x.^2-9;
end;
>>> [X(1),Y(1)]= fzero(’f2’, [-4 -2]);
>>> [X(2),Y(2)]= fzero(’f2’, [0 2]);
>>> X
>>> Y
X = -3 1
Y = 0 0

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

Напомним, что если заданы $$m$$ уравнений с $$n$$ неизвестными и требуется найти последовательность из $$n$$ чисел, которые одновременно удовлетворяют каждому из $$m$$ уравнений, то говорят о системе уравнений.

Несложную систему элементарной подстановкой можно привести к нелинейному уравнению. Рассмотрим несколько примеров, в которых описан такой приём решения нелинейной системы.

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

$$\left\{\begin{aligned}{(x^2+2y^2=1\\x-y=1.\end{aligned}$$

Найдём графическое решение с помощью команд листинга 7.17. На рис. 7.4 видно, что система имеет два решения.

	
% Верхняя часть эллипса
function y=f1(x)
	y=sqrt((1-x.^2)/2);
end;
% Нижняя часть эллипса
function y=f2(x)
	y= -sqrt((1-x.^2)/2);
end;
% Прямая
function y=f3(x)
	y=x-1;
end;
% Построение графика
cla; okno1=figure();
x1 = -1:0.01:1; x2 = -1.5:0.1:1.5;
L1=plot(x1, f1(x1), x1, f2(x1));
set(L1, ’LineWidth’, 2, ’Color’, ’k’)
hold on
L2=plot(x2, f3(x2));
set(L2, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-1.5, 1.5]); set(gca, ’ylim’, [-1, 1]);
set(gca, ’xtick’, [-1.5:0.2:1.5]); set(gca, ’ytick’,[- 1:0.2:1]);
grid on; xlabel(’x’); ylabel (’y’);
(рис 7.4) Решение системы нелинейных уравнений из примера 7.16

Не сложно убедиться, что данная система легко сводится к одному уравнению: $$\{y=x-1,x^2+2y^2=1\} \Rightarrow x^2+2(x-1)^2-1=0 \Rightarrow 3x^2-4x+1=0$$.

Решив это уравнение с помощью функции $$roots$$, найдём значения $$x$$. Затем подставим их в одно из уравнений системы, например во второе, и тем самым вычислим значения $$y$$:

	
>>> p=[3 -4 1];
>>> x=roots(p)
x =
	1.00000
	0.33333
>>> y=x-1
y =
	-1.1102e-16
	-6.6667e-01
(рис 7.5) Графическое решение примера 7.16

Понятно, что система имеет два решения $$x_1=1,y_1=0$$ и $$x_2=\frac{1}{3},y_2=-\frac{2}{3}$$ (рис. 7.4). Графическое решение уравнения (листинг 7.18), к которому сводится система, показано на рис. 7.5.

	
function y=f(x)
	y=3-x.^2-4-x+1;
end;
cla; okno1=figure();
x = 0:0.01:1.5;
L=plot(x, f(x)); set(L, ’LineWidth’, 2, ’Color’, ’k’)
set(gca, ’xlim’, [0, 1.5]); set(gca, ’ylim’, [-0.5, 1]);
set(gca, ’xtick’, [0:0.1:1.5]); set(gca, ’ytick’, [-0.5:0.1:1]);
grid on; xlabel(’x’); ylabel(’y’);

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

$$\left\{\begin{aligned}sin(x+1)-y=1.2\\2x+cos(y)=2.\end{aligned}$$

Проведём элементарные алгебраические преобразования и представим систему в виде одного уравнения: $$\{y=sin(x+1)-1.2,2x+cos(y)-2=0\}\Rightarrow 2x+cos(sin(x+1)-1.2)-2=0$$

Рис. 7.6 содержит графическое решение уравнения (листинг 7.19), к которому сводится система, его удобно использовать для выбора начального приближения функции $$fzero$$. Вторая часть листинга 7.19 содержит решение заданной системы. Здесь значения $$x$$ вычисляется при помощи функции $$fzero$$, а значение y определяется из первого уравнения системы.

(рис 7.6) Графическое решение примера 7.17
	
% Строим график
function y=fun(x)
	z=sin(x+1)-1.2;
	y=2-x+cos(z)-2;
end;
cla; okno1=figure();
x = -1:0.01:1;
L=plot(x, fun(x)); set(L, ’LineWidth’, 2, ’Color’, ’k’)
grid on; xlabel(’x’); ylabel(’y’);
% Находим аналитическое решение системы вблизи x = 0
>>> X=fzero(’fun’, 0)
>>> Y=sin(X+1)-1.2
X = 0.51015
Y = -0.20184

Решить систему нелинейных уравнений, или одно нелинейное уравнение, в Octave можно с помощью функции $$fsolve(fun, x0)$$, где $$fun$$ — имя функции, которая определяет левую часть уравнения $$f (x) = 0$$ или системы уравнений $$F (x) = 0$$ (она должна принимать на входе вектор аргументов и возвращать вектор значений), $$x0$$ — вектор приближений, относительно которого будет осуществляться поиск решения.

Пример 7.18. Найти решение системы нелинейных уравнений:

$$\left\{\begin{aligned}cos(x)+2y=2\\ \frac{x^2}{3}-\frac{y^2}{3}=1.\end{aligned}$$

Решим систему графически, для чего выполним перечень команд указанных в листинге 7.20. Результат работы этих команд показан на рис. 7.7. Понятно, что система имеет два корня.

	
% Уравнения, описывающие линии гиперболы
function y=f1(x)
	y=sqrt(x.^2_3);
end;
function y=f2(x)
	y=_sqrt(x.^2_3);
end;
% Уравнение косинусоиды
function y=f3(x)
	y=1_cos(x)/2;
end;
% Построение графика
cla; okno1=figure();
x1 = _5:0.001:_sqrt(3);
x2=sqrt(3):0.001:5;
x3 = _5:0.1:5;
% Гипербола
L1=plot(x1, f1(x1), x1, f2(x1), x2, f1(x2), x2, f2(x2));
set(L1, ’LineWidth’, 3, ’Color’, ’k’)
hold on
% Косинусоида
L2=plot(x3, f3(x3)); set(L2, ’LineWidth’, 3, ’Color’, ’k’)
grid on; xlabel(’x’); ylabel(’y’);

Составим функцию, соответствующую левой части системы. Здесь важно помнить, что все уравнения должны иметь вид $$F (x) = 0$$. Кроме того, обратите внимание, что $$x$$ и $$y$$ в этой функции — векторы ($$x$$ — вектор неизвестных, $$y$$ — вектор решений).

	
function[y]= fun(x)
	y(1)=cos(x(1))+2-x(2)-2;
	y(2)=x(1)^2/3-x(2)^2/3-1;
end;

Теперь решим систему, указав в качестве начального приближения сначала вектор [-3, -1], затем [1, 3].

(рис 7.7) Графическое решение примера 7.18
	
>>> [X1_Y1]= fsolve(’fun’, [-3 -1])
X1_Y1 = -2.1499  1.2736
>>> [X2-Y2]= fsolve(’fun’, [1 3])
X2_Y2 = 2.1499  1.2736

Понятно, что решением примера являются пары $$x_1=-2.15,y_1=1.27$$ и $$x_2=2.15,y_2=1.27$$, что соответствует графическому решению (рис. 7.7).

Если функция решения нелинейных уравнений и систем имеет вид $$[x, f, ex] = fsolve(fun, x0)$$, то здесь $$x$$ — вектор решений системы, $$f$$ — вектор значений уравнений системы для найденного значения $$x,\ ex$$ — признак завершения алгоритма решения нелинейной системы, отрицательное значение параметра ex означает, что решение не найдено, ноль — досрочное прерывание вычислительного процесса при достижении максимально допустимого числа итераций, положительное значение подтверждает, что решение найдено с заданной точностью.

Пример 7.19. Решить систему нелинейных уравнений:

$$\left\{\begin{aligned}x_1^2+x_2^2+x_3^2=1\\ 2x_1^2+x_2^2-4x_3=0\\ 3x_1^2-4x_2^2+x_3^2=0.\end{aligned}$$

Листинг 7.21 содержит функцию заданной системы и её решение. Обратите внимание на выходные параметры функции $$fsolve$$. В нашем случае значения функции $$f$$ для найденного решения $$x$$ близки к нулю и признак завершения $$ex$$ положительный, значит, найдено верное решение.

(рис 7.8) Графическое решение примера 7.20
	
function f=Y(x)
	f(1)=x(1)^2+x(2)^2+x(3)^2-1;
	f(2)=2-x(1)^2+x(2)^2-4-x(3);
	f(3)=3-x(1)^2-4-x(2)+x(3)^2;
end
>>> [x, f, ex]= fsolve(’Y’, [0.5 0.5 0.5] )
x = 0.78520  0.49661  0.36992
f = 1.7571e-08  3.5199e-08  5.2791e-08
ex = 1

Пример 7.20. Решить систему:

$$\left\{\begin{aligned}(x^2+y^2=1\\ 2sin(x-1)+y=1.\end{aligned}$$

Графическое решение системы (рис. 7.8) показало, что она корней не имеет. Рисунок был получен с помощью команд листинга 7.22.

	
% Уравнения линий окружности
function y=f1(x)
	y=sqrt(1-x.^2);
end;
function y=f2(x)
	y= -sqrt(1-x.^2);
end;
% Уравнение синусоиды
function y=f3(x)
	y=1-2-sin(x-1);
end;
okno1=figure(); cla;
x1 = -1:0.01:1; x3 = -2:0.1:2;
% Окружность
L1=plot(x1, f1(x1), x1, f2(x1)); set(L1, ’LineWidth’, 3, ’Color’, ’k’)
hold on
% Синусоида
L2=plot(x3, f3(x3)); set(L2, ’LineWidth’, 3, ’Color’, ’k’)
grid on; xlabel(’x’); ylabel(’y’);

Однако применение к системе функции $$fsolve$$ даёт положительный ответ, что видно из листинга 7.23. Происходит это потому, что алгоритм, реализованный в этой функции, основан на минимизации суммы квадратов компонент вектор–функции. Следовательно, функция $$fsolve$$ в этом случае нашла точку минимума, а наличие точки минимума не гарантирует существование корней системы в её окрестности.

	
function[y]= fun(x)
	y(1)=x(1)^2+x(2)^2-1;
	y(2)=2-sin(x(1)-1)+x(2)-1;
end;
>>> [ X1_Y1]= fsolve(’fun’, [1 1])
X1_Y1 = 1.04584  0.52342

7.4 Решение нелинейных уравнений и систем в символьных переменных

Напомним, что для работы с символьными переменными в Octave должен быть подключён специальный пакет расширений octave-symbolic. Процедура установки пакетов расширений описана в первой главе. Техника работы с символьными переменными описана в п. 2.7 второй главы.

Для решения системы нелинейных уравнений или одного нелинейного уравнения можно воспользоваться функцией $$symfsolve$$.

Пример 7.21. Решить уравнение $$\frac{e^x}{5}-3(2x-1)=0$$.

(рис 7.9) Графическое решение примера 7.21

Команды, с помощью которых выполнено графическое (рис. 7.9) и аналитическое решение представлены в листинге 7.24.

	
clear all; clf; cla;
symbols
x=sym("x");
y=Exp(x)/5-3-(2-x-1);
L=ezplot(’exp(x)/5-3*(2*x-1)’);
set(L, ’LineWidth’, 2, ’Color’, ’k’)
set(gca, ’xlim’, [-2,6]); set(gca, ’ylim’, [-20, 50]);
set(gca, ’xtick’,[-2:0.5:6]); set(gca, ’ytick’, [-20:10:50]);
grid on; xlabel(’x’); ylabel(’y’);
>>> q1 = symfsolve(y, 0)
>>> q2 = symfsolve(y, 4)
q1 = 0.55825
q2 = 4.8777

Пример 7.22. Решить систему:

$$\left\{\begin{aligned}x^2+y^2+3x-2y=4\\ x+2y=5.\end{aligned}$$ (рис 7.10) Графическое решение примера 7.22

Решение системы (листинг 7.25) показало, что она имеет два корня$$x_1=1,y_1=2$$ и $$x_2=-2.2,y_2=3.6$$, что соответствует графическому решению (рис. 7.10).

	
clear all; clf; cla;
symbols
x=sym("x");
y=sym("y");
L1=ezplot(’x^2+y^2+3*x-2*y-4’); set(L1, ’LineWidth’, 2, ’Color’, ’k
	’)
hold on
L2=ezplot(’x+2*y-5’); set(L2, ’LineWidth’, 2, ’Color’, ’k’)
set(gca, ’xlim’, [-5, 4]); set(gca, ’ylim’, [-2, 5]);
set(gca, ’xtick’, [-5:0.5:4]); set(gca, ’ytick’, [-2:0.5:5]);
grid on; xlabel(’x’); ylabel(’y’);
title(’x^2+y^2+3x-2y=4, x+2y=5’)
f1=x^2+y^2+3-x-2-y-4;
f2=x+2-y-5;
>>> q1 = symfsolve(f1, f2, {x==0,y==1})
>>> q2 = symfsolve(f1, f2, {x==-1,y==3})
q1 = 1.0000  2.0000
q2 = -2.2000  3.6000
Страницы:

В общем случае аналитическое решение уравнения $$f (x) = 0$$ можно найти только для узкого класса функций. Чаще всего приходится решать это уравнение численными методами. Численное решение уравнения проводят в два этапа. На первом этапе отделяют корни уравнения, т.е. находят достаточно тесные промежутки, в которых содержится только один корень. Эти промежутки называют интервалами изоляции корня. Определить интервалы изоляции корня можно, например, изобразив график функции. Идея графического метода основана на том, что непрерывная функция $$f (x)$$ имеет на интервале $$[a, b]$$ хотя бы один корень, если она поменяла на этом интервале знак: $$f (a) \cdot f (b) < 0$$. Границы интервала $$a$$ и $$b$$ называют пределами интервала изоляции Графический метод весьма приблизителен, отделить корни для функции $$f(x)=xsin \left (\frac{1}{x}\right)$$, при $$x \not = 0$$ и $$f (x) = 0$$ при $$x =0$$ ни на каком интервале, содержащем нуль $$(x = 0)$$ таким способом не удастся. (Прим. редактора). . На втором этапе проводят уточнение отделённых корней, т.е. находят корни с заданной точностью.

7.1 Решение алгебраических уравнений

Любое уравнение $$P (x) = 0$$, где $$P (x)$$ это многочлен (полином), отличный от нулевого, называется алгебраическим уравнением относительно переменной $$x$$. Всякое алгебраическое уравнение относительно $$x$$ можно записать в виде

$$a_0+a_1x+a_2x^2+\cdots+a_nx^n=0, где a_0 \not=0, n\ge 1$$

$$a_i$$— коэффициенты алгебраического уравнения $$n$$–й степени. Например, линейное уравнение это алгебраическое уравнение первой степени, квадратное — второй, кубическое — третьей и так далее.

В Octave определить алгебраическое уравнение можно в виде вектора его коэффициентов $$p={a_n,a_{n-1},...,a_1,a_0}$$. Например, полином $$2x^5+3x^3-1=0$$ задаётся вектором:

	
>>> p =[2,0,3,0, -1]
p = 2 0 3 0 -1

Рассмотрим функции, предназначенные для действий над многочленами.

Произведение двух многочленов вычисляет функция $$q =conv(p1, p2)$$, где $$p1$$ — многочлен степени $$n$$, $$p2$$ — многочлен степени $$m$$. Функция формирует вектор $$q$$, соответствующий коэффициентам многочлена степени $$n + m$$, полученного в результате умножения $$p1$$ на $$p2$$.

Пример 7.1. Определить многочлен, который получится в результате умножения выражений $$3x^4-7x^2+5$$ и $$x^3+2x-1.$$

Как видно из листинга 7.1 в результате имеем: $$(3x^4-7x^2+5)(x^3+2x-1)=3x^7-x^5-3x^4-9x^3+7x^2+10x-5.$$

	
>>> p1=[3 0 -7 0 5];
>>> p2=[1 0 2 -1];
>>> p=conv (p2, p1)
p = 3 0 -1 -3 -9 7 10 -5

Частное и остаток от деления двух многочленов находит функция $$[q, r] = deconv(p1, p2)$$, здесь, $$p1$$ — многочлен степени $$n,\ p2$$ — многочлен степени $$m$$. Функция формирует вектор $$q$$ — коэффициенты многочлена, который получается в результате деления $$p1$$ на $$p2$$ и вектор $$r$$ — коэффициенты многочлена, который является остатком от деления $$p1$$ на $$p2$$.

Пример 7.2. Найти частное и остаток от деления многочлена $$x^6-x^5+3x^4-8x^2+x-10$$ на многочлен $$x_3+x-1=0$$.

В результате имеем (см. листинг 7.2):

$$\frac{x^6-x^5+3x^4-8x^2+x-10}{x^3+x-1}=x^3-x^2+2x+2+\frac{1}{-11x^2+x-8}.$$
	
>>> p1=[1 -1 3 0 -8 1 -10];
>>> p2=[1 0 1 -1];
>>> [q, r]=deconv(p1, p2)
q = 1 -1 2 2
r = 0 0 0 0 -11 1 -8

Выполнить разложение частного двух многочленов, представляющих собой правильную дробь на простейшие рациональные дроби вида

$$\frac{P_1(x)}{P_2(x)}=\sum\limits_{j=1}^M \frac{a_j}{(x-b_j)^{k^j}}+\sum \limits_{i=1}^Nc_ix^{N_-i}$$

можно с помощью функции $$[a, b, c, k] = residue(p1, p2)$$, где $$p1$$ — многочлен степени $$n$$ (числитель), $$p2$$ — многочлен степени $$m$$ (знаменатель), причём $$n < m$$.

В результате работы функция формирует четыре вектора: $$a$$ — вектор коэффициентов, расположенных в числителях простейших дробей, $$b$$ — вектор коэффициентов, расположенных в знаменателях простейших дробей, $$k$$ — вектор степеней знаменателей простейших дробей (кратность), $$c$$ — вектор коэффициентов остаточного члена.

Пример 7.3. Разложить выражение $$\frac{x^3+1}{x^4-3x^3+3x^2-x}$$ на простейшие дроби.

Проанализировав листинг 7.3 запишем решение:

$$\frac{x^3+1}{x^4-3x^3+3x^2-x}=\frac{2}{x-1}+\frac{1}{(x-1)^2}+\frac{2}{(x-1)^3}+\frac{-1}{x}.$$

Значение вектора $$c =[](0 \times0)$$ говорит об отсутствии остаточного члена.

	
>>> p1=[1 0 0 1 ];
>>> p2=[1 -3 3 -1 0];
>>> [a, b, c, k]= residue (p1, p2)
a =
	2.00000
	1.00000
	2.00000
	-1.00000
b =
	1.00000
	1.00000
	1.00000
	0.00000
	c = [ ] ( 0 x0 )
k =
	1
	2
	3
	1

Пример 7.4. Разложить выражение $$\frac{7x^2+26x-9}{x^4+4x^3+4x^2-9}$$ на простейшие дроби.

Из листинга 7.4 видно, что значения векторов $$a$$ и $$b$$ — комплексные числа, то есть, на первый взгляд кажется, что выражение невозможно разложить на простейшие рациональные дроби. Однако задача имеет решение:

$$\frac{7x^2+26x-9}{x^4+4x^3+4x^2-9}=\frac{1}{x-1}+\frac{1}{x+3}+\frac{-2x+5}{x^2+2x+3}.$$

>Выражение $$\frac{-2x+5}{x^2+2x+3}$$— простейшая дробь вида $$\frac{Mx+N}{x^2+px+q}$$. Здесь знаменатель невозможно разложить на простые рациональные множители первой степени. Таким образом, функция $$residue(p1, p2)$$ выполняет разложение только на простейшие дроби вида $$\frac{a}{(x-b)^k}$$.

	
>>> p1=[1 26 -9];
>>> p2=[1 4 4 -9];
>>> [a, b, c, k]= residue(p1, p2)
a =
	-0.100000 - 6.120680i
	-0.100000 + 6.120680i
	 1.200000 + 0.000000i
b =
	-2.50000 + 1.65831i
	-2.50000 - 1.65831i
	 1.00000 + 0.00000i
c = [ ] (0x0)
k =
	1
	1
	1

Вычислить значение многочлена в заданной точке можно с помощью функции $$polyval(p, x)$$, где $$p$$ — многочлен степени $$n,\ x$$ — значение, которое нужно подставить в многочлен.

Пример 7.5. Вычислить значение многочлена $$x^6-x^5+3x^4-8x^2+x-10$$ в точках $$x_1=-1,x_2=1$$ (листинг 7.5).

	
>>> p=[1 -1 3 0 -8 1 -10];
>>> x=[-1,1];
>>> polyval(p, x)
ans = -14 -14

Вычислить производную от многочлена позволяет функция $$polyder(p)$$, где $$p$$ — многочлен степени $$n$$. Функция формирует вектор коэффициентов многочлена, являющегося производной от $$p$$.

Производную произведения двух векторов вычисляет функция $$polyder(p1, p2)$$, где $$p1$$ и $$p2$$ — многочлены.

Вызов функции в общем виде $$[q, r] = polyder(p1, p2)$$ приведёт к вычислению производной от частного p1 на $$p2$$ и выдаст результат в виде отношения полиномов $$q$$ и $$r$$.

Пример 7.6. Вычислить производную от многочлена $$x^6-x^5+3x^4-8x^2+x-10$$

Листинг 7.6 показал, что решением примера является многочлен $$6x^5-5x^4+12x^3-16x+1$$.

	
>>> p=[1 -1 3 0 -8 1 -10];
>>> polyder(p)
ans = 6 -5 12 0 -16 1

Пример 7.7. Вычислить производную от произведения многочленов $$(3x^4-7x^2+5)(x^3+2x-1)$$.

Листинг 7.7 показал, что решением примера является многочлен $$21x^6-5x^4-12x^3-27x^2+14x+10$$.

	
>>> p1=[3 0 -7 0 5];
>>> p2=[1 0 2 -1];
>>> polyder(p1, p2)
ans = 21 0 -5 -12 -27 14 10

Пример 7.8. Вычислить производную от выражения

$$\frac{x^3+1}{x^4-3x^3+3x^2-x.$$

Из листинга 7.8 видно, что решение примера имеет вид

$$\frac{-x^4-2x^3-4x+1}{x^6-4x^5+6x^4-4x^3+x^2.$$
	
>>> p1=[1 0 0 1];
>>> p2=[1 -3 3 -1 0];
>>> [q, r]= polyder(p1, p2)
q = -1 -2  0  -4  1
r = 1 -4  6  -4  1  0  0

Взять интеграл от многочлена позволяет функция $$polyint(p[, k])$$, где $$p$$ — многочлен степени $$n,\ K$$ — постоянная интегрирования, значение $$K$$ по умолчанию равно нулю. Функция формирует вектор коэффициентов многочлена, являющегося интегралом от $$p$$.

Пример 7.9. Найти $$\int(x^2+2x+3)dx$$.

Согласно листингу 7.9 решение имеет вид:

$$\int(x2+2x+3)dx=\frac{1}{3}x^3+x^2+3x.$$

Если определить значение постоянной интегрирования (вторая часть листинга 7.9), то решение будет таким:

$$\int(x^2+2x+3)dx=\frac{1}{3}x^3+x^2+3x+5.$$
	
>>> p=[1 2 3];
>>> polyint(p)
ans = 0.33333 1.00000 3.00000 0.00000
% Указываем постоянную интегрирования
>>> polyint(p, 5)
ans = 0.33333 1.00000 3.00000 5.00000

Построить многочлен по заданному вектору его корней позволяет функция $$poly(x)$$, где $$x$$ — вектор корней искомого полинома.

Пример 7.10. Записать алгебраическое уравнение, если известно, что его корни $$x_1=-2,x_2=3$$.

Согласно листингу 7.10 решение примера имеет вид: $$x^2-x-6=0$$

	
>>> x=[-2 3];
>>> poly(x)
ans = 1 -1 -6

Решить алгебраическое уравнение $$ P (x) = 0$$ можно при помощи встроенной функции $$roots(p)$$, где $$p$$ — многочлен степени $$n$$. Функция формирует вектор, элементы которого являются корнями заданного полинома.

Пример 7.11. Решить алгебраическое уравнение $$x^2-x-6=0$$.

Из листинга 7.11 видно, что значения $$x_1=-2,x_2=3$$ являются решением уравнения.

	
>>> p=[1 -1 -6];
>>> roots(p)
ans =
	 3
	-2

Пример 7.12. Найти корни полинома $$2x^3-3x^2-12x-5=0$$.

Найдём корни полинома, так как показано в листинге 7.12.

	
>>> p=[2 -3 -12 -5];
>>> x=roots(p)
x =
	3.44949
	-1.44949
	-0.50000

Графическое решение заданного уравнения показано в листинге 7.13 и на рис. 7.1. Точки пересечения графика с осью абсцисс и есть корни уравнения. Не трудно заметить, что графическое решение совпадает с аналитическим (листинг 7.12).

	
cla; okno1=figure();
x = - 2:0.1:5.5;
y=2-x.^3-3-x.^2-12-x-5;
pol=plot(x, y);
set(pol, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-2, 4]);
set(gca, ’ylim’, [-30, 30]);
set(gca, ’xtick’, [-2:0.5:4]);
set(gca, ’ytick’, [-30:5:30]);
grid on;
xlabel(’x’); ylabel(’y’);
title(’Plot y=2*x^3-3*x^2-12*x-5’);
(рис 7.1) Графическое решение примера 7.12

Пример 7.13. Найти решение уравнения $$x^4+4x^3+4x^2-9=0$$.

Графическое решение примера было получено при помощи последовательности команд приведённых в первой части листинга 7.14. На рис. 7.2 видно, что заданное алгебраическое уравнение имеет два действительных корня. Аналитическое решение примера, представленное во второй части листинга 7.14 показывает не только действительные, но и комплексные корни.

	
% Графическое нахождение корней
cla; okno1=figure();
x = -4:0.1:2;
y=x.^4+4-x.^3+4-x.^2-9;
pol=plot(x, y);
set(pol, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-4, 2]);
set(gca, ’ylim’, [-10, 5]);
set(gca, ’xtick’, [-4:0.5:2]);
set(gca, ’ytick’, [-10:1:5]);
grid on;
xlabel(’x’); ylabel(’y’);
title(’Plot y=x^4+4*x^3+4*x^2-9’);
% Аналитическое нахождение корней
>>> p=[1 4 4 0 -9];
>>> x=roots(p)
x =
	-3.00000 + 0.00000i
	-1.00000 + 1.41421i
	-1.00000 - 1.41421i
	 1.00000 + 0.00000i
(рис 7.2) Графическое решение примера 7.13

7.2 Решение трансцендентных уравнений

Уравнение, в котором неизвестное входит в аргумент трансцендентных функций, называется трансцендентным уравнением. К трансцендентным уравнениям принадлежат показательные, логарифмические, тригонометрические.

Для решения трансцендентных уравнений вида $$f (x) = 0$$ в Octave существует функция $$fzero(name, x0)$$ или $$fzero(name, [a, b])$$, где $$name$$ — имя функции, вычисляющей левую часть уравнения, $$x0$$ — начальное приближение к корню, $$[a, b]$$ — интервал изоляции корня.

Если функция вызывается в формате: $$[x, y] = fzero(name, x0)$$, то здесь $$x$$ — корень уравнения, $$y$$ — значение функции в точке $$x$$.

Пример 7.14. Найти решение уравнения:

$$\sqrt[3]{(2x-3)^2}- \sqrt[3]{(x-1)^2}=0.$$

Начнём решение данного трансцендентного уравнения с определения интервала изоляции корня. Воспользуемся для этого графическим методом. Построим график функции, указанной в левой части уравнения (листинг 7.15), создав предварительно функцию для её определения.

	
% Функция для вычисления левой части уравнения f(x)=0
function y=f1(x)
	y=((2-x-3).^2).^(1/3)-((x-1).^2).^(1/3);
end;
% Построение графика функции f(x)
cla; okno1=figure();
x = -1:0.1:3;
y=f1(x);
pol=plot(x, y);
set(pol, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-1, 3]); set(gca, ’ylim’, [-1,1.5]);
set(gca, ’xtick’, [-1:0.5:3]); set(gca, ’ytick’,[-1:0.5:1.5]);
grid on; xlabel(’x’); ylabel(’y’);
title(’Plot y=(2x-3)^{2/3}-(x-1)^{2/3}’);

На графике (рис. 7.3) видно, что функция $$f (x)$$ дважды пересекает ось $$Ox$$. Первый раз на интервале [1, 1.5], второй — [1.5, 2.5].

Уточним корни, полученные графическим методом. Воспользуемся функцией, вычисляющей левую часть заданного уравнения из листинга 7.15 и обратимся к функции $$fzero$$, указав в качестве параметров имя созданной функции и число (1.5) близкое к первому корню:

	
>>> x1=fzero(’f1’, 1.5)
x1 = 1.3333

Теперь применим функцию $$fzero$$, указав в качестве параметров имя функции, и интервал изоляции второго корня:

	
>>> x2=fzero(’f1’, [1.52.5])
x1= 2

Не трудно заметить, что и в первом и во втором случае функция $$fzero$$ правильно нашла корни заданного уравнения.

(рис 7.3) Графическое решение примера 7.14

Ниже приведён пример некорректного обращения к функции $$fzero$$, здесь интервал изоляции корня задан неверно. На графике видно, что на концах этого интервала функция знак не меняет, или, другими словами, выбранный интервал содержит сразу два корня.

	
>>>fzero(’f1’, [1 3])
error: fzero: not a valid initial bracketing
error: called from:
error: /usr/share/octave/3.4.0/m/optimization/fzero.m at line 170, column 5

В следующем листинге приведён пример обращения к функции $$fzero$$ в полном формате:

	
>>> [X(1),Y(1)]= fzero(’f1’, [1 1.5]);
>>> [X(2),Y(2) ]= fzero(’f1’, [1.5 2.5]);
>>> X % Решение уравнения
X = 1.3333 2.0000
>>> Y % Значения функции в точке Х
Y = -2.3870e-15  0.0000e+00

Пример 7.15. Найти решение уравнения $$x^4+4x^3+4x^2-9=0$$.

Как видим, левая часть уравнения представляет собой полином. В примере 7.13 было показано, что данное уравнение имеет четыре корня: два действительных и два мнимых (листинг 7.14).

Листинг 7.16 демонстрирует решение алгебраического уравнения при помощи функции $$fzero$$. Не трудно заметить, что результатом работы функции являются только действительные корни. Графическое решение (рис. 7.2) подтверждает это: функция дважды пересекает ось абсцисс.

	
function y=f2(x)
	y=x.^4+4-x.^3+4-x.^2-9;
end;
>>> [X(1),Y(1)]= fzero(’f2’, [-4 -2]);
>>> [X(2),Y(2)]= fzero(’f2’, [0 2]);
>>> X
>>> Y
X = -3 1
Y = 0 0

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

Напомним, что если заданы $$m$$ уравнений с $$n$$ неизвестными и требуется найти последовательность из $$n$$ чисел, которые одновременно удовлетворяют каждому из $$m$$ уравнений, то говорят о системе уравнений.

Несложную систему элементарной подстановкой можно привести к нелинейному уравнению. Рассмотрим несколько примеров, в которых описан такой приём решения нелинейной системы.

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

$$\left\{\begin{aligned}{(x^2+2y^2=1\\x-y=1.\end{aligned}$$

Найдём графическое решение с помощью команд листинга 7.17. На рис. 7.4 видно, что система имеет два решения.

	
% Верхняя часть эллипса
function y=f1(x)
	y=sqrt((1-x.^2)/2);
end;
% Нижняя часть эллипса
function y=f2(x)
	y= -sqrt((1-x.^2)/2);
end;
% Прямая
function y=f3(x)
	y=x-1;
end;
% Построение графика
cla; okno1=figure();
x1 = -1:0.01:1; x2 = -1.5:0.1:1.5;
L1=plot(x1, f1(x1), x1, f2(x1));
set(L1, ’LineWidth’, 2, ’Color’, ’k’)
hold on
L2=plot(x2, f3(x2));
set(L2, ’LineWidth’, 3, ’Color’, ’k’)
set(gca, ’xlim’, [-1.5, 1.5]); set(gca, ’ylim’, [-1, 1]);
set(gca, ’xtick’, [-1.5:0.2:1.5]); set(gca, ’ytick’,[- 1:0.2:1]);
grid on; xlabel(’x’); ylabel (’y’);
(рис 7.4) Решение системы нелинейных уравнений из примера 7.16

Не сложно убедиться, что данная система легко сводится к одному уравнению: $$\{y=x-1,x^2+2y^2=1\} \Rightarrow x^2+2(x-1)^2-1=0 \Rightarrow 3x^2-4x+1=0$$.

Решив это уравнение с помощью функции $$roots$$, найдём значения $$x$$. Затем подставим их в одно из уравнений системы, например во второе, и тем самым вычислим значения $$y$$:

	
>>> p=[3 -4 1];
>>> x=roots(p)
x =
	1.00000
	0.33333
>>> y=x-1
y =
	-1.1102e-16
	-6.6667e-01
(рис 7.5) Графическое решение примера 7.16

Понятно, что система имеет два решения $$x_1=1,y_1=0$$ и $$x_2=\frac{1}{3},y_2=-\frac{2}{3}$$ (рис. 7.4). Графическое решение уравнения (листинг 7.18), к которому сводится система, показано на рис. 7.5.

	
function y=f(x)
	y=3-x.^2-4-x+1;
end;
cla; okno1=figure();
x = 0:0.01:1.5;
L=plot(x, f(x)); set(L, ’LineWidth’, 2, ’Color’, ’k’)
set(gca, ’xlim’, [0, 1.5]); set(gca, ’ylim’, [-0.5, 1]);
set(gca, ’xtick’, [0:0.1:1.5]); set(gca, ’ytick’, [-0.5:0.1:1]);
grid on; xlabel(’x’); ylabel(’y’);

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

$$\left\{\begin{aligned}sin(x+1)-y=1.2\\2x+cos(y)=2.\end{aligned}$$

Проведём элементарные алгебраические преобразования и представим систему в виде одного уравнения: $$\{y=sin(x+1)-1.2,2x+cos(y)-2=0\}\Rightarrow 2x+cos(sin(x+1)-1.2)-2=0$$

Рис. 7.6 содержит графическое решение уравнения (листинг 7.19), к которому сводится система, его удобно использовать для выбора начального приближения функции $$fzero$$. Вторая часть листинга 7.19 содержит решение заданной системы. Здесь значения $$x$$ вычисляется при помощи функции $$fzero$$, а значение y определяется из первого уравнения системы.

(рис 7.6) Графическое решение примера 7.17
	
% Строим график
function y=fun(x)
	z=sin(x+1)-1.2;
	y=2-x+cos(z)-2;
end;
cla; okno1=figure();
x = -1:0.01:1;
L=plot(x, fun(x)); set(L, ’LineWidth’, 2, ’Color’, ’k’)
grid on; xlabel(’x’); ylabel(’y’);
% Находим аналитическое решение системы вблизи x = 0
>>> X=fzero(’fun’, 0)
>>> Y=sin(X+1)-1.2
X = 0.51015
Y = -0.20184

Решить систему нелинейных уравнений, или одно нелинейное уравнение, в Octave можно с помощью функции $$fsolve(fun, x0)$$, где $$fun$$ — имя функции, которая определяет левую часть уравнения $$f (x) = 0$$ или системы уравнений $$F (x) = 0$$ (она должна принимать на входе вектор аргументов и возвращать вектор значений), $$x0$$ — вектор приближений, относительно которого будет осуществляться поиск решения.

Пример 7.18. Найти решение системы нелинейных уравнений:

$$\left\{\begin{aligned}cos(x)+2y=2\\ \frac{x^2}{3}-\frac{y^2}{3}=1.\end{aligned}$$

Решим систему графически, для чего выполним перечень команд указанных в листинге 7.20. Результат работы этих команд показан на рис. 7.7. Понятно, что система имеет два корня.

	
% Уравнения, описывающие линии гиперболы
function y=f1(x)
	y=sqrt(x.^2_3);
end;
function y=f2(x)
	y=_sqrt(x.^2_3);
end;
% Уравнение косинусоиды
function y=f3(x)
	y=1_cos(x)/2;
end;
% Построение графика
cla; okno1=figure();
x1 = _5:0.001:_sqrt(3);
x2=sqrt(3):0.001:5;
x3 = _5:0.1:5;
% Гипербола
L1=plot(x1, f1(x1), x1, f2(x1), x2, f1(x2), x2, f2(x2));
set(L1, ’LineWidth’, 3, ’Color’, ’k’)
hold on
% Косинусоида
L2=plot(x3, f3(x3)); set(L2, ’LineWidth’, 3, ’Color’, ’k’)
grid on; xlabel(’x’); ylabel(’y’);

Составим функцию, соответствующую левой части системы. Здесь важно помнить, что все уравнения должны иметь вид $$F (x) = 0$$. Кроме того, обратите внимание, что $$x$$ и $$y$$ в этой функции — векторы ($$x$$ — вектор неизвестных, $$y$$ — вектор решений).

	
function[y]= fun(x)
	y(1)=cos(x(1))+2-x(2)-2;
	y(2)=x(1)^2/3-x(2)^2/3-1;
end;

Теперь решим систему, указав в качестве начального приближения сначала вектор [-3, -1], затем [1, 3].

(рис 7.7) Графическое решение примера 7.18
	
>>> [X1_Y1]= fsolve(’fun’, [-3 -1])
X1_Y1 = -2.1499  1.2736
>>> [X2-Y2]= fsolve(’fun’, [1 3])
X2_Y2 = 2.1499  1.2736

Понятно, что решением примера являются пары $$x_1=-2.15,y_1=1.27$$ и $$x_2=2.15,y_2=1.27$$, что соответствует графическому решению (рис. 7.7).

Если функция решения нелинейных уравнений и систем имеет вид $$[x, f, ex] = fsolve(fun, x0)$$, то здесь $$x$$ — вектор решений системы, $$f$$ — вектор значений уравнений системы для найденного значения $$x,\ ex$$ — признак завершения алгоритма решения нелинейной системы, отрицательное значение параметра ex означает, что решение не найдено, ноль — досрочное прерывание вычислительного процесса при достижении максимально допустимого числа итераций, положительное значение подтверждает, что решение найдено с заданной точностью.

Пример 7.19. Решить систему нелинейных уравнений:

$$\left\{\begin{aligned}x_1^2+x_2^2+x_3^2=1\\ 2x_1^2+x_2^2-4x_3=0\\ 3x_1^2-4x_2^2+x_3^2=0.\end{aligned}$$

Листинг 7.21 содержит функцию заданной системы и её решение. Обратите внимание на выходные параметры функции $$fsolve$$. В нашем случае значения функции $$f$$ для найденного решения $$x$$ близки к нулю и признак завершения $$ex$$ положительный, значит, найдено верное решение.

(рис 7.8) Графическое решение примера 7.20
	
function f=Y(x)
	f(1)=x(1)^2+x(2)^2+x(3)^2-1;
	f(2)=2-x(1)^2+x(2)^2-4-x(3);
	f(3)=3-x(1)^2-4-x(2)+x(3)^2;
end
>>> [x, f, ex]= fsolve(’Y’, [0.5 0.5 0.5] )
x = 0.78520  0.49661  0.36992
f = 1.7571e-08  3.5199e-08  5.2791e-08
ex = 1

Пример 7.20. Решить систему:

$$\left\{\begin{aligned}(x^2+y^2=1\\ 2sin(x-1)+y=1.\end{aligned}$$

Графическое решение системы (рис. 7.8) показало, что она корней не имеет. Рисунок был получен с помощью команд листинга 7.22.

	
% Уравнения линий окружности
function y=f1(x)
	y=sqrt(1-x.^2);
end;
function y=f2(x)
	y= -sqrt(1-x.^2);
end;
% Уравнение синусоиды
function y=f3(x)
	y=1-2-sin(x-1);
end;
okno1=figure(); cla;
x1 = -1:0.01:1; x3 = -2:0.1:2;
% Окружность
L1=plot(x1, f1(x1), x1, f2(x1)); set(L1, ’LineWidth’, 3, ’Color’, ’k’)
hold on
% Синусоида
L2=plot(x3, f3(x3)); set(L2, ’LineWidth’, 3, ’Color’, ’k’)
grid on; xlabel(’x’); ylabel(’y’);

Однако применение к системе функции $$fsolve$$ даёт положительный ответ, что видно из листинга 7.23. Происходит это потому, что алгоритм, реализованный в этой функции, основан на минимизации суммы квадратов компонент вектор–функции. Следовательно, функция $$fsolve$$ в этом случае нашла точку минимума, а наличие точки минимума не гарантирует существование корней системы в её окрестности.

	
function[y]= fun(x)
	y(1)=x(1)^2+x(2)^2-1;
	y(2)=2-sin(x(1)-1)+x(2)-1;
end;
>>> [ X1_Y1]= fsolve(’fun’, [1 1])
X1_Y1 = 1.04584  0.52342

7.4 Решение нелинейных уравнений и систем в символьных переменных

Напомним, что для работы с символьными переменными в Octave должен быть подключён специальный пакет расширений octave-symbolic. Процедура установки пакетов расширений описана в первой главе. Техника работы с символьными переменными описана в п. 2.7 второй главы.

Для решения системы нелинейных уравнений или одного нелинейного уравнения можно воспользоваться функцией $$symfsolve$$.

Пример 7.21. Решить уравнение $$\frac{e^x}{5}-3(2x-1)=0$$.

(рис 7.9) Графическое решение примера 7.21

Команды, с помощью которых выполнено графическое (рис. 7.9) и аналитическое решение представлены в листинге 7.24.

	
clear all; clf; cla;
symbols
x=sym("x");
y=Exp(x)/5-3-(2-x-1);
L=ezplot(’exp(x)/5-3*(2*x-1)’);
set(L, ’LineWidth’, 2, ’Color’, ’k’)
set(gca, ’xlim’, [-2,6]); set(gca, ’ylim’, [-20, 50]);
set(gca, ’xtick’,[-2:0.5:6]); set(gca, ’ytick’, [-20:10:50]);
grid on; xlabel(’x’); ylabel(’y’);
>>> q1 = symfsolve(y, 0)
>>> q2 = symfsolve(y, 4)
q1 = 0.55825
q2 = 4.8777

Пример 7.22. Решить систему:

$$\left\{\begin{aligned}x^2+y^2+3x-2y=4\\ x+2y=5.\end{aligned}$$ (рис 7.10) Графическое решение примера 7.22

Решение системы (листинг 7.25) показало, что она имеет два корня$$x_1=1,y_1=2$$ и $$x_2=-2.2,y_2=3.6$$, что соответствует графическому решению (рис. 7.10).

	
clear all; clf; cla;
symbols
x=sym("x");
y=sym("y");
L1=ezplot(’x^2+y^2+3*x-2*y-4’); set(L1, ’LineWidth’, 2, ’Color’, ’k
	’)
hold on
L2=ezplot(’x+2*y-5’); set(L2, ’LineWidth’, 2, ’Color’, ’k’)
set(gca, ’xlim’, [-5, 4]); set(gca, ’ylim’, [-2, 5]);
set(gca, ’xtick’, [-5:0.5:4]); set(gca, ’ytick’, [-2:0.5:5]);
grid on; xlabel(’x’); ylabel(’y’);
title(’x^2+y^2+3x-2y=4, x+2y=5’)
f1=x^2+y^2+3-x-2-y-4;
f2=x+2-y-5;
>>> q1 = symfsolve(f1, f2, {x==0,y==1})
>>> q2 = symfsolve(f1, f2, {x==-1,y==3})
q1 = 1.0000  2.0000
q2 = -2.2000  3.6000
Вернуться к учебному плану