Опубликован: 18.05.2011 | Доступ: свободный | Студентов: 968 / 105 | Оценка: 4.40 / 4.20 | Длительность: 12:30:00
Лекция 14:

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

< Лекция 13 || Лекция 14: 123 || Лекция 15 >
Аннотация: Лекция посвящена вычислительным методам решения систем трансцендентных уравнений. Рассмотрены различные методы нахождения приближенных решений.

Цель лекции: Рассмотреть базовые методы нахождения приближенных решений нелинейных трансцендентных уравнений. Реализовать на C# основной метод.

Решение нелинейных уравнений является одной из самых распространенных задач математики. В лекции, посвященной особенностям вычислительных процедур, мы рассматривали простейший метод решения скалярного уравнения для вычисления корня квадратного из 2. Этот метод - половинного деления имеет много достоинств. Главным достоинством этого метода является то, что для приближенных решений автоматически получается оценка точности. Второе достоинство данного метода состоит в том, что этот метод легко реализуем. Однако у этого метода есть и недостатки. Для реализации этого метода мы должны знать отрезок, на концах которого функция принимает значения разного знака. А также этот метод является сугубо скалярным и не может быть обобщен на многомерный случай.

Сначала рассмотрим задачу о нахождении корня одного уравнения

f(x)=0.
Если предположить, что функция f(x) является дифференцируемой, и ее производная есть непрерывная функция f'(x), то находить приближенные решения возможно с помощью метода Ньютона. Формулы метода Ньютона получаются из следующих соображений. Пусть x^* - корень функции f, а x_n некоторое приближение к этому корню. Тогда имеем
f(x^*)=f(x_n+(x^*-x_n))=f(x_n)+(x^*-x_n)f'(\xi)=0.
Если вместо неизвестной точки \xi взять значение x_n, то следующее приближение можно вычислять по формулам
x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}.
Можно показать, что если начальное приближение x_0 $ достаточно близко к искомому корню, то итерации, вычисленные по методу Ньютона сходятся к этому корню. К сожалению, это условие носит скорее теоретический характер, поскольку не понятно, что значит "достоаточно близко" и как это условие проверить. Другим достаточным условием сходимости метода Ньютона является условие
|f(x)f'(x)|<(f'(x))^2.
Также из геометрических соображений можно получить, что итерации сходятся к корню с той стороны, с которой выполнено условие
f(x)f''(x)\ge0,
если функция f дважды дифференцируема.

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

Для устранения последнего недостатка был разработан метод секущих, который иногда называется методом хорд. В этом методе производная заменяется конечной разностью

f'(x_n)\approx\frac{f(x_n)-f(x_{n-1})}{x_n-x_{n-1}}.
Тогда итерации по методу секущих вычисляются по формулам
x_{n+1}=x_n-\frac{(x_n-x_{n-1})f(x_n)}{f(x_n)-f(x_{n-1})}.
Для реализации метода секущих необходимо знать два предыдущих значения x_n и x_{n-1}. Такие методы называются двухшаговыми. Метод секущих сходиться медленнее, чем метод Ньютона, зато этот метод не требуем знания производной функции f(x).

Реализуем класс для вычислений по методу секущих.

\begin{verbatim}
class TSolve
{
    int Max_Iter;
    double Eps;
    TRFunc f;

    public TSolve(int Max_Iter, double Eps, TRFunc f)
    {
        this.Max_Iter = Max_Iter;
        this.Eps = Eps;
        this.f = f;
    }

