Politechnika Śląska
Gliwice
Wydział Automatyki Elektroniki i Informatyki
Rok akademicki 2015/2016
Kierunek: Automatyka i Robotyka sem. 4
Semestr letni
Metody Numeryczne
Laboratorium
Ćw. 10:
Przybliżone rozwiązywanie równań
różniczkowych zwyczajnych
Wykonali:
Kamil TAMAKA
Bartosz BANAŚ
Grupa 5 Sekcja 2
Data odbycia ćwiczenia:
4.05.2016
1.1. Kod źródłowy programu do zadania pierwszego:
#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;
int main()
{
float x0 = 2, y0 = 2 , h = 1, x_max = 5, dy, C;
float stop = (x_max - x0) / h;
float tab[100][3];
tab[0][1] = y0;
C = y0 / exp(x0*x0 / 20);
for (int i = 0; i <= stop; i++)
{
tab[i][0] = x0 + i*h;
dy = 0.1 * tab[i][0] * tab[i][1] * h;
if (i < stop)
{
tab[i + 1][1] = tab[i][1] + dy;
}
tab[i][2] = C * exp((tab[i][0] * tab[i][0]) / 20);
cout << tab[i][0] << "\t " << tab[i][1] << "\t " << tab[i][2] << endl;
}
cin.clear();
cin.sync();
_getch();
return(0);
}
1.2. Wyniki:
2 2 2
3 2.4 2.56805
4 3.12 3.64424
5 4.368 5.7153
2.1. Kod źródłowy programu do zadania drugiego:
#include <iostream>
#include <conio.h>
#include <iomanip>
using namespace std;
float f(float x, float y)
{
return 0.1 * x * y;
}
int main()
{
float x0 = 2, y0 = 2, h = 1, x_max = 5, dy = 0;
float k1, k2, k3, k4;
float C = y0 / exp((x0*x0) / 20);
int i = 0;
cout << "i\t x0\t y0\t dy\ty_dok" << endl;
for (x0; x0 <= x_max; x0 += h, i++)
{
cout << setprecision(4) << fixed << i <<"\t"<< x0 << "\t" << y0 << "\t" << dy << "\t" <<
C * exp((x0*x0) /20 ) << endl;
k1 = h * f(x0, y0);
k2 = h * f(x0 + h/2, y0 + k1/2);
k3 = h * f(x0 + h/2, y0 + k2/2);
k4 = h * f(x0 + h, y0 + k3);
dy = (k1 + 2 * k2 + 2 * k3 + k4) / 6;
y0 += dy;
}
_getch();
return(0);
}
2.2. Wyniki:
i x0 y0 dy y_dok
0 2.00000 2.00000 0.00000 2.00000
1 3.00000 2.56802 0.56802 2.56805
2 4.00000 3.64404 1.07602 3.64424
3 5.00000 5.71431 2.07027 5.71530