ЧислМетодЛаб2
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Факультет безопасности (ФБ)
Кафедра безопасности информационных систем (БИС)
ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ
Отчѐт по лабораторной работе 2
по дисциплине «Численные методы»
Студент гр.731-2
__________ Батаев А.С. 28.10.2022
Руководитель:
Доцент кафедры КИБЭВС
__________ __________ Якимук А.Ю. 28.10.2022
Томск 2022
2
Оглавление
1 |
Введение................................................................................................................ |
3 |
|
2 |
Ход работы ........................................................................................................... |
4 |
|
|
2.1 |
Этап отделения ................................................................................................ |
4 |
|
2.2 |
Нахождение корня........................................................................................... |
5 |
|
2.3 |
Таблица результатов ....................................................................................... |
5 |
3 |
Заключение........................................................................................................... |
6 |
3
1 Введение
Цель работы: получить навыки решения нелинейного уравнения с одной переменной методом ньютона, простых итерацийи методом дихотомии.
Для тестирования использовать систему уравнений:
x2 + 4x − 5 = 0
Найдем производную функции:
2x + 4
После была экспериментально вычислена начальная граница промежутка. Для тестовой системы начальной точкой была выбрана точка со значением 0, потому что при этом значении количество итераций всех методов минимально.
Рисунок 1 – Работа программы с тестовой системой
Решения: x1 = −5; x2 = 1.
4
2 Ход работы
2.1 Этап отделения
Первым шагом была найдена производная индивидуальной функции.
Индивидуальная функция:
0.13x2 + 0.28x + 0.1;
Производная функции:
0.26x + 0.28;
Также была экспериментально вычислена начальная граница промежутка. Для тестовой системы начальной точкой была выбрана точка с значением -1, потому что при этом значении количество итераций всех методов минимально.
Конечная граница интервала была найдена программным методом
LastPoint.
5
2.2 Нахождение корня
Листинг программы представлен в Приложении А.
Рисунок 2 – Работа программы с реальной системой
2.3 Таблица результатов
Таблица 1 – Значения корней
Метод |
Начальная точка |
Число итераций |
Корень |
|
|
|
|
Дихотомии |
-1 |
13 |
-0,4525 |
|
|
|
|
Ньютона |
-1 |
4 |
-0,4482 |
|
|
|
|
Простых итераций |
-1 |
18 |
-0,4585 |
|
|
|
|
6
3Заключение
Входе выполнения данной лабораторной работы были получены навыки решения нелинейного уравнения с одной переменной методом ньютона, простых итераций и методом дихотомии.
7
Приложение A
(Обязательное)
Код приложения
using System;
namespace chislmethods3
{
class Program
{
static double Function(double x)
{
return 0.13 * x * x + 0.28 * x + 0.1;
}
static double FunctionDerivative(double x)
{
return 0.13 * x + 0.28;
}
static double SupportFunction(double x, double l)
{
return Function(x) * l + x;
}
private static double LastPoint(double lastpont)
{
for (double i = lastpont; i <= Math.PI; i++)
{
if (Function(lastpont) * Function(i) < 0)
{
return i;
}
else lastpont++;
}
return lastpont;
}
static void MethodDichotomy(double firstpoint, double lastpoint)
{
int step = 0; double x = 0;
double medium = (firstpoint + lastpoint) / 2;
while (lastpoint - firstpoint > 0.001 || Function(medium) > 0.001)
{
medium = (firstpoint + lastpoint) / 2;
if (Function(lastpoint) * Function(medium) < 0)
{
firstpoint = medium;
x = Math.Round(firstpoint, 4); step++;
}
else
{
lastpoint = medium;
x = Math.Round(lastpoint, 4); step++;
}
}
Console.WriteLine("Method Dichotomy"); Console.WriteLine($"step: {step}"); Console.WriteLine($"x: {x}\n");
8
}
static void MethodNewton(double firstpoint, double lastpoint)
{
int step = 0;
double medium = (firstpoint + lastpoint) / 2; if (Math.Abs(Function(medium)) >= 0.001)
{
while (Math.Abs(Function(medium)) >= 0.001)
{
medium = medium - Function(medium) / FunctionDerivative(medium); step++;
}
}
else
{
step++;
}
Console.WriteLine("Method Newton"); Console.WriteLine($"step: {step}"); Console.WriteLine($"x: {Math.Round(medium, 4)}\n");
}
static void SimpleIterations(double firstpoint, double lastpoint)
{
double x0, l, x; x0 = lastpoint;
l = -2 / FunctionDerivative(x0); int step = 0;
do
{
x = x0;
x0 = SupportFunction(x, l); step++;
}
while (Math.Abs(x0 - x) > 0.001); Console.WriteLine("Simple Iterations"); Console.WriteLine($"step: {step}"); Console.WriteLine($"x: {Math.Round(x0, 4)}\n");
}
static void Main(string[] args)
{
double firstpoint = -1, lastpoint; lastpoint = LastPoint(firstpoint); if (firstpoint == lastpoint)
{
Console.WriteLine("The equation has no roots");
}
else
{
if (lastpoint < firstpoint)
(firstpoint, lastpoint) = (lastpoint, firstpoint); MethodDichotomy(firstpoint, lastpoint); MethodNewton(firstpoint, lastpoint); SimpleIterations(firstpoint, lastpoint);
}
}
}
}