Sunteți pe pagina 1din 7

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică


Departamentul Informatica și Ingineria Sistemelor

RAPORT
la lucrarea de laborator nr.3

Metode si modele de calcul

Tema: INTERPOLAREA FUNCŢIILOR CU AJUTORUL


POLINOMULUI LAGRANGE

A efectuat: Prepelita Valentin,CR-222

A verificat: Struna V.

Chişinău 2023
1. Scopul lucrǎrii

1. Să se determine soluţiile numerice ale ecuaţiilor diferenţiale pe segmentul [a, b] prin metode
Euler, Euler modificat Runge – Kutta cu pasul h=0.05. Să se efectueze o analiză a rezultatelor
primite

Metoda Euler:
#include <iostream>
#include <cmath>
#define e 2.71
// Functia dy/dx
double func(double x, double y) {
return pow(e,-1.2*x)*(x*x+1.8);
}
// Metoda Euler
void euler(double a, double b, double y0, int N) {
double h = (b - a) / N; // pasul
double x = a, y = y0;
for (int i = 0; i <= N; i++) {
std::cout << "x = " << x << ", y = " << y << std::endl;
y = y + h * func(x, y);
x = x + h;
}
}
int main() {
double a = 0.0; // limita inferioara
double b = 1.0; // limita superioara
double y0 = 0.0; // conditia initiala
int N = 20; // numarul de pasi
euler(a, b, y0, N);
return 0;
}
Metoda Euler modificata:
#include <iostream>
#include <cmath>
#define e 2.71
// Functia dy/dx
double func(double x, double y) {
return pow(e,-1.2*x)*(x*x+1.8);
}
// Metoda Euler modificata (Heun)
void euler_modificat(double a, double b, double y0, int N) {
double h = (b - a) / N; // pasul
double x = a, y = y0;
for (int i = 0; i <= N; i++) {
std::cout << "x = " << x << ", y = " << y << std::endl;
double k1 = h * func(x, y);
double k2 = h * func(x + h, y + k1);
y = y + 0.5 * (k1 + k2);
x = x + h;
}
}
int main() {
double a = 0.0; // limita inferioara
double b = 1.0; // limita superioara
double y0 = 0.0; // conditia initiala
int N = 20; // numarul de pasi
euler_modificat(a, b, y0, N);
return 0;
}

Metoda Runge – Kutta


#include <iostream>
#include <cmath>
#define e 2.71
// Functia dy/dx
double func(double x, double y) {
return pow(e,-1.2*x)*(x*x+1.8);
}
// Metoda Runge-Kutta de ordinul 4
void runge_kutta(double a, double b, double y0, int N) {
double h = (b - a) / N; // pasul
double x = a, y = y0;

for (int i = 0; i <= N; i++) {


std::cout << "x = " << x << ", y = " << y << std::endl;
double k1 = h * func(x, y);
double k2 = h * func(x + h/2, y + k1/2);
double k3 = h * func(x + h/2, y + k2/2);
double k4 = h * func(x + h, y + k3);
y = y + (k1 + 2*k2 + 2*k3 + k4) / 6;
x = x + h;
}
}
int main() {
double a = 0.0; // limita inferioara
double b = 1.0; // limita superioara
double y0 = 0.0; // conditia initiala
int N = 20; // numarul de pasi
runge_kutta(a, b, y0, N);
return 0;
}
Metoda 1) Metoda 2) Metoda 3)

x = 0, y = 0 x = 0, y = 0 x = 0, y = 0
x = 0.05, y = 0.09 x= 0.05, y = 0.087446 x = 0.05, y = 0.087401
x = 0.1, y = 0.169955
x = 0.1, y = 0.174892 x = 0.1, y = 0.17004
x = 0.15, y = 0.248144
x =0.15, y = 0.255188 x= 0.15, y = 0.248266 x = 0.2, y = 0.322402
x = 0.2, y = 0.331344 x = 0.2, y = 0.322555 x = 0.25, y = 0.393111
x= 0.25, y = 0.403766 x= 0.25, y = 0.393292 x = 0.3, y = 0.460613
x = 0.3, y = 0.472818 x = 0.3, y = 0.46082 x = 0.35, y = 0.525212
x= 0.35, y = 0.538821 x= 0.35, y = 0.525441 x = 0.4, y = 0.587176
x = 0.45, y = 0.646746
x = 0.4, y = 0.602061 x = 0.4, y = 0.587426
x = 0.5, y = 0.70413
x = 0.45, y = 0.66279 x= 0.45, y = 0.647012 x = 0.55, y = 0.759516
x = 0.5, y = 0.721234 x = 0.5, y = 0.704412 x = 0.6, y = 0.813069
x= 0.55, y = 0.777591 x= 0.55, y = 0.759812 x = 0.65, y = 0.864931
x = 0.6, y = 0.832034 x = 0.6, y = 0.813377 x = 0.7, y = 0.915232
x= 0.65, y = 0.884719 x = 0.65, y = 0.86525 x = 0.75, y = 0.964082
x = 0.8, y = 1.01158
x = 0.7, y = 0.935781 x = 0.7, y = 0.91556
x = 0.85, y = 1.05781
x= 0.75, y = 0.985338 x= 0.75, y = 0.964417
x = 0.8, y = 1.0335 x = 0.8, y = 1.01192 x = 0.9, y = 1.10285
x = 0.85, y = 1.08035 x = 0.85, y = 1.05816 x = 0.95, y = 1.14676
x = 1, y = 1.1896
x = 0.9, y = 1.12597 x = 0.9, y = 1.1032
x = 0.95, y = 1.17043 x = 0.95, y = 1.14711
x = 1, y = 1.2138 x = 1, y = 1.18996

Concluzii
Analizând rezultatele, putem observa că toate cele trei metode (Euler, Euler modificată și Runge-
Kutta) produc rezultate similare pentru aceeași ecuație diferențială dy/dx = y pe intervalul [0,
1]. Cu toate acestea, există diferențe minore în valorile lui y calculate la fiecare pas.

Metoda Euler este cea mai simplă și are cea mai mare eroare dintre cele trei. Acest lucru este de
așteptat, deoarece metoda Euler este o metodă de prim ordin, ceea ce înseamnă că eroarea se
acumulează mai rapid în comparație cu metodele de ordin superior.

Metoda Euler modificată (sau metoda Heun) și metoda Runge-Kutta de ordinul 4 sunt ambele
metode de ordin superior și produc rezultate mai precise decât metoda Euler. În acest caz specific,
metoda Runge-Kutta pare să ofere rezultate ușor mai precise decât metoda Euler modificată, dar
diferența este foarte mică.

Este important de reținut că precizia acestor metode depinde de mărimea pasului h (cu cât pasul
este mai mic, cu atât precizia este mai mare), precum și de natura specifică a ecuației diferențiale
care se rezolvă. De asemenea, metodele de ordin superior, deși mai precise, necesită mai multe
calcule și, prin urmare, pot fi mai lente decât metodele de ordin inferior pentru un număr mare de
pași.

În concluzie, alegerea metodei depinde de cerințele specifice ale problemei dvs. - dacă aveți nevoie
de precizie mare, metoda Runge-Kutta ar putea fi cea mai bună alegere, în timp ce dacă aveți
nevoie de o soluție rapidă și aproximativă, metoda Euler ar putea fi suficientă.

S-ar putea să vă placă și