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

Заключение

В ходе выполнения лабораторной работы были освоены вычислительные методы нахождения определенного интеграла и исследования точности вычислений при разном числе разбиений, а также методы группы Рунге-Кутта для численного решения дифференциального уравнения первого порядка (задачи Коши).

Приложение А

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

using System;

class NumericalIntegration

{

// Функция под интегралом

static double f(double x)

{

return Math.Cos(0.05 * x) * Math.Exp(0.8 * x);

}

// Метод левых прямоугольников

static double LeftRectangleMethod(double a, double b, int n)

{

double h = (b - a) / n;

double sum = 0.0;

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

{

sum += f(a + i * h);

}

return Math.Round(sum * h, 2);

}

// Метод правых прямоугольников

static double RightRectangleMethod(double a, double b, int n)

{

double h = (b - a) / n;

double sum = 0.0;

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

{

sum += f(a + i * h);

}

return Math.Round(sum * h, 2);

}

// Метод трапеций

static double TrapezoidMethod(double a, double b, int n)

{

double h = (b - a) / n;

double sum = 0.5 * (f(a) + f(b));

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

{

sum += f(a + i * h);

}

return Math.Round(sum * h, 2);

}

// Метод Симпсона

static double SimpsonMethod(double a, double b, int n)

{

if (n % 2 == 1) n++;

double h = (b - a) / n;

double sum = f(a) + f(b);

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

{

sum += f(a + i * h) * (i % 2 == 0 ? 2 : 4);

}

return Math.Round(sum * h / 3, 2);

}

static void Main()

{

double a = 2.0, b = 5.0;

int[] ns = { 6, 40, 120, 400 };

foreach (int n in ns)

{

Console.WriteLine($"n = {n}");

Console.WriteLine($"Метод левых прямоугольников: {LeftRectangleMethod(a, b, n)}");

Console.WriteLine($"Метод правых прямоугольников: {RightRectangleMethod(a, b, n)}");

Console.WriteLine($"Метод трапеции: {TrapezoidMethod(a, b, n)}");

Console.WriteLine($"Метод Симпсона: {SimpsonMethod(a, b, n)}");

Console.WriteLine();

}

}

}

Приложение Б

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

using System;

class DerivativeCalculator

{

// Функция, производную которой надо найти

static double f(double x)

{

return Math.Cos(x + 3) - 3 * x + 2;

}

// Левая разностная производная

static double LeftDerivative(double x, double h)

{

return Math.Round((f(x) - f(x - h)) / h, 2);

}

// Правая разностная производная

static double RightDerivative(double x, double h)

{

return Math.Round((f(x + h) - f(x)) / h, 2);

}

// Центральная разностная производная

static double CentralDerivative(double x, double h)

{

return Math.Round((f(x + h) - f(x - h)) / (2 * h), 2);

}

// Точное значение производной

static double ExactDerivative(double x)

{

return Math.Round(-Math.Sin(x + 3) - 3, 2);

}

static void Main()

{

double h = 0.1;

double x; // Значение точки, в которой нужно вычислить производную

// Значение точки, для вычисления

x = 3.0;

Console.WriteLine($"f'(x) точное: {ExactDerivative(x)}");

Console.WriteLine($"Левая разностная производная: {LeftDerivative(x, h)}");

Console.WriteLine($"Правая разностная производная: {RightDerivative(x, h)}");

Console.WriteLine($"Центральная разностная производная: {CentralDerivative(x, h)}");

}

}

Приложение В

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

using System;

class DifferentialEquationSolver

{

static double Function(double x, double y)

{

return x * x + y - 1; // y' = f(x, y) = x^2 + y - 1

}

// Метод Эйлера (Метод Рунге-Кутта 1-го порядка)

static double EulerMethod(double x0, double y0, double h, int steps)

{

double y = y0;

double x = x0;

for (int i = 1; i <= steps; i++)

{

y += h * Function(x, y);

x += h;

}

return y;

}

// Метод Рунге-Кутта 2-го порядка

static double RungeKutta2ndOrder(double x0, double y0, double h, int steps)

{

double y = y0;

double x = x0;

for (int i = 1; i <= steps; i++)

{

double k1 = h * Function(x, y);

double k2 = h * Function(x + h, y + k1);

y += (k1 + k2) / 2.0;

x += h;

}

return y;

}

// Метод Рунге-Кутта 4-го порядка

static double RungeKutta4thOrder(double x0, double y0, double h, int steps)

{

double y = y0;

double x = x0;

for (int i = 1; i <= steps; i++)

{

double k1 = h * Function(x, y);

double k2 = h * Function(x + h / 2.0, y + k1 / 2.0);

double k3 = h * Function(x + h / 2.0, y + k2 / 2.0);

double k4 = h * Function(x + h, y + k3);

y += (k1 + 2 * k2 + 2 * k3 + k4) / 6.0;

x += h;

}

return y;

}

static void Main()

{

double x0 = 0, y0 = 1, h = 0.1;

int steps = 20;

Console.WriteLine("Метод Эйлера:");

for (int i = 1; i <= steps; i++)

{

double yi = EulerMethod(x0, y0, h, i);

Console.WriteLine($"y{i}({Math.Round(x0 + i * h, 2)}) = {Math.Round(yi, 2)}");

}

Console.WriteLine("\nМетод Рунге-Кутта 2-го порядка:");

for (int i = 1; i <= steps; i++)

{

double yi = RungeKutta2ndOrder(x0, y0, h, i);

Console.WriteLine($"y{i}({Math.Round(x0 + i * h, 2)}) = {Math.Round(yi, 2)}");

}

Console.WriteLine("\nМетод Рунге-Кутта 4-го порядка:");

for (int i = 1; i <= steps; i++)

{

double yi = RungeKutta4thOrder(x0, y0, h, i);

Console.WriteLine($"y{i}({Math.Round(x0 + i * h, 2)}) = {Math.Round(yi, 2)}");

}

}

}