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

ЛР4 / ЧМ_Л4

.pdf
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
369.24 Кб
Скачать

2,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

Соседние файлы в папке ЛР4