Лабораторная работа 3 Решение нелинейных алгебраических уравнений 1. Постановка учебно-практической задачи Написать и оформить в виде модуля (Unit) набор функций, с помощью которых можно находить решения нелинейных алгебраических уравнений вида: F(x) = 0. Функции должны обеспечить возможность: задания вида уравнения F(x) = 0; задания интервала поиска решения и начального приближения; задания требуемой точности решения; выбор метода решения. 2. Учебно-методические цели работы Выполнение лабораторной работы направлено на: практическое освоение простейших приемов программирования численных методов; освоение приемов применения разработанного и библиотечных модулей для решения исследовательских задач;. 3. Рекомендации по выполнению работы При разработке модуля решения нелинейных уравнений следует обратить внимание на общую схему численного метода решения нелинейных алгебраических уравнений и особенности отдельных методов. 3.1. Общая схема численного метода решения нелинейных уравнений Численное решение нелинейных алгебраических уравнений основано на построении последовательности значений вида: { Xi }, i = 0, 1, 2, ..., сходящейся к решению уравнения. Эта последовательность строится с помощью итерационного процесса вида: Xn+1 = Pm(Xn, Fn), где Fn = F(Xn), а итерационная формула Pm определяется применяемым методом решения уравнения. Для некоторых методов в формулу Pm могут входить значения приближений, полученных на более ранних шагах итерационного процесса: Xn-1, Xn-2, ..., Fn-1, Fn-2,... и значения производных функции F(X) в этих приближениях. Условием завершения итерационного процесса поиска решения является: Abs( F(Xn) ) . Значение >0 задается заранее как требуемая точность решения. Поскольку на практике условия сходимости методов решения выполняются не всегда, и итерационный процесс может идти бесконечно, то наряду с требуемой точностью решения задается nmax максимальное количество итераций. Для запуска итерационного процесса необходимо задать начальное приближение X0. Кроме того, задается интервал [a, b], на котором надо искать решение уравнения. Важным также является вопрос о существовании решения на интервале [a, b] и его единственности (некоторые методы гарантируют сходимость только при единственности решения на интервале). Простейшим достаточным условием существования решения является: функция F(X) непрерывна на интервале [a, b]; F(a)*F(b) <= 0. Таким образом, задача на численное решение нелинейного уравнения ставится так: на интервале [a, b] с точностью , но не более чем за nmax шагов, найти решение уравнения F(X) = 0, используя X0 в качестве начального приближения. 3.2. Метод дихотомии Формула метода дихотомии (деления пополам) имеет вид: д Xn = P (Xn-2, Xn-1, Fn-2, Fn-1), где: Fn-2* Fn-1 0, т.е. отрезок [Xn-2, Xn-1] содержит корень уравнения. На n-ом шаге метода отрезок [Xn-2, Xn-1] делится пополам, и в качестве следующего отрезка берется та половина отрезка, которая содержит корень уравнения: X = (Xn-2 + Xn-1) / 2; если F(X)*Fn-1 0, то: X n= Xn-1, Xn-1 = X иначе: Xn-1 = Xn-2, Xn = X В качестве начального отрезка берется отрезок [a, b]. Рис. 5.1. Метод секущих 3.3. Метод секущих Метод секущих (метод хорд) отличается от метода дихотомии тем, что отрезок [Xn-2, Xn-1] делится не пополам, а пропорционально значениям функции на концах отрезка, т.е.: X = Xn-2 - (Xn-1 - Xn-2) / (Fn-1 - Fn-2) * Fn-2. Геометрически (см. рис. 5.1) точка X изображается как точка пересечения прямой, соединяющей точки (Xn-1, Fn-1), (Xn-2, Fn-2) с осью X. Рис. 5.2. Метод касательных 3.4. Метод касательных (метод Ньютона) В методе Ньютона каждое следующее приближение ищется как решение линейного уравнения вида: Fn-1 + Fn-1 * (X - Xn-1) = 0, которое является отрезком степенного ряда функции F(X) в окрестности точки Xn-1. Формула метода Ньютона имеет вид: Xn = Xn-1 - Fn-1/Fn-1 Геометрически (см. рис. 5.2) точка Xn изображается как точка пересечения касательной к графику функции F(X) в точке Xn-1 с осью X. 4. Рекомендации по организации программного интерфейса Функции решения нелинейных алгебраических уравнений следует оформить в виде отдельного модуля Solver. Рекомендуемый состав заголовочного файла этого модуля состоит в следующем. // Модуль решения нелинейных уравнений typedef double (TFun)(double); // Найти решение нелинейного уравнения long Root(double x0, double a, double b, double eps, root); // Вход : // x0 - начальное приближение решения // a, b - интервал поиска решения // eps - требуемая точность решения // kStp - максим. к-во итераций // Fun - функция левой части ур-я // Выход : // root - полученное решение // возвращаемое значение – код завершения: // = -1 - нарушение условия Fun(a)*Fun(b)<= // > 0 - к-во итераций, за которое решение // = 0 - выполнено kStp итераций, заданная 5. Формулировка заданий Основное задание 1. Написать программу, включающую: long kStp, TFun Fun, double& 0 получено с заданной точностью точность не достигнута основной модуль в составе: тестовой функции вычисления значений правой части решаемого уравнения и головной функции main, обеспечивающей ввод исходных данных задачи и вывод результата; модуль Solver, обеспечивающий решение нелинейного уравнения методом дихотомии. 2. Провести сравнительный анализ сходимости метода дихотомии для различных начальных значений. Дополнительное задание 1. В модуль Solver добавить функции решения нелинейного уравнения методом секущих и методом касательных. Для этого в заголовочную часть модуля добавить описание типа метода (enum Method) и функцию установки метода решения (SetMethod): enum Method {m_dih, m_sek, m_tan}; // m_dih – метод дихотомии // m_sek – метод секущих // m_tan – метод касательных // Установить метод pешения уравнения void SetMethod(Method meth); 2. В основной модуль добавить несколько тестовых функций вычисления правых частей уравнения. Обеспечить возможность выбора решаемого уравнения с передачей соответствующей функции через указатель. 3. Провести сравнительный анализ сходимости методов для различных уравнений и различных начальных значений.