Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Звіт
про виконання лабораторної роботи №4
з курсу “Алгоритмічні основи криптології”
на тему: “ Основні чисельні методи розв’язування
систем лінійних диференціальних рівнянь ”
Мета роботи: вивчити основні чисельні методи розв’язування систем лінійних диференціальних рівнянь.
Завдання: написати програму на мові програмування Сі яка б розв’язувала диференціальне рівняння другого порядку методом Рунге – Кутта - Мерсона, попередньо звівши його до системи диференціальних рівнянь першого порядку.
Диф. рн.
Поч. умови
Проміжок інт.
Крок інт.
Похибка
y(0)=1.38
y’(0)=-0.2
[1;2]
0.1
0.001
Блок – схема алгоритму роботи програми
з постійним кроком
зі змінним кроком
функції f
Текст програми:
з постійним кроком
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define a 1
#define b 2
#define n 2
float f (int i, float x, float *y, float k)
{
switch (i)
{
case 0: return y[1]+k;
default: return (-0.25*((y[0]+k)+2*(y[1]+k))/x);
}
}
int main()
{
float k0,k1,k2,k3,k4,z,Rm[n];
int i;
float h=0.1;
float ym[n],x;
x=a;
ym[0]=1.38;
ym[1]=-0.2;
x=a-h;
do
{
z=x;
x+=h;
for(i=0;i<n;i++)
{
k0=h*f(i,z,ym,0);
k1=h*f(i,z+h/3,ym,k0/3);
k2=h*f(i,z+h/3,ym,k0/6+k1/6);
k3=h*f(i,z+h/2,ym,k0/8+3*k2/8);
k4=h*f(i,z+h,ym,k0/2-3*k2/2+2*k3);
Rm[i]=(-2*k0+9*k2-8*k3+k4)/30;
ym[i]+=(k0+4*k3+k4)/6;
}
printf("x=%2.2f ",x);
for(i=0;i<2;i++)
{
printf("y%i=%2.6f ",i+1,ym[i]);
printf(" Rm%d=%0.10f ",i+1, Rm[i]);
}
putchar('\n');
}
while (x<=b);
return 0;
}
зі змінним кроком
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define a 1
#define b 2
#define n 2
const int j=1;
float f (int i, float x, float *y, float k)
{
switch (i)
{
case 0: return y[1]+k;
default: return (-0.25*((y[0]+k)+2*(y[1]+k))/x);
}
}
int main()
{
float k0,k1,k2,k3,k4,z,Rm[n];
int i;
float h, e=0.001;
float ym[n],x;
h=0.1;
x=a;
ym[0]=1.38;
ym[1]=-0.2;
x=a-h;
do
{
z=x;
x+=h;
for(i=0;i<n;i++)
{
j: k0=h*f(i,z,ym,0);
k1=h*f(i,z+h/3,ym,k0/3);
k2=h*f(i,z+h/3,ym,k0/6+k1/6);
k3=h*f(i,z+h/2,ym,k0/8+3*k2/8);
k4=h*f(i,z+h,ym,k0/2-3*k2/2+2*k3);
Rm[i]=(-2*k0+9*k2-8*k3+k4)/30;
if (Rm[i]<(e/30)) h*=2;
if (Rm[i]>e){ h*=0.5; goto j;}
ym[i]+=(k0+4*k3+k4)/6;
}
printf("x=%2.2f ",x);
for(i=0;i<2;i++)
printf("y%i=%2.8f ",i+1,ym[i]);
printf(" h=%0.2f ",h);
putchar('\n');
}
while (x<=b);
getchar();
return 0;
}
Результат виконання програми:
з постійним кроком
зі змінним кроком
Висновок: Розв’язання систем лінійних диференціальних рівнянь методом Ейлера, Рунге – Кута або методами із змінним кроком інтегрування можна досить легко реалізувати на ЕОМ за допомогою програми в середовищі Сі. Основна перевага використання методу із змінним кроком інтегрування полягає в існуванні можливості розв’язування систем диференціальних рівнянь із заданою похибкою. Розв’язання таких систем на ЕОМ є дуже актуальним, оскільки цей процес є набагато легшим та короткотривалішим ніж розв’язання систем лінійних диференціальних рівнянь вручну.