- •Введение
- •1 Ход работы
- •1.1 Численное интегрирование
- •1.2 Метод левого прямоугольника
- •1.3 Метод правого прямоугольника
- •1.4 Метод трапеций
- •1.5 Метод Симпсона
- •2 Численное дифференцирование
- •2.1 Левая и правая разностные производные
- •2.2 Центральная разностная производная
- •3 Численное решение дифференциального уравнения (задача Коши)
- •3.1 Метод Эйлера
- •3.2 Метод Рунге-Кутта 2-го порядка
- •3.3 Метод Рунге-Кутта 4-го порядка
- •Заключение
Заключение
В ходе выполнения лабораторной работы были освоены вычислительные методы нахождения определенного интеграла и исследования точности вычислений при разном числе разбиений, а также методы группы Рунге-Кутта для численного решения дифференциального уравнения первого порядка (задачи Коши).
Приложение А
(обязательное)
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)}");
}
}
}
