Заключение
В ходе выполнения лабораторной работы были освоены методы решения систем линейных алгебраических уравнений и решения нелинейных уравнений с одной переменной.
Приложение А
(обязательное)
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);
}
}
}
}
