\documentclass[a4paper,12pt]{extarticle} \usepackage{/home/eddy/ed, verbatim} \title{Практикум \No4: системы уравнений, интегралы, производные} \author{}\date{}\nocolon \long\def\task#1{\par\noindent\leavevmode\refstepcounter{sect}\llap{\textbf{\thesect}\;}\indent\textit{#1}\par} \def\t#1{{\upshape\ttfamily #1}} \begin{document} \maketitle \section{Системы уравнений} % % % \task{Решить систему уравнений} $$\left\{ \begin{aligned} -x_1+x_2+2x_3&=10;\\ 3x_1-x_2+x_3&=-20;\\ -x_1+3x_2+4x_3&=40. \end{aligned} \right. $$ Представим ее в виде $\B{Ax=b}$. Инициализируем постоянные: \begin{verbatim} A=[-1 1 2; 3 -1 1; -1 3 4]; b=[10; -20; 40]; \end{verbatim} Нам необходимо проверить на вырожденность матрицу~$\B A$: \begin{verbatim} det(A) ans = 10.000 \end{verbatim} Теперь решить данную систему можно несколькими способами. \begin{enumerate} \item Через обратную матрицу. $$\B A^{-1}\B{Ax}=\B A^{-1}\B b,\quad \Arr \quad \B x=\B A^{-1}\B b.$$ В Octave это примет вид: \begin{verbatim} x = inv(A)*b x = 1.00000 19.00000 -4.00000 \end{verbatim} Проверим решение: \begin{verbatim} A*x ans = 10.000 -20.000 40.000 \end{verbatim} \item Метод Гаусса. Приведем к верхней треугольной форме расширенную матрицу~$(\B A:\B b)$: \begin{verbatim} rref([A b]) ans = 1.00000 0.00000 0.00000 1.00000 0.00000 1.00000 0.00000 19.00000 0.00000 0.00000 1.00000 -4.00000 \end{verbatim} Слева мы получили единичную матрицу, что значительно упрощает вычисления. Однако, если бы матрица не имела нулей в правом верхнем углу, мы все равно могли бы найти корни системы (обратный ход метода Гаусса). \item Автоматический метод Гаусса. В данном случае необходимо лишь воспользоваться уже известным вам оператором <<левого>> (или обратного) деления: \begin{verbatim} x = A\b x = 1.0000 19.0000 -4.0000 \end{verbatim} Далее мы будем использовать именно этот способ решения линейных систем уравнений. \end{enumerate} % % % \task{Решить систему уравнений, заданную вырожденной матрицей} $$\left\{ \begin{aligned} x_1+3x_2+7x_3&=5;\\ -x_1+4x_2+4x_3&=2;\\ x_1+10x_2+18x_3&=12. \end{aligned} \right. $$ \begin{verbatim} A = [ 1 3 7; -1 4 4; 1 10 18]; b = [5; 2; 12]; det(A) ans = 0 \end{verbatim} Так как определитель матрицы коэффициентов равен нулю, невозможно найти обратную матрицу. Однако, можно воспользоваться способом решения через\к псевдообратную матрицу\н: \begin{verbatim} x = pinv(A)*b x = 0.38498 -0.11033 0.70657 % check A*x ans = 5.0000 2.0000 12.0000 \end{verbatim} Однако, изменим вектор $\B b$: \begin{verbatim} b = [3;6;0]; x = pinv(A)*b x = -1.08920 1.25117 -0.52347 % check A*x ans = -1.0000 4.0000 2.0000 \end{verbatim} В этом случае решение не будет точным (точнее, оно вообще не является решением данной системы). Проверим, возможно ли найти общее решение данной системы уравнения, приведя к верхней треугольной форме расширенную матрицу $(\B A:\B b)$: \begin{verbatim} rref([A b]) ans = 1.00000 0.00000 2.28571 0.00000 0.00000 1.00000 1.57143 0.00000 0.00000 0.00000 0.00000 1.00000 \end{verbatim} Последняя строка содержит ненулевой элемент лишь в столбце свободных членов, что однозначно свидетельствует об отсутствии решений данной системы уравнений. \section{Степенные уравнения} % % % \task{Найти решение уравнения $2x^2-4x+5=0$.} Для этого необходимо инициализировать полином набором коэффициентов и найти корни командой~\verb'roots'. \begin{verbatim} p = [2 -4 5]; x = roots(p) x = 1.0000 + 1.2247i 1.0000 - 1.2247i \end{verbatim} Итак, корни нашего уравнения: $x=1\pm1.2247i$. Точность вычислений Octave можно задать явно командой~\verb'format'. Для отображения результата в виде рациональных дробей можно указать следующее. \begin{verbatim} format rat x = 1 + 4801/3920i 1 - 4801/3920i \end{verbatim} Вернуться к прежнему виду результатов можно командой~\verb'format short'. \task{Найти корни полинома $p(x)=x^4+2x^3-3x^2+4x+5$ и получить его график на отрезке $[-4, 2]$.} \begin{verbatim} p = [1 2 -3 4 5]; x = roots(p) x = -3.18248 + 0.00000i 0.95560 + 1.11480i 0.95560 - 1.11480i -0.72873 + 0.00000i x=[-4:.05:2]; y=polyval(p,x); plot(x,y) \end{verbatim} Нарисуем ось Х: \begin{verbatim} hold on plot([-4 2], [0 0],'k') \end{verbatim} Команда \verb'hold on' позволяет <<дорисовать>> что-либо на уже имеющемся графике. Буква~\verb"'k'" в параметре означает рисование черным цветом. Отключить вывод на один и тот же график можно командой~\verb'hold off'. % % % \task{Найти решение уравнения $y=x^3+x^2-3x-3$.} Зададим функцию: \begin{verbatim} f = inline("x^3+x^2-3*x-3"); \end{verbatim} Функция \t{fsolve} позволяет решать нелинейные уравнения, и ее можно применить в т.ч. к решению степенных уравнений. Необходимо задать начальное приближение для поиска. Задавая разные значения, получим разные корни: \begin{verbatim} fsolve (f, 1) ans = 1.7321 fsolve (f, 0) ans = -1 fsolve (f, -2) ans = -1.7321 \end{verbatim} Можем проверить корни: \begin{verbatim} p=[1 1 -3 -3] p = 1 1 -3 -3 roots(p) ans = 1.7321 -1.7321 -1.0000 \end{verbatim} А теперь попробуем решить этим же методом систему уравнений: $$\begin{cases} \e^{-\e^{-(x+y)}} = y(1+x^2),\\ x\cos y + y\sin x = 1/2. \end{cases} $$ Для начала конвертируем их к виду $F(x)=0$: $$\begin{cases} \e^{-\e^{-(x+y)}} - y(1+x^2) = 0,\\ x\cos y + y\sin x - 1/2 = 0. \end{cases} $$ Запишем функцию, позволяющую вычислить обе компоненты: \verbatiminput{Materials4Pract/04/F.m} Теперь попробуем найти решение, начиная с $(0,0)$: \begin{verbatim} fsolve(@F, [0 0]) ans = 0.35325 0.60608 \end{verbatim} \section{Численное интегрирование, дифференциальные уравнения} % % % \task{Найти интеграл $\Int_0^3 x(\sin\frac{1}{x})\sqrt{|1-x|}\,dx$.} Для вычисления подынтегральной функции в каждом узле интегрирования, нам необходимо задать функцию \t{i1.m}: \verbatiminput{Materials4Pract/04/i1.m} Для интегрирования с оптимальным расчетом квадратур можно использовать функцию \t{quad}: \begin{verbatim} [q, ier, nfun, err] = quad (@i1, 0, 3) ABNORMAL RETURN FROM DQAGP q = 1.9819 ier = 1 nfun = 5061 err = 0.00000011522 \end{verbatim} \t{q}~-- результат интегрирования, \t{ier}~-- код ошибки интегрирования (при нормальной процедуре равен 0), \t{nfun}~-- количество узлов интегрирования, \t{err}~-- оценка ошибки интегрирования. Здесь и во многих других функциях первым аргументом является либо строка с именем функции, либо ссылка на нее (как в данном случае), либо inline-функция. Еще примеры интегрирования. Квадратурная формула Гаусса--Конрода: \begin{verbatim} f = inline ("x.^3"); quadgk (f, 0, 1) ans = 0.25000 \end{verbatim} Квадратура Кленшоу--Куртиса (и бесконечный предел интегрирования): \begin{verbatim} f = @(x) x.^3 .* exp (-x); quadcc (f, 0, Inf) ans = 6.0000 \end{verbatim} Квадратура Симпсона: \begin{verbatim} f = inline ("x.^3"); quadv(f, 0, 1) ans = 0.25000 \end{verbatim} Автоматический выбор квадратуры: \begin{verbatim} integral(f, 0, 1) ans = 0.25000 \end{verbatim} % % % \task{Найти интеграл $\Int_0^5 (x^4+2x^2-1)dx$} Можно посчитать интеграл и другим способом, если задан полином: определим коэффициенты полинома, вычислим новый полином, являющийся интегралом нашего, а затем, вычитая первообразные, найдем искомый интеграл: \begin{verbatim} c = [1 0 2 0 -1]; i = polyint(c); I = polyval(i, 5) - polyval(i, 0) I = 703.33 \end{verbatim} Аналогичным образом мы можем вычислять производные: \begin{verbatim} d = polyder(c); polyval(d, [1:5]) ans = 8 40 120 272 520 \end{verbatim} % % % \task{Вычислить интеграл $\Int_0^1 dx\Int_{-1}^1 \cos(\pi xy)\sqrt{x|y|}\,dy$} Для двухмерного интегрирования воспользуемся функцией \t{dblquad} \begin{verbatim} I = dblquad(@(x, y) cos (pi*x.*y) .* sqrt (x.*abs(y)), 0, 1, -1, 1) I = 0.30892 % OR I = quad2d(@(x, y) cos (pi*x.*y) .* sqrt (x.*abs(y)), 0, 1, -1, 1) I = 0.30892 % OR [I err] = integral2(@(x, y) cos (pi*x.*y) .* sqrt (x.*abs(y)), 0, 1, -1, 1) I = 0.30892 err = 0.00000030870 \end{verbatim} Тройные интегралы~--- \t{triplequad} или \t{integral3}. % % % \task{Решить дифференциальное уравнение $\dot{x}=-\e^t x^2$ при $x(0)=2$.} Запишем функцию, вычисляющую $\dot{x}$: \verbatiminput{Materials4Pract/04/ode1.m} Заданим аргумент $t\in[0,5]$ как вектор в 50 экземпляров \begin{verbatim} t = linspace(0,5,50); x = lsode(@ode1, 2, t); plot(t,x) \end{verbatim} \t{lsode} решает простейшее уравнение $\frac{dy}{dx}=f(x,y)$ при начальных условиях $y(0)$ по заданному вектору~$x$. % % % \task{Решить методом Рунге--Кутты дифференциальное уравнение ван~дер~Поля} $y''+\mu(1-y^2)y'+y=0$, $\mu>0$. Для начала перепишем это уравнение с заменой $y_1=y$, $y_2=y_1'$: $y_2'=\mu(1-y_1^2)y_2-y_1$. Для простоты примем~$\mu=1$. Введем функцию, описывающую наше уравнение (ее необходимо ввести как новый m-файл и сохранить под именем \t{vdp1.m}): \verbatiminput{Materials4Pract/04/vdp1.m} Теперь найдем решение уравнения и отобразим графики функции~$y$ и ее первой производной: \begin{verbatim} [t, y] = ode45(@vdp1, [0 20], [2; 0]); plot(t, y(:,1), '-', t, y(:,2), '--') \end{verbatim} Функция \verb'ode45' в качестве первого параметра требует имя функции, в которой описано дифференциальное уравнение; второй параметр~--- интервал, в котором изменяется аргумент искомой функции; третий аргумент~--- начальные условия для функции и ее производной. Возвращаемое значение~$y$ содержит два столбца: в первом находится искомая функция, а во втором~--- ее первая производная. Итак, для численного решения дифференциального уравнения в Octave необходимо сначала представить это уравнение в виде линейной системы $$\left\{\begin{aligned} y_1'&=f_1(x,y_1,\ldots,y_n),\\ y_2'&=f_2(x,y_1,\ldots,y_n),\\ \cdots\\ y_n'&=f_n(x,y_1,\ldots,y_n). \end{aligned} \right. $$ Затем функции $f_1$, \ldots, $f_n$ следует определить как строки специальной функции, которая будет играть роль первого параметра функции, решающей данное уравнение. \section{Численное дифференцирование} % % % \task{Для ряда данных вычислить производную и построить график функции и производной} \begin{verbatim} x = [0:0.01:10]; y = y=x.^2.*sin(x)+sin(x/11)-tan(x*222)/cos(x); \end{verbatim} Простейший способ найти производную~--- воспользоваться методом разделенных разностей. Функция \t{diff} вычисляет разность $y(x_{i+1})-y(x_i)$. Производную $y'(x)$ мы можем рассчитать в нулевом приближении либо как $\frac{y(x_{i+1})-y(x_i)}{x_{i+1}-x_i}$, либо как $\frac{y(x_i)-y(x_{i-1})}{x_i-x_{i-1}}$. Попробуем оба способа. Учитывая то, что мы имеем равномерно распределенный ряд, вычисления упрощаются. \begin{verbatim} dy1=[0 diff(y)]/0.01; dy2=[diff(y) 0]/0.01; plot(x,[y;dy1;dy2]) \end{verbatim} Благодаря гладкости функции и большому шагу, мы практически не видим разницы. Однако, если мы в 10~раз уменьшим шаг, сдвиг уже будет иметь значение. Кстати, мы можем и простейшим образом (трапециями) вычислить интеграл: \begin{verbatim} iy = [cumsum(y)]; plot(x,[y;dy1;iy]) legend("F", "dF", "iF") \end{verbatim} Если добавить ось X (\t{plot(x,[y;dy1;iy], x, zeros(size(x)))}), поведение интегральной кривой отлично отразится на оригинальной функции. % % % \task{Найти производную зашумленного ряда данных.} (не удалять предыдущие данные!) О функции \t{polyder} мы уже упоминали. Она отлично подходит для тех наборов данных, которые можно аппроксимировать полиномом. Давайте повторим предыдущие вычисления \t{y}, но добавим шум в 10дБ: \begin{verbatim} yn = awgn(y, 10, "measured"); plot(x,[y;yn], x, zeros(size(x))) \end{verbatim} Естественно, функции \t{diff} и \t{cumsum} в данном случае будут давать ужасный результат: \begin{verbatim} plot(x,[yn;[0 diff(yn)]/0.01]) \end{verbatim} Попробуем аппроксимировать нашу кривую полиномом десятой степени и сравнить на графике (а потом сравним с оригиналом): \begin{verbatim} p=polyfit(x,yn, 10); plot(x,[yn; polyval(p,x)]) plot(x,[y; polyval(p,x)]) \end{verbatim} Естественно, в самом начале (в районе нуля) шумы настолько велики, что аппроксимация получается, мягко говоря, не очень. Но это все равно лучше, чем начальный зашумленный ряд. Теперь вычисляем производную и сравним с предыдущей. \begin{verbatim} dp = polyder(p); dyp=polyval(dp, x); plot(x,[dy1;dyp]) \end{verbatim} И еще: \begin{verbatim} plot(x,[y;yn;dy1;dyp]) \end{verbatim} Можно попробовать разные степени полинома для аппроксимации этой функции, сравнив результаты. Еще одним вариантом вычисления производной является функция \t{gradient}. Здесь можно <<автоматически>> учесть шаг: \begin{verbatim} plot(x,[y;dy1;gradient(y,0.01)]) \end{verbatim} А в случае неравномерно распределенных данных, мы можем задать вектор \t{x}. \begin{verbatim} x = [0 0.1 0.5 1 1.1 1.5 7 7.1 7.2 7.5 10 10.5 12 15 20 20.1 25 45 47 56 100]; y = x.^2.*sin(x)+sin(x/11)-tan(x*222)/cos(x); dyy = gradient(y, x); x1 = [0:0.1:100]; y1 = x1.^2.*sin(x1)+sin(x1/11)-tan(x1*222)/cos(x1); plot(x, dyy, x1, [0 diff(y1)]) % и сравним с ходом оригинальной функции plot(x, [y; dyy], x1, [y1; [0 diff(y1)]]) % who is who legend("bad", "dbad", "ori", "dori") \end{verbatim} \task{Вычислите вторую производную предыдущей функции} Для этого можно воспользоваться функцией \t{del2} (дискретный Лапласиан): \begin{verbatim} plot(x,[y;del2(y)*1e4]) \end{verbatim} Не забываем, что т.к. мы вычисляем вторую производную, то интервал необходимо возвести в квадрат! Естественно, N-ю производную мы можем вычислить и многократным вызовом функции \t{diff}, если данные распределены равномерно. \section{Задания для самостоятельного выполнения} \begin{enumerate} \item Решите систему уравнений $$\left\{\begin{aligned} x_1+2x_2+3x_3&=1;\\ 2x_1-x_2+4x_3&=2;\\ x_1-3x_2+x_3&=3. \end{aligned}\right. $$ %(1,$\pi$,0) \item Решите систему уравнений $$\left\{\begin{aligned} x_1+x_2/2+x_3/3&=1;\\ x_1/2+x_2/3+x_3/4&=0;\\ x_1/3+x_2/4+x_3/5&=0. \end{aligned}\right. $$ Обратите внимание, что определитель матрицы коэффициентов {\tt det(A) = 4.6296e-04}. Такие системы называются\ж плохо обусловленными\н. Их решения сильно осциллируют при малейших изменениях коэффициентов матрицы. \item Решите уравнение $x^7-2x^5+3x^3-4x=0$. %( $0$, %$\pm1.2848$, %$0.9304 \pm 0.8313i$, %$-0.9304 \pm 0.8313i$). \item Решите систему уравнений $$ \left\{\begin{aligned} \e^{x+y} &= \sin x;\\ \cos x &= \ln y - 1. \end{aligned}\right. $$ \item Вычислите $\Int_0^1 \ln (x+1)\sin x\, dx$. \item Вычислите $\Int_{-1}^2 dx\Int_{-\pi}^0 dy\Int_0^1\frac{ln(xyz)}{\cos(xy)}dz$. \item Найдите решение уравнения ван~дер~Поля при $\mu=5$. % (1.2350) \item Постройте график решения задачи Коши методом Рунге--Кутты на интервале $[0,1]$ для уравнения $y'=x^3\sin y+1$ при $y(0)=0$. \item Найдите решение системы уравнений: $$ \left\{\begin{aligned} 2(x-4)^2 + 7(y-8)^2 &= z^2;\\ 5(x-1)^2 +1 + 2z^2 &= 4(y+3)^2;\\ x^2 + y^2 + z^2 &= 0.\\ \end{aligned}\right. $$ \item Вычислите производную и интеграл для ряда данных $y=y(t)$. \begin{verbatim} t = [0 1 3 5 9 10 11 15 20 21 23 25 50 52 57 59 60 73 94 96 99 100]; y = [41.6 -0.4 7.6 -25.8 5.3 23.1 636.7 -46.7 -3.7 -29.1 96.6 3.3 -9.4 56.7 17.5 -17.1 17.4 4.3 -0.3 12.3 85.9 44.2]; \end{verbatim} \item Вычислить производную и интеграл для функции $\left(\frac{\sin x}{x}\right)^2$ с отношением сигнал-шум 10дБ на промежутке $[-10,10]$. \end{enumerate} \end{document}