
ЛР4 / ЧМ_Л4
.pdf2,09 |
1,81 |
2,08 |
2,09 |
|
|
|
|
2,61 |
2,19 |
2,6 |
2,61 |
|
|
|
|
3,37 |
2,71 |
3,35 |
3,37 |
|
|
|
|
4,48 |
3,45 |
4,44 |
4,48 |
|
|
|
|
6,14 |
4,48 |
6,05 |
6,14 |
|
|
|
|
8,67 |
5,96 |
8,5 |
8,67 |
|
|
|
|
12,62 |
8,1 |
12,28 |
12,61 |
|
|
|
|
18,92 |
11,26 |
18,26 |
18,91 |
|
|
|
|
29,22 |
16 |
27,94 |
29,22 |
|
|
|
|
46,53 |
23,19 |
43,94 |
46,51 |
|
|
|
|
76,32 |
34,33 |
71,07 |
76,28 |
|
|
|
|
129,02 |
51,83 |
118,18 |
128,92 |
|
|
|
|
224,75 |
79,83 |
201,95 |
224,51 |
|
|
|
|
403,43 |
125,33 |
354,63 |
402,85 |
|
|
|
|
11

Рисунок 14 — График
12
Заключение
В ходе работы были освоены вычислительные методы для нахождения определённого интеграла и исследована их точность при разном числе разбиений, что позволило оценить влияние шага на точность вычислений. Были изучены и сравнены методы численного дифференцирования, выявлены их преимущества и недостатки. Также были рассмотрены методы группы РунгеКутта для решения дифференциального уравнения первого порядка, где метод 4- го порядка показал наибольшую точность
13
Приложение А (обязательное)
Код для задания 1
using System; class Program
{
static void Main(string[] args)
{
double a = 4; double b = 5;
int[] partitions = { 6, 40, 120, 400 }; foreach (var n in partitions)
{
double h = (b - a) / n;
double[] xValues = new double[n + 1]; double[] fValues = new double[n + 1]; for (int i = 0; i <= n; i++)
{
xValues[i] = a + i * h;
fValues[i] = Function(xValues[i]);
}
double leftRectangleResult = LeftRectangleMethod(fValues, n, h); double rightRectangleResult = RightRectangleMethod(fValues, n, h); double trapezoidResult = TrapezoidMethod(fValues, n, h);
double simpsonResult = SimpsonMethod(fValues, n, h); Console.WriteLine($"Разбиения: {n}");
Console.WriteLine($"Левые прямоугольники{Math.Round(leftRectangleResult,2)}");
14
Console.WriteLine($"Правые прямоугольники: {Math.Round(rightRectangleResult,2)}");
Console.WriteLine($"Трапеции: {Math.Round(trapezoidResult,2)}"); Console.WriteLine($"Симпсон: {Math.Round(simpsonResult,2)}"); Console.WriteLine();
}
}
static double Function(double x)
{
return Math.Exp(0.84 * x) * Math.Sin(0.15 * x);
}
static double LeftRectangleMethod(double[] fValues, int n, double h)
{
double sum = 0.0;
for (int i = 0; i < n; i++)
{
sum += fValues[i];
}
return sum * h;
}
static double RightRectangleMethod(double[] fValues, int n, double h)
{
double sum = 0.0;
for (int i = 1; i <= n; i++)
{
sum += fValues[i];
}
return sum * h;
}
15
static double TrapezoidMethod(double[] fValues, int n, double h)
{
double sum = (fValues[0] + fValues[n]) / 2.0; for (int i = 1; i < n; i++)
{
sum += fValues[i];
}
return sum * h;
}
static double SimpsonMethod(double[] fValues, int n, double h)
{
if (n % 2 != 0) n++;
double sum = fValues[0] + fValues[n]; for (int i = 1; i < n; i++)
{
if (i % 2 == 0)
sum += 2 * fValues[i]; else
sum += 4 * fValues[i];
}
return sum * (h / 3);
}
}
16
Приложение Б Код для задания 2
using System; class Program
{
static void Main(string[] args)
{
double x = 2.0; double h = 0.1;
double leftDerivative = LeftDifference(f, x, h); double rightDerivative = RightDifference(f, x, h); double centralDerivative = CentralDifference(f, x, h);
Console.WriteLine($"Левая разностная производная: {Math.Round(leftDerivative,2)}");
Console.WriteLine($"Правая разностная производная: {Math.Round(rightDerivative, 2)}");
Console.WriteLine($"Центральная разностная производная: {Math.Round(centralDerivative, 2)}");
}
static double f(double x)
{
return Math.Pow(x, 3) - Math.Sqrt(x + 2);
}
static double LeftDifference(Func<double, double> func, double x, double h)
{
return (func(x) - func(x - h)) / h;
}
static double RightDifference(Func<double, double> func, double x, double h) 17
{
return (func(x + h) - func(x)) / h;
}
static double CentralDifference(Func<double, double> func, double x, double h)
{
return (func(x + h) - func(x - h)) / (2 * h);
}
}
18
Приложение В Код для задания 3
using System; class Program
{
static void Main(string[] args)
{
double x0 = 0; double y0 = 1; double h = 0.1; int n = 20;
double[] eulerResults = new double[n + 1]; double[] rk2Results = new double[n + 1]; double[] rk4Results = new double[n + 1]; eulerResults[0] = y0;
rk2Results[0] = y0; rk4Results[0] = y0;
for (int i = 1; i <= n; i++)
{
double x = x0 + (i - 1) * h;
eulerResults[i] = eulerResults[i - 1] + h * F(x, eulerResults[i - 1]);
}
for (int i = 1; i <= n; i++)
{
double x = x0 + (i - 1) * h;
double k1 = F(x, rk2Results[i - 1]);
double k2 = F(x + h, rk2Results[i - 1] + h * k1);
rk2Results[i] = rk2Results[i - 1] + (h / 2) * (k1 + k2); 19
}
for (int i = 1; i <= n; i++)
{
double x = x0 + (i - 1) * h;
double k1 = F(x, rk4Results[i - 1]);
double k2 = F(x + h / 2, rk4Results[i - 1] + (h / 2) * k1); double k3 = F(x + h / 2, rk4Results[i - 1] + (h / 2) * k2); double k4 = F(x + h, rk4Results[i - 1] + h * k3);
rk4Results[i] = rk4Results[i - 1] + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4);
}
Console.WriteLine("Метод Эйлера:"); PrintResults(eulerResults, h);
Console.WriteLine("Метод Рунге-Кутта 2-го порядка:"); PrintResults(rk2Results, h);
Console.WriteLine("Метод Рунге-Кутта 4-го порядка:"); PrintResults(rk4Results, h);
}
static double F(double x, double y)
{
return 3 * x * y;
}
static void PrintResults(double[] results, double h)
{
for (int i = 0; i < results.Length; i++)
{
double x = i * h;
Console.WriteLine($"x = {x:F1}, y = {Math.Round(results[i],2)}");
20