Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Болтушкин Л.С., группа 712-2, лабораторная 1.docx
Скачиваний:
12
Добавлен:
04.10.2024
Размер:
132.57 Кб
Скачать

Заключение

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

Приложение А

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

using System;

namespace zeidl

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Метод Зейделя ");

int n = 3; // Размерность системы уравнений

double[,] A = new double[3, 3] { { -10.25, 6.09, 3.44 }, { 9.64, -20.01, 9.38 }, { 0.6, -0.94, -6.06 } };

// Матрица коэффициентов системы уравнений

double[] B = new double[3] { -8.39, -1.1, 4.87 };

// Вектор свободных членов системы.

double[] X = new double[n]; // Массив для хранения решения

double[] XAdd = new double[n]; // Массив для временного хранения обновленного решения

Console.WriteLine();

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

{

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

{

Console.Write(A[i, j] + "\t");

}

Console.Write(" | " + B[i] + "\t");

Console.WriteLine();

}

// Вывод системы уравнений в виде матрицы

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

{

XAdd[i] = 0;

}

// Инициализация массива XAdd нулевыми значениями

int iteracionale = 0; // Счетчик итераций

double Eps = 0.001; // Заданная точность для остановки метода

do

{

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

{

X[i] = XAdd[i];

}

// Копирование текущего решения в массив X

XAdd[0] = B[0] / A[0, 0] - (X[1] * A[0, 1]) / A[0, 0] - (X[2] * A[0, 2]) / A[0, 0];

XAdd[1] = B[1] / A[1, 1] - (XAdd[0] * A[1, 0]) / A[1, 1] - (X[2] * A[1, 2] / A[1, 1]);

XAdd[2] = B[2] / A[2, 2] - (XAdd[0] * A[2, 0]) / A[2, 2] - (XAdd[1] * A[2, 1]) / A[2, 2];

// Обновление значений XAdd согласно методу Зейделя

iteracionale++;

} while (Math.Abs(XAdd[0] - X[0]) >= Eps || Math.Abs(XAdd[1] - X[1]) >= Eps || Math.Abs(XAdd[2] - X[2]) >= Eps);

// Проверка на сходимость метода по заданной точности

Console.WriteLine();

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

{

Console.WriteLine($"X{i} = {XAdd[i]}");

}

// Вывод решения

Console.WriteLine($"Итерации {iteracionale}");

// Вывод количества итераций, необходимых для достижения точности

}

}

}

Приложение Б

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

using System;

namespace chislmethods3

{

class Program

{

// Функция, возвращающая значение функции F(x)

static double Function(double x)

{

return 0.33 * x * x + 0.98 * x + 0.68;

}

// Функция, возвращающая значение производной функции F'(x)

static double FunctionDerivative(double x)

{

return 0.66 * x + 0.98 ;

}

// Функция, возвращающая значение функции-помощника для метода простых итераций

static double SupportFunction(double x, double l)

{

return Function(x) * l + x;

}

// Функция для нахождения последней точки, где функция меняет знак

private static double LastPoint(double lastpoint)

{

for (double i = lastpoint; i <= Math.PI; i++)

{

if (Function(lastpoint) * Function(i) < 0)

{

return i;

}

else lastpoint++;

}

return lastpoint;

}

// Метод Ньютона

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("Метод Ньютона");

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("Метод простых итераций");

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("У уравнения нет корней");

}

else

{

if (lastpoint < firstpoint)

{

(firstpoint, lastpoint) = (lastpoint, firstpoint);

}

MethodNewton(firstpoint, lastpoint);

SimpleIterations(firstpoint, lastpoint);

}

}

}

}