ЧМ3
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
Решение нелинейного уравнения с одной переменной
Отчет по лабораторной работе №3 по дисциплине "Численные методы"
Студент гр. 739-1 Климанов М.Д.
. .2020
Ст. преподаватель кафедры КИБЭВС Якимук А.Ю.
. .2020
Томск 2020
2
1Введение
Цель работы: изучить методы решения нелиненйных уравнений с одной переменной.
Задание:Необходимо найти корни индивидуального уравнения вида f(x) = 0 в два этапа – отделе-
ние и уточнение корня:
1.Этап отделения корня – выполнить с помощью графического анализа или анализа поведения производной функции.Нужно получить в результате хотя бы один отрезок [a b;], на котором функция монотонна и имеет ровно один корень, и выписать в отчет полученные границы отрезка.
2.Этап уточнения корня – составить программу, выполняющую уточнение корня четырьмя способами (Метод дихотомии,метод Ньютона, метод секущих, метод простых итераций).
Индивидуальное задание:
xe x + sin3x + 5 = 0
3
2Ход работы
Для выполнения практической работы был выбран язык программирования C#. На рисунке 2.1 представлен график функции, согласно индивидуальному заданию.
Рисунок 2.1 - График заданной функции
По графику видно, что в точках -1,42 и 5,17 находятся решение данного уравнения. Для вычислений будем использовать точку -1,42, исходя из этого, зададим интервал [a,b]. За a возьмем точку -1,4, а за b - точку -1,5.
Далее, реализуем метод дихотомии, используя взятый интервал.
Листинг программы в которой реализован метод дихотомии на языке C# представлена в приложении А.
Результат работы программы представлен на рисунке 2.2.
Рисунок 2.2 - Результат работы программы "Метод дихометрии"
Суть метода заключается в вычислении каждого последующего приближения по формуле x=(left+right)/2, где left - это левая граница интервала, а right - правая граница интервала. Далее, если заданная функция от х больше нуля, то присваивается значению конца отрезка значение х, иначе значению начала интервала присваиваевается значение х. Этот процесс повторяется, пока не выполнится условие останова.
Далее реализуем метод Ньютона.
Листинг программы в которой реализован метод Ньютона на языке C# представлен в приложении
А.
Результат работы программы представлен на рисунке 2.3.
Рисунок 2.3 - Результат работы программы "Метод Ньютона"
4
Суть метода заключается в вычислении каждого последующего приближения с помощью деления основной функции на её производную.Процесс происходит до тех пор, пока не выполнится условие останова.
Далее реализуем метод секущих.
Листинг программы в которой реализован метод секущих на языке C# представлен в приложении
А.
Результат работы программы представлен на рисунке 2.4.
Рисунок 2.4 - Результат работы программы "Метод секущих"
Суть метода заключается в вычислении каждого последующего приближения по формуле right = right - (right - left) / (F(right) - F(left)) * F(right). Процесс происходит до тех пор, пока не выполнится условие останова.
Далее реализуем метод простых итераций.
Листинг программы в которой реализован метод простых итераций на языке C# представлен в приложении А.
Результат работы программы представлен на рисунке 2.5.
Рисунок 2.5 - Результат работы программы "Метод простых итераций"
Суть метода заключается в вычислении каждого последующего приближения c помощью начального преобразования функции. Выражается x из начального уравнения и используется получившееся выражение для дальнейшей работы. Характер сходимости и сам факт сходимости метода зависит от выбора начального приближения решения.
Результаты реализации каждого метода представлены в таблице 2.1.
5
Таблица 2.1 - Результаты применения каждого метода
|
|
Решение |
Начальная точка |
Число |
|
|
|
|
итераций |
|
|
|
|
|
Метод |
ди- |
-1,4 |
x0=-1,4 |
20000 |
хотомии |
|
|
|
|
|
|
|
|
|
Метод |
|
-2,67931998410326 |
x0=-1,4 |
13 |
Ньютона |
|
|
|
|
|
|
|
|
|
Метод |
cе- |
-2,69989436939846 |
x0=-1,5,x1=-1,4 |
5 |
кущих |
|
|
|
|
|
|
|
|
|
Метод |
|
-2.6801 |
x0=-1,4 |
4 |
простых |
|
|
|
|
итераций |
|
|
|
|
|
|
|
|
|
6
3Заключение
Впроцессе выполнения лабораторной работы были изучены такие методы решения нелинейного уравнения как: Метод дихотомии, метод Ньютона, метод секущих, метод простых итераций, а также разработаны программы, реализующие эти методы для решения индивидуального нелинейного уравнения.
Отчет написан согласно ОС ТУСУР.
7
Приложение А
(обязательное)
Исходный код программы
using System;
namespace Чм_3
{
class Program
{
static void Main(string[] args)
{
double left, right, eps; //границы интервала left = -1,4;
right = -1,5; //точность eps = 0.01;
Console.WriteLine($"Точность: {eps}");
Console.WriteLine("Метод дихотомии:");
Dihotomiya(left, right, eps);
Console.WriteLine("Метод Ньютона:");
Newton(left, right, eps);
Console.WriteLine("Метод секущих:");
Secu(left, right, eps);
Console.WriteLine("Метод простых итераций:");
Iter(left, right, eps);
}
//функция, в которой будет исходное уравнение public static double F(double x)
{
return -Math.Pow(2,-x) + 10 - 0.5 * Math.Pow(x,2);
}
//произодная
public static double FPr(double x)
{
return x + Math.Pow(2,-x) + Math.Log(2);
}
//Метод дихотомии
public static void Dihotomiya(double left, double right, double eps)
{
double x, f; int iter = 0;
8
Console.WriteLine($"Начало интервала = {left}, Конец интервала = {right}"); do
{
x = (left + right) / 2; f = F(x);
if (f > 0) right = x; else left = x; iter++;
}
while (Math.Abs(f) > eps && iter < 20000); Console.WriteLine($"Решение методом Дихотомии: х = {x}"); Console.WriteLine($"Кол-во итераций: {iter}");
Console.WriteLine("************************************************");
}
//метод Ньютона
public static void Newton(double left, double right, double eps)
{
double f, df, middle; int iter = 0; middle = (left + right) / 2;
Console.WriteLine($"Начало интервала = {left}, Конец интервала = {right}"); do
{
f = F(middle); df = FPr(middle);
middle = middle - f / df; iter++;
}
while (Math.Abs(f) > eps && iter < 20000); Console.WriteLine($"Решение методом Дихотомии: х = {middle}"); Console.WriteLine($"Кол-во итераций: {iter}");
Console.WriteLine("************************************************");
}
//Метод секущих
public static void Secu(double left, double right, double eps)
{
double f; int iter = 0;
Console.WriteLine($"Начало интервала = {left}, Конец интервала = {right}"); do
{
f = F(left);
right = right - (right - left) / (F(right) - F(left)) * F(right); iter++;
}
while (Math.Abs(f) > eps && iter < 5); Console.WriteLine($"Решение методом секущих: х = {right}"); Console.WriteLine($"Кол-во итераций: {iter}");
9
Console.WriteLine("************************************************");
}
//Метод простых итераций
public static void Iter(double left, double right, double eps)
{
double a = left, b = right; double c = b + a / 2;
int iter = 0;
Console.WriteLine($"Начало интервала = {left}, Конец интервала = {right}"); do
{
b = F(a); iter++; a = b;
}
while (Math.Abs(a - F(a)) > eps);
Console.WriteLine($"Решение методом простых итераций: х = {a}"); Console.WriteLine($"Кол-во итераций: {iter}"); Console.WriteLine("************************************************"); Console.ReadKey();
}
}
}