
чм2
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМЫ НЕЛИНЕЙНЫХ УРАВНЕНИЙ
Отчёт по лабораторной работе №2 по дисциплине «Численные методы»
Студент гр. 713-1
________ В.С. Колосова
________
Принял Старший преподаватель кафедры КИБЭВС
_________ Е.С. Катаева
________
Томск 2024
Введение
В ходе выполнения лабораторной работы необходимо написать
программу для численного решения системы нелинейного уравнения методом
Ньютона.
2

1 ХОД РАБОТЫ
Для решения проверочного уравнения методом Ньютона взята начальная точка (3; 3) методом графического отделения корней (рисунок 1.1).
Рисунок 1.1 – Графическое определение точки для проверочного уравнения
В качестве расчётной формулы выбран матричный вид:
( +1) |
= ( ) − −1(( )) (( )) |
(1) |
3

Результат работы программы представлен на рисунке 1.2. Листинг про-
граммы представлен в приложении А.
Рисунок 1.2 – Результат работы программы, реализующей метод Ньютона
Для решения индивидуального уравнения методом Ньютона взята начальная точка (2; 6) методом графического отделения корней (рисунок 1.3).
Рисунок 1.3 – Графическое определение точки для индивидуального уравнения
4

Результат работы программы представлен на рисунке 1.4. Листинг про-
граммы представлен в приложении Б.
Рисунок 1.4 – Результат работы программы, реализующей метод Ньютона
Результаты работы программы представлены в таблице 1.
Таблица 1 – Результаты работы программы
Уравнение |
Начальная точка |
Число итераций |
Решение |
||||
|
|
|
|
|
|
|
|
Проверочное |
(0) |
= 3, (0) = 3 |
6 |
|
|
1,546 |
|
|
0 |
1 |
|
|
= (1,502) |
||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
Индивидуальное |
(0) |
= 2 , (0) = 6 |
18 |
|
|
|
−2,000 |
|
0 |
1 |
|
|
= (−2,000) |
||
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
5
Заключение
В ходе выполнения лабораторной работы написана программа для численного решения системы нелинейного уравнения методом Ньютона.
6
Приложение А
double[] answers = new double[] { 3.0, 3.0 }; // начальная точка (3; 3) int max_iterations = 1000; // максимальное количество итераций
for (int iteration = 0; iteration < max_iterations; iteration++)
{
double[] new_answers = (double[])answers.Clone(); // копия решения для сравнения
// вычисляем значения функций
double f1 = Math.Pow(new_answers[1], 3) - Math.Pow(new_answers[0], 2) - 1; // x2^3 - x1^2 - 1
double f2 = new_answers[1] * Math.Pow(new_answers[0], 3) - new_answers[0] - 4; // x2 * x1^3 - x1 - 4
// матрица Якоби
double[,] jacobi = new double[2, 2];
jacobi[0, 0] = -2 * new_answers[0]; // df1/dx1
jacobi[0, 1] = 3 * Math.Pow(new_answers[1], 2); // df1/dx2
jacobi[1, 0] = 3 * Math.Pow(new_answers[0], 2) * new_answers[1] - 1; // df2/dx1
jacobi[1, 1] = Math.Pow(new_answers[0], 3); // df2/dx2
//решаем систему линейных уравнений Jacobi * delta = -F double[] f = new double[] { f1, f2 };
double[] delta = new double[2];
//вычисляем [delta] = [-F] * [jacobi]^-1 (приближенно)
double det = jacobi[0, 0] * jacobi[1, 1] - jacobi[0, 1] * jacobi[1, 0];
delta[0] = -(f[0] * jacobi[1, 1] - f[1] * jacobi[0, 1]) / det; 7
delta[1] = -(f[1] * jacobi[0, 0] - f[0] * jacobi[1, 0]) / det;
// обновляем значения после итерации answers[0] = new_answers[0] + delta[0]; answers[1] = new_answers[1] + delta[1];
// проверка сходимости и вывод
if (Math.Abs(answers[0] - new_answers[0]) < 0.001 && Math.Abs(answers[1] - new_answers[1]) < 0.001)
{
Console.WriteLine($"Решение сошлось после {iteration + 1}
итераций");
Console.WriteLine($"x1 = {answers[0]:F3}, x2 = {answers[1]:F3}"); break;
}
}
8
Приложение Б
double[] answers = new double[] { 2.0, 6.0 }; // начальная точка (2; 6) int max_iterations = 1000; // максимальное количество итераций
for (int iteration = 0; iteration < max_iterations; iteration++)
{
double[] new_answers = (double[])answers.Clone(); // копия решения для сравнения
// вычисляем значения функций
double f1 = 2 * Math.Pow(new_answers[0], 2) - 3 * new_answers[0] * new_answers[1] + 4; // 2*x^2 - 3*x*y + 4
double f2 = 2 * Math.Pow(new_answers[0], 2) - new_answers[0] * Math.Pow(new_answers[1], 3) - 12 * new_answers[0] - 16; // 2*x^2 - x*y^3 - 12*x - 16
// матрица Якоби
double[,] jacobi = new double[2, 2];
jacobi[0, 0] = 4 * new_answers[0] - 3 * new_answers[1]; // df1/dx jacobi[0, 1] = -3 * new_answers[0]; // df1/dy
jacobi[1, 0] = 4 * new_answers[0] - Math.Pow(new_answers[1], 3) - 12; // df2/dx jacobi[1, 1] = -3 * new_answers[0] * Math.Pow(new_answers[1], 2); // df2/dy
//решаем систему линейных уравнений Jacobi * delta = -F double[] f = new double[] { f1, f2 };
double[] delta = new double[2];
//вычисляем [delta] = [-F] * [jacobi]^-1 (приближенно)
double det = jacobi[0, 0] * jacobi[1, 1] - jacobi[0, 1] * jacobi[1, 0];
delta[0] = -(f[0] * jacobi[1, 1] - f[1] * jacobi[0, 1]) / det; 9
delta[1] = -(f[1] * jacobi[0, 0] - f[0] * jacobi[1, 0]) / det;
// обновляем значения после итерации answers[0] = new_answers[0] + delta[0]; answers[1] = new_answers[1] + delta[1];
// проверка сходимости и вывод
if (Math.Abs(answers[0] - new_answers[0]) < 0.001 && Math.Abs(answers[1] - new_answers[1]) < 0.001)
{
Console.WriteLine($"Решение сошлось после {iteration + 1} итераций"); Console.WriteLine($"x1 = {answers[0]:F3}, x2 = {answers[1]:F3}"); break;
}
}
10