Universitatea Tehnica Cluj-Napoca
Facultatea de Automatizari si Calculatoare
Sectia Automatica
An 1, Grupa 3111
METODE DE INTEGRARE A ECUAŢIILOR DIFERENŢ 414e49e ;IALE DE ORDINUL ÎNTÂI
Prof. Pop Kun Dorel Student: Imre Attila
Introducere
Se stie ca multe probleme din domeniul fizicii teoretice si al ingineriei se reduc la rezolvarea unor ecuatii sau sisteme de ecuatii diferentiale. Pe când rezolvarea lor analitica se face pe un model idealizat teoretic, transpunerea lor pe calculator presupune efectuarea unui compromis între precizia cu care se calculeaza rezultatul si timpul de rulare al algoritmului.
Integrarea numerica a ecuatiilor diferentiale
Având date:
si
se poate afla solutia y la valori discrete ale lui t.
Metoda lui Euler
Luam dezvoltarea în serie Taylor in vecinatatea lui t0:
Retinem numai primul termen derivat si definim:
pentru a obtine:
Metoda înjumatatirii (de medie)
Se bazeaza pe metoda lui Euler. Aproximarea creste în precizie evaluând panta de doua ori pe fiecare interval de latime h.
Calculam o tentativa a lui y la mijloc:
Re-evaluam panta:
Valoarea finala a lui y la capatul intervalului va fi:
Programul
Programul implementeaza cele doua metode de mai sus si traseaza graficele solutiilor gasite. Se va putea urmari diferenta dintre convergenta solutiilor suprapunând graficele si rulând algoritmii cu un numar variabil de iteratii.
Codul sursa
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <dos.h>
int SW, SH; // dimensiunile ecranului
double zx, zy, gw, gh; // parametri de afisare
double l_lim, r_lim, u_lim, d_lim, h; // intervalul functiei
// functia
double func_init=0;
double func(double t, double y)
// metoda lui Euler
// rezultatul sub forma de vector valori double
// trabuie specificat numarul de iteratii
void euler(double *ret, int n)
// metoda lui medianei
// rezultatul sub forma de vector valori double
// trabuie specificat numarul de iteratii
void midpoint(double *ret, int n)
// initializare parametri functie:
- alocare memorie
- calculare pas h
double *init_func(int n, double a, double b, double c, double d)
// translatare coord. x in coordonate ecran
int fx(double x)
// translatare coord. y in coordonate ecran
int fy(double y)
// setare dimensiuni ecran
// necesare pentru afisare
void set_viewport(int a, int b, int c, int d)
// trasam graficul
void plot(double *data, int n, int col)
// initializare ecran video
void init_graphics()
int main()
closegraph();
return 0;
|