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

ЛР2 / ЧМ_Л2

.odt
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
91.08 Кб
Скачать

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

Федеральное государственное бюджетное образовательное учреждение высшего образования

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

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

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

Отчет по лабораторной работе №2

по дисциплине «Численные методы»

Студент гр. 733-1

_______Сметанников Д.Е

Принял:

ст.преп. каф. КИБЭВС

_______Катаева Е.С

Содержание

1 Введение 3

2 Ход работы 4

Заключение 6

Приложение А 7

  1. Введение

Цель работы – освоить методы отделения и уточнения решения систем нелинейных уравнений

Вариант задания представлен на рис. 1

Рисунок 1 — Задание

  1. Ход работы

Для начала необходимо построить график для следующей системы:

График представлен на рисунке 1.

Рисунок 1 — График системы уравнений

В результате построения графика можно заметить, что существую всего два корня, находящиеся в диапазонах:

−4.2 ≤ 𝑥 ≤ −0.4

−0.2 ≤ y ≤ 0.6

Само решение будет проводиться методом Ньютона через матрицы, реализованным кодом. Результат выполнения программы можно наблюдать на рисунке 2.

Рисунок 2 — Результат работы

Код программы можно наблюдать в приложении А

Начальная точка

Число итераций

Решение

Проверочная система

x0=(1,1)T

6

X=(1.545, 1.502)T

Индивидуальная система

x0 = (-4.1, -0.5)T

3

X=(-4.08,0.4)T

Заключение

В результате выполнения данной лабораторной работы были освоены отделения и уточнения решения систем нелинейных уравнений.

Приложение А

(обязательное)

Код для задания 1

class Program

{

static double[,] Jacobian(Func<double[], double>[] f, double[] x, double h)

{

int n = x.Length;

double[,] J = new double[n, n];

for (int i = 0; i < n; i++)

{

for (int j = 0; j < n; j++)

{

double[] x_forward = (double[])x.Clone();

x_forward[j] += h;

double[] x_backward = (double[])x.Clone();

x_backward[j] -= h;

J[i, j] = (f[i](x_forward) - f[i](x_backward)) / (2 * h);

}

}

return J;

}

static double[] GaussSolve(double[,] A, double[] b)

{

int n = A.GetLength(0);

double[] x = new double[n];

for (int i = 0; i < n; i++)

{

int maxRow = i;

for (int k = i + 1; k < n; k++)

{

if (Math.Abs(A[k, i]) > Math.Abs(A[maxRow, i]))

maxRow = k;

}

for (int j = 0; j < n; j++)

{

double temp = A[i, j];

A[i, j] = A[maxRow, j];

A[maxRow, j] = temp;

}

double tempB = b[i];

b[i] = b[maxRow];

b[maxRow] = tempB;

for (int k = i + 1; k < n; k++)

{

double factor = A[k, i] / A[i, i];

for (int j = i; j < n; j++)

{

A[k, j] -= factor * A[i, j];

}

b[k] -= factor * b[i];

}

}

for (int i = n - 1; i >= 0; i--)

{

x[i] = b[i] / A[i, i];

for (int k = i - 1; k >= 0; k--)

{

b[k] -= A[k, i] * x[i];

}

}

return x;

}

static (double[], int) NewtonMethod(Func<double[], double>[] f, double[] x0, double tol, int maxIter)

{

int n = x0.Length;

double[] x = (double[])x0.Clone();

double h = 1e-5;

for (int iter = 0; iter < maxIter; iter++)

{

double[] F = new double[n];

for (int i = 0; i < n; i++)

{

F[i] = -f[i](x);

}

double[,] J = Jacobian(f, x, h);

double[] deltaX = GaussSolve(J, F);

bool stop = true;

for (int i = 0; i < n; i++)

{

if (Math.Abs(deltaX[i]) >= tol || Math.Abs(F[i]) >= tol)

{

stop = false;

break;

}

}

if (stop)

return (x, iter + 1);

for (int i = 0; i < n; i++)

{

x[i] += deltaX[i];

}

}

throw new Exception("Метод Ньютона не сошелся за указанное число итераций");

}

static double F1(double[] x)

{

return 2 * Math.Pow(x[0], 2) - 12 * x[0] * x[1] + 15 * x[0] + 8;

}

static double F2(double[] x)

{

return 2 * Math.Pow(x[0], 2) + 9 * x[0] * x[1] + 5 * x[0] + 2;

}

static void Main()

{

Func<double[], double>[] f = { F1, F2 };

double[] x0 = { -4.1, -0.5 };

double tol = 0.001;

int maxIter = 100;

try

{

var (solution, iterations) = NewtonMethod(f, x0, tol, maxIter);

Console.WriteLine($"Решение найдено за {iterations} итераций.");

for (int i = 0; i < solution.Length; i++)

{

Console.WriteLine($"x[{i + 1}] = {solution[i]}");

}

}

catch (Exception e)

{

Console.WriteLine(e.Message);

}

}

}

Томск 2024

Соседние файлы в папке ЛР2