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

чм4

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

На основе полученных графиков, можно сделать следующий вывод: чем выше порядок метода Рунге-Кутта, тем выше точность решения.

11

Заключение

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

Получены и проанализированы результаты выполнения программ, построены графики для третьего задания.

12

Приложение А

using System;

class Program

{

static void Main()

{

// Задаем границы интегрирования double a = 2.0;

double b = 4.0;

// Задаем количество разбиений int[] partitions = { 6, 40, 120, 400 };

foreach (int n in partitions)

{

double leftRect = LeftRectangleMethod(a, b, n); double rightRect = RightRectangleMethod(a, b, n); double trapezoidal = TrapezoidalMethod(a, b, n); double simpson = SimpsonMethod(a, b, n);

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

Console.WriteLine($"Метод левых прямоугольников:

{leftRect}");

Console.WriteLine($"Метод правых прямоугольников:

{rightRect}");

Console.WriteLine($"Метод трапеций: {trapezoidal}");

Console.WriteLine($"Метод Симпсона: {simpson}");

Console.WriteLine();

}

13

}

static double Function(double x)

{

return Math.Cos(0.56 * x) * Math.Log(0.52 * 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 += Function(a + i * h);

}

return sum * h;

}

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 += Function(a + i * h);

}

14

return sum * h;

}

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

{

double h = (b - a) / n;

double sum = (Function(a) + Function(b)) / 2.0;

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

{

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

}

return sum * h;

}

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

{

// Убедимся, что n четное if (n % 2 != 0)

{

n++;

}

double h = (b - a) / n;

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

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

{

if (i % 2 == 0)

15

{

sum += 2 * Function(a + i * h);

}

else

{

sum += 4 * Function(a + i * h);

}

}

return sum * h / 3.0;

}

}

16

Приложение Б

using System;

class Program

{

static void Main()

{

double h = 0.1; double x = 1.0;

double leftDerivative = LeftDerivative(x, h); double rightDerivative = RightDerivative(x, h); double centralDerivative = CentralDerivative(x, h); double exactDerivative = ExactDerivative(x);

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

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

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

Console.WriteLine($"Точное значение производной: {exactDerivative}");

}

static double Function(double x)

{

return Math.Pow(x, 3) - 2 * Math.Pow(x, 2) + 5;

}

17

static double LeftDerivative(double x, double h)

{

return (Function(x) - Function(x - h)) / h;

}

static double RightDerivative(double x, double h)

{

return (Function(x + h) - Function(x)) / h;

}

static double CentralDerivative(double x, double h)

{

return (Function(x + h) - Function(x - h)) / (2 * h);

}

static double ExactDerivative(double x)

{

// Производная f'(x) = 3x^2 - 4x return 3 * Math.Pow(x, 2) - 4 * x;

}

}

18

Приложение В

using System;

class Program

{

static void Main()

{

double h = 0.1; // Шаг

double x0 = 0.0; // Начальная точка double y0 = 1.0; // Начальное условие int n = 20; // Количество шагов

// Массивы для хранения результатов double[] x = new double[n + 1]; double[] yEuler = new double[n + 1]; double[] yRK2 = new double[n + 1]; double[] yRK4 = new double[n + 1];

//Заполнение массива x for (int i = 0; i <= n; i++)

{

x[i] = x0 + i * h;

}

//Начальные условия

yEuler[0] = y0; yRK2[0] = y0; yRK4[0] = y0;

// Метод Эйлера

19

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

{

yEuler[i] = yEuler[i - 1] + h * Function(x[i - 1], yEuler[i - 1]);

}

// Метод Рунге-Кутта 2-го порядка for (int i = 1; i <= n; i++)

{

double k1 = Function(x[i - 1], yRK2[i - 1]);

double k2 = Function(x[i - 1] + h, yRK2[i - 1] + h * k1); yRK2[i] = yRK2[i - 1] + (h / 2) * (k1 + k2);

}

// Метод Рунге-Кутта 4-го порядка for (int i = 1; i <= n; i++)

{

double k1 = Function(x[i - 1], yRK4[i - 1]);

double k2 = Function(x[i - 1] + h / 2, yRK4[i - 1] + h / 2 * k1); double k3 = Function(x[i - 1] + h / 2, yRK4[i - 1] + h / 2 * k2); double k4 = Function(x[i - 1] + h, yRK4[i - 1] + h * k3); yRK4[i] = yRK4[i - 1] + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);

}

// Вывод результатов

Console.WriteLine("x\tМетод Эйлера\tРунге-Кутта 2\t\tРунге-Кутта

4\tТочное решение");

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

{

20

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