чм4
.pdfНа основе полученных графиков, можно сделать следующий вывод: чем выше порядок метода Рунге-Кутта, тем выше точность решения.
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
