Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

чм2

.pdf
Скачиваний:
3
Добавлен:
01.12.2024
Размер:
290.09 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра комплексной информационной безопасности электронно-

вычислительных систем (КИБЭВС)

ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМЫ НЕЛИНЕЙНЫХ УРАВНЕНИЙ

Отчёт по лабораторной работе №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

Соседние файлы в предмете Численные методы