ЧМ Лабораторная работа 4
.pdf
Рисунок 2.5 – Результат для метода Рунге-Кутта 4-ой степени В таблице 2.3 представлены результаты работы всех методов.
11
Таблица 2.3 – Решение дифференциального уравнения
Точное решение |
Решение методом |
Решение методом |
Решение методом |
|
Эйлера |
Рунге-Кутта 2-го |
Рунге-Кутта 4-го |
|
|
порядка |
порядка |
|
|
|
|
y(x0) |
̃1̃(х0) |
̃2̃(х0) |
4̃(х0) |
|
|
|
|
y1(0,1) = 2,086 |
y1(0,1) = 1,939 |
y1(0,1) = 2,0766 |
y1(0,1) = 2,0856 |
|
|
|
|
y2(0,2) = 3,513 |
y2(0,2) = 3,153 |
y2(0,2) = 3,491 |
y2(0,2) = 3,513 |
|
|
|
|
y3(0,3) = 5,367 |
y3(0,3) = 4,706 |
y3(0,3) = 5,325 |
y3(0,3) = 5,367 |
|
|
|
|
y4(0,4) = 7,752 |
y4(0,4) = 6,675 |
y4(0,4) = 7,684 |
y4(0,4) = 7,752 |
|
|
|
|
y5(0,5) = 10,798 |
y5(0,5) = 9,151 |
y5(0,5) = 10,692 |
y5(0,5) = 10,797 |
|
|
|
|
y6(0,6) = 14,662 |
y6(0,6) = 12,247 |
y6(0,6) = 14,506 |
y6(0,6) = 14,662 |
|
|
|
|
y7(0,7) = 19,54 |
y7(0,7) = 16,0993 |
y7(0,7) = 19,315 |
y7(0,7) = 19,539 |
|
|
|
|
y8(0,8) = 25,671 |
y8(0,8) = 20,872 |
y8(0,8) = 25,354 |
y8(0,8) = 25,67 |
|
|
|
|
y9(0,9) = 33,349 |
y9(0,9) = 26,762 |
y9(0,9) = 32,909 |
y9(0,9) = 33,348 |
|
|
|
|
y10(1) = 42,934 |
y10(1) = 34,0102 |
y10(1) = 42,333 |
y10(1) = 42,934 |
|
|
|
|
y11(1,1) = 54,871 |
y11(1,1) = 42,905 |
y11(1,1) = 54,056 |
y11(1,1) = 54,87 |
|
|
|
|
y12(1,2) = 69,7 |
y12(1,2) = 53,795 |
y12(1,2) = 68,607 |
y12(1,2) = 69,699 |
|
|
|
|
y13(1,3) = 88,0885 |
y13(1,3) = 67,1 |
y13(1,3) = 86,632 |
y13(1,3) = 88,0863 |
|
|
|
|
y14(1,4) = 110,851 |
y14(1,4) = 83,328 |
y14(1,4) = 108,923 |
y14(1,4) = 110,848 |
|
|
|
|
12
Продолжение таблицы 2.3.
Точное решение |
Решение методом |
Решение методом |
Решение методом |
|
Эйлера |
Рунге-Кутта 2-го |
Рунге-Кутта 4-го |
|
|
порядка |
порядка |
|
|
|
|
y15(1,5) = 138,986 |
y15(1,5) = 103,089 |
y15(1,5) = 136,449 |
y15(1,5) = 138,982 |
|
|
|
|
y16(1,6) = 173,718 |
y16(1,6) = 127,118 |
y16(1,6) = 170,394 |
y16(1,6) = 173,712 |
|
|
|
|
y17(1,7) = 216,544 |
y17(1,7) = 156,301 |
y17(1,7) = 212,209 |
y17(1,7) = 216,536 |
|
|
|
|
y18(1,8) = 269,297 |
y18(1,8) = 191,705 |
y18(1,8) = 263,665 |
y18(1,8) = 269,288 |
|
|
|
|
y19(1,9) = 334,222 |
y19(1,9) = 234,613 |
y19(1,9) = 326,929 |
y19(1,9) = 334,21 |
|
|
|
|
y20(2) = 414,0649 |
y20(2) = 286,571 |
y20(2) = 404,650 |
y20(2) = 414,0489 |
|
|
|
|
Для каждого численного решения был построен совместный график полученной последовательности ̃(x̃i) и точного решения y(x). Графики представлены на рисунке 2.6, рисунке 2.7 и рисунке 2.8.
13
Рисунок 2.6 – Графики точек, полученных аналитически и методом Эйлера
Рисунок 2.7 – Графики точек, полученных аналитически и методом Рунге-Кутта 2-го порядка
14
Рисунок 2.8 – Графики точек, полученных аналитически и методом Рунге-Кутта 4-го порядка
Исходя из полученных данных можно сделать вывод, что метод РунгеКутта 4-го порядка является самым точным из всех трех представленных, так как рассчитанные им точки больше всего совпадают с теми, что были получены аналитическим решением.
15
Заключение
В ходе данной лабораторной работы были освоены вычислительные методы нахождения определенного интеграла, исследована точность вычислений при разном числе разбиений; освоена точность методов численного дифференцирования; изучены методы группы Рунге-Кутта для численного решения дифференциального уравнения первого порядка (задачи Коши).
16
Приложение А Численное интегрирование
double[] n = { 6, 40, 120, 400 }; int a = 5; int b = 7;
double h; double I = 0;
double sum, sum1, sum2;
void LeftRectangle(double n)
{
for (int j = 0; j < n; j++)
{
h = (b - a) / n; I = 0;
for (double x = a; x < b; x += h)
{
I += Math.Sin(0.25 * x) * Math.Sqrt(0.92 * x);
}
I *= h;
}
Console.WriteLine($"При n = {n} I = {I}");
}
void RightRectangle(double n)
{
for (int j = 0; j < n; j++)
{
h = (b - a) / n;
17
I = 0;
for (double x = a+h; x <= b; x += h)
{
I += Math.Sin(0.25 * x) * Math.Sqrt(0.92 * x);
}
I *= h;
}
Console.WriteLine($"При n = {n} I = {I}");
}
void Trapeze(double n)
{
for (int j = 0; j < n; j++)
{
h = (b - a) / n; sum = 0;
for (double x = a + h; x < b; x += h)
{
sum += Math.Sin(0.25 * x) * Math.Sqrt(0.92 * x);
}
I = h/2 * ((Math.Sin(0.25 * a) * Math.Sqrt(0.92 * a)) + (Math.Sin(0.25 * b) * Math.Sqrt(0.92 * b))) + h*sum;
}
Console.WriteLine($"При n = {n} I = {I}");
}
void Simpson(double n)
{
for (int j = 0; j < n; j++)
18
{
h = (b - a) / n;
I = sum1 = sum2 = 0;
for (int i = 0; i <= (n-1)/2; i++)
{
double x = a + (2 * i + 1) * h;
sum1 += Math.Sin(0.25 * x) * Math.Sqrt(0.92 * x);
}
for (int i = 0; i <= (n-2)/2; i++)
{
double x = a + 2 * i * h;
sum2 += Math.Sin(0.25 * x) * Math.Sqrt(0.92 * x);
}
I = h / 3 * ((Math.Sin(0.25 * a) * Math.Sqrt(0.92 * a)) + (Math.Sin(0.25 * b) * Math.Sqrt(0.92 * b)) + 4*sum1 + 2*sum2);
}
Console.WriteLine($"При n = {n} I = {I}");
}
Console.WriteLine("Метод левых прямоугольников"); for (int i = 0; i < n.Length; i++)
{
LeftRectangle(n[i]);
}
Console.WriteLine();
Console.WriteLine("Метод правых прямоугольников"); for (int i = 0; i < n.Length; i++)
19
{
RightRectangle(n[i]);
}
Console.WriteLine(); Console.WriteLine("Метод трапеций"); for (int i = 0; i < n.Length; i++)
{
Trapeze(n[i]);
}
Console.WriteLine(); Console.WriteLine("Метод Симпсона"); for (int i = 0; i < n.Length; i++)
{
Simpson(n[i]);
}
20