    public double Solve(double x0, double x1)
    {
        double xn1 = 0;
        double xn = x1;
        double xn_1 = x0;

        for (int n = 2; n <= Max_Iter; n++)
        {
            if (Math.Abs(f.CalcY(xn) - f.CalcY(xn_1)) < Eps)
            {
                break;
            }

            xn1 = xn - ((xn - xn_1) * f.CalcY(xn)) /
            (f.CalcY(xn) - f.CalcY(xn_1));

            Console.WriteLine("x_{0} = {1}", n, xn1);

            xn_1 = xn;
            xn = xn1;
        }

        return xn1;
    }
}
\end{verbatim}
В этом классе мы используем класс TRFunc, реализующий числовые функции. Для начала вычислений необходимо задать два значения x_0 и x_1. При инициализации класса следует определить два параметра - максимальное количество итераций Max\_Iter и минимальную невязку Eps. Вычисления останавливаются в двух условиях - либо когда превышено количество итераций либо, когда выполнится условие
|f(x_n)-f(x_{n-1})|<Eps.
Проведем тестирование нашего метода.
\begin{verbatim}
    TSinFunc Sin = new TSinFunc(-100, 100);
    TSolve Solve = new TSolve(10, 1E-12, Sin);

    Console.WriteLine("x_0 = {0}\tx_1 = {1}", 1, 1.5);
    Solve.Solve(1, 1.5);

    Console.WriteLine("\n\nx_0 = {0}\tx_1 = {1}", 1.7, 1.8);
    Solve.Solve(2, 2.2);
\end{verbatim}
Мы будем вычислять корни функции f(x)=\sin x. В результате двух запусков нашего класса мы получим следующие результаты
\begin{verbatim}
x_0 = 1 x_1 = 1.5

x_2 = -1.69660749346521

x_3 = -0.102640761680463

x_4 = 0.0809387254524748

x_5 = -3.00669920823837E-05

x_6 = 3.28414216333597E-08

x_7 = -4.94283429392287E-18

x_8 = 7.70371977754894E-34


x_0 = 1.7  x_1 = 1.8

x_2 = 3.80414325114683

x_3 = 3.111014449759

x_4 = 3.14383344379986

x_5 = 3.14159232994785

x_6 = 3.14159265359006

x_7 = 3.14159265358979
\end{verbatim}
Видно, что если рассматриваемая функция имеет несколько корней, то различные значения начальных приближений могут приводить к различным решениям нашего уравнения.

Рассмотрим теперь вопрос о решении системы трансцендентных уравнений. Пусть необходимо решить следующую систему уравнений

f_k(x_1,x_2,\dots,x_n)=0,\quad 1\le k\le n. ( 13.1)
Как правило такие системы решают методом простых итераций. Для этого необходимо систему 13.1 записать в виде
x_k=\varphi_k(x_1,x_2,\dots,x_n),\quad 1\le k\le n. ( 13.2)
Или в векторной форме
x=\varphi(x),
где $\varphi:\Bbb{R}^n\to\Bbb{R}^n$. Вместо нахождение корня системы 13.1 мы пришли к задаче нахождения неподвижной точки.

Метод простых итераций выглядит довольно просто. Необходимо задать начальное приближение x^0, а дальнейшие вычисления проводить по схеме

x^{n+1}=\varphi(x^n).
Однако успех этого метода зависит от свойств функции \varphi и начального приближения. Приведем одно достаточное условие сходимости метода простых итераций для случая, когда функции \varphi_k являются непрерывно дифференцируемыми. Построим матрицу M с элементами m_{ij}, определяемыми по формулам
m_{ij}=\max\left|\frac{\partial \varphi_i}{\partial x_j}\right|.
Достаточным условием сжимаемости отображения $\varphi$ является условие
\|M\|<1
в какой-либо матричной норме. В различных (но эквивалентных) нормах это условие выглядит так
\sum\limits_{j=1}^nm_{ij}<1
или
\sum\limits_{i=1}^nm_{ij}<1
или \sum\limits_{i,j=1}^nm^2_{ij}<1.

Ключевые термины

Корень функции - точка, в которой функция принимает нулевое значение.

Метод Ньютона - основной итерационный метод для нахождения приближенного решения системы нелинейных уравнений.

Начальное приближение - начальное значение последовательности, которая рассчитывается с помощью рекуррентной процедуры.

Метод секущих - двухшаговый итерационный метод решения нелинейных уравнений без необходимости вычислять производную.

Краткие итоги: Рассмотрены численные методы нахождения приближенных корней трансцендентных уравнений. Приведена объектно-ориентированная реализация наиболее популярных методов нахождения корней уравнений.

< Лекция 13 || Лекция 14: 123 || Лекция 15 >