cm3
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра безопасности информационных систем (КИБЭВС)
ЧИСЛЕННОЕ РЕШЕНИЕ НЕЛИНЕЙНОГО УРАВНЕНИЯ С ОДНОЙ ПЕРЕМЕННОЙ
Отчет по лабораторной работе №3 по дисциплине¾Численные методы¿
Студент гр. 730-2 Подойницын К.В. 01.11.2021
Доцент каф.КИБЭВС Якимук А.Ю. 01.11.2021
Томск 2021
2
1 Введение
Цель работы: получить навыки решения нелинейного уравнения с одной переменной методом ньютона, простых итераций и методом дихотомии.
Для тестирования использовать систему уравнений:
x2 + 4x 5 = 0
Решения: x1 = 5; x2 = 1:
3
2 Ход работы
2.1 Этап отделения
Первым шагом была найдена начальная граница промежутка. Она была выражена из производной индивидуальной функции. Индивидуальная функция:
3:97x2 + 8:02x + 1:22;
Была найдена производная функции:
7:94x + 8:02;
Далее была вычислена начальная граница промежутка:
7:94x + 8:02 = 0; x= -1.010;
Конечная граница интервала была найдена програмным методом Intervals. Листинг прграммы представлен в приложении А.
4
2.2 Нахождение корня
Листинг программы представлен в Приложении А.
Рисунок 1 – скриншот работы программы
5
2.3 Таблица результатов
Метод |
Начальная точка |
Число итераций |
Корень |
|
|
|
|
Дихотомии |
-1.010 |
13 |
-0,1659 |
|
|
|
|
Ньютона |
-1.010 |
4 |
-0,1657 |
|
|
|
|
Простых итераций |
-1.010 |
18 |
-0,1671 |
|
|
|
|
6
3Заключение
Входе выполнения данной лабораторной работы были получены навыки решения нелинейного уравнения с одной переменной методом ньютона, простых итераций и методом дихотомии.
7
Приложение А
(обязательное)
using System; namespace laba3_cm
{
class Program
{
static void Main(string[] args)
{
double a = -1.010, b; b = Intervals(a);
if (a == b)
{
Console.WriteLine("Уравнение не имеет корней");
}
else
{
if (b < a)
(a, b) = (b, a); Dichotomy(a, b); Newton(a, b); SimpleI(a, b);
}
}
private static double Intervals(double b) //поиск второй грани
{
for (double i = b; i <= Math.PI; i++)
{
if (F(b) * F(i) < 0)
{
return i;
8
}
else b++;
}
return b;
}
static double F(double x) //функция
{
return 3.97 * x * x + 8.02 * x + 1.22;
}
static double FProizvodnaya(double x) //производная функции
{
return 7.94 * x + 8.02;
}
static double Phi(double x, double L) //функция фи
{
return F(x) * L + x;
}
static void Dichotomy(double a, double b) //Дихотомия
{
int k = 0; double koren = 0;
double d = (a + b) / 2;
while (b - a > 0.001 || F(d) > 0.001)
{
d = (a + b) / 2;
if (F(b) * F(d) < 0)
{
a = d;
koren = Math.Round(a, 4); k++;
}
else
9
{
b = d;
koren = Math.Round(b, 4); k++;
}
}
Console.WriteLine("Метод дихотомии:");
Console.WriteLine($"Кол-во итераций: {k}");
Console.WriteLine($"Корень: {koren}\n");
}
static void Newton(double a, double b) //Ньютон
{
int k = 0;
double d = (a + b) / 2;
if (Math.Abs(F(d)) >= 0.001)
{
while (Math.Abs(F(d)) >= 0.001)
{
d = d - F(d) / FProizvodnaya(d); k++;
}
}
else
{
k++;
}
Console.WriteLine("Метод Ньютона:"); Console.WriteLine($"Кол-во итераций: {k}"); Console.WriteLine($"Корень: {Math.Round(d, 4)}\n");
}
static void SimpleI(double a, double b) //Простые итерации
{
10
double X0, L, Xi; X0 = b;
L = -2 / FProizvodnaya(X0);
X0 = b;
int k = 0; do
{
Xi = X0;
X0 = Phi(Xi, L); k++;
}
while (Math.Abs(X0 - Xi) > 0.001); Console.WriteLine("Метод простых итераций:"); Console.WriteLine($"Кол-во итераций: {k}"); Console.WriteLine($"Корень: {Math.Round(X0, 4)}\n");
}
}
}