В общем случае аналитическое решение уравнения $$f (x) = 0$$ можно найти только для узкого класса функций. Чаще всего приходится решать это уравнение численными методами. Численное решение уравнения проводят в два этапа. На первом этапе отделяют корни уравнения, т.е. находят достаточно тесные промежутки, в которых содержится только один корень. Эти промежутки называют интервалами изоляции корня. Определить интервалы изоляции корня можно, например, изобразив график функции. Идея графического метода основана на том, что непрерывная функция $$f (x)$$ имеет на интервале $$[a, b]$$ хотя бы один корень, если она поменяла на этом интервале знак: $$f (a) \cdot f (b) < 0$$. Границы интервала $$a$$ и $$b$$ называют пределами интервала
Любое уравнение $$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
Уравнение, в котором неизвестное входит в аргумент трансцендентных функций, называется трансцендентным уравнением. К трансцендентным уравнениям принадлежат показательные, логарифмические, тригонометрические.
Для решения трансцендентных уравнений вида $$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
Напомним, что если заданы $$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
Напомним, что для работы с символьными переменными в 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$$ называют пределами интервала
Любое уравнение $$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
Уравнение, в котором неизвестное входит в аргумент трансцендентных функций, называется трансцендентным уравнением. К трансцендентным уравнениям принадлежат показательные, логарифмические, тригонометрические.
Для решения трансцендентных уравнений вида $$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
Напомним, что если заданы $$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
Напомним, что для работы с символьными переменными в 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
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.