documentmn

13
Ministerul Educaţiei al Republicii Moldova Raport Lucrarea de laborator Nr.1 la Metode Numerice A efectuat:st.gr.TI-142 A verificat:

Upload: dmitriigreen

Post on 07-Dec-2015

212 views

Category:

Documents


0 download

DESCRIPTION

Metode numerice laborator 1

TRANSCRIPT

Page 1: DocumentMN

Ministerul Educaţiei al Republicii Moldova

RaportLucrarea de laborator Nr.1

la Metode Numerice

A efectuat:st.gr.TI-142

A verificat:

Chisinau 2015Scopul lucrării :

Page 2: DocumentMN

1) Să se separe toate rădăcinile reale ale ecuației f(x)=0 unde y=f(x) este o funcție reală de variabilă reală.

2) Să se determine o radacină reală a ecuației date cu ajutorul metodei înjumătățirii intervalului cu o eroare mai mică decît ε=10-2

3) Să se precizeze rădăcina obținută cu exactitatea ε= 10-6 ,utilizînd: • metoda aproximațiilor succesive ; • metoda tangentelor (Newton); • metoda secantelor . 4) Să se compare rezultatele luînd în considerație numărul de iterații , evaluarile pentru funcții și derivată.

Ecuațiile propuse spre rezolvare :

Varianta 15 : (2-x)ex - 0.5=0Varianta 16 : x3 - 12x + 9 = 0

Realizarea lucrării :

1) Separarea rădăcinilor Pentru prima ecuație este convenabilă folosirea metodei grafice de separare a rădăcinilor. Scriem ecuația (2-x)ex - 0.5=0 sub forma φ (x)=ɡ(x) și obținem:

ex=0.5

2−x;

a) Pentru determinarea punctelor de intersecție a funcțiilor y=φ(x ) si y ¿ ɡ(x) construim graficele :

b) Pentru a doua ecuație folosim metoda șirului lui Rolle . Derivata f’(x) = 3x2-12 se anulează pentru x=±2 . Prin urmare șirul lui Rolle este următorul :

x -3 -2 2 3y 18 25 -7 0

Avem doua alternante de semn si o singura radacina reala ξ (-2, 2).

Page 3: DocumentMN

Pentru a determina celelalte rădăcini folosim metoda grafică.

Astfel mai avem 2 rădăcini ξ (-4, -3) si ξ(2,3).

2) Calculul rădăcinii reale prin metoda înjumătățirii intervalului :

a)

#include <iostream>#include<math.h>using namespace std;double f(double x) {

return (2 - x) * exp(x) - 0.5;}int main() {

int k = 0;double

a = -2,b = 2,c = 0,eps = 0.0001;

while ((b - a)>eps) {k++;c = a + (b - a) / 2;if (f(c) == 0)

break;if (f(a)*f(c)<0)

b = c;else

a = c;}cout << " Radacina x=" << c << endl;cout << "Numarul de iteratii: " << k;cout << endl;system("pause");return 0;

}

Page 4: DocumentMN

b)

#include <iostream>#include<math.h>using namespace std;double f(double x) {

return pow(x, 3) - 12 * x + 9;}int main() {

int k = 0;double

a = -2,b = 2,c = 0,eps = 0.0001;

while ((b - a)>eps) {k++;c = a + (b - a) / 2;if (f(c) == 0)

break;if (f(a)*f(c)<0)

b = c;else

a = c;}cout << " Radacina x=" << c << endl;cout << "Numarul de iteratii: " << k;cout << endl;system("pause");return 0;

}

Page 5: DocumentMN

3). Calculul rădăcinii reale prin metoda aproximațiilor succesive :

a) Pentru aplicarea metodei aproximațiilor succesive verificăm condiția de convergență.

Scriind ecuația în forma x = φ (x) obținem : x = - 0.5

2∗e x , φ ' (x) = 14

ex , φ ' (x) > 1 ,

prin urmare sirul diverge.

Codul sursa :#include<iostream>#include<cmath>#include<cstdlib>using namespace std;double fi(double x) {

return (-0.5 + 2 * exp(x)) / exp(x);}int main() {

int k = 0;double x0, x1, eps;cout << "Introduceti valoare initiala x0= ";cin >> x0;cout << "introduceti eroarea : ";cin >> eps;while (1) {

x1 = fi(x0);k++;if (abs(x1 - x0)<eps) { cout << "Rezultatul: " << x0 << endl << "Nr de iteratii "

<< k << endl; break; }x0 = x1;

}cout << endl;system("pause");return 0;

}

Page 6: DocumentMN

a)

Verificăm condiția de convergență :

x3 - 12x + 9 = 0 => -12x = -9 - x3 => x = x3+912

=> x = 1

12x3

+ 9

12 =>φ (x) =

112

x3 +

912

φ ' (x) = 3

12x2

3

12x2

> 1 => -2 < x < 2

#include<iostream>#include<cmath>#include<cstdlib>using namespace std;double fi(double x) {

return (pow(x, 3) + 9) / 12;}int main() {

int k = 0;double x0, x1, eps;cout << "Introduceti valoare initiala x0= ";cin >> x0;cout << "introduceti eroarea : ";cin >> eps;while (1) {

x1 = fi(x0);k++;if (abs(x1 - x0)<eps) { cout << "Rezultat: " << x0 << endl << "Nr de iteratii " <<

k << endl; break; }x0 = x1;

}cout << endl;system("pause");

Page 7: DocumentMN

return 0;}

4. Calculul rădăcinii reale prin metoda tangentelor(Newton) :

a)

#include<iostream>#include<cmath>#include<cstdlib>using namespace std;double f(double x) {

return (2 - x) * exp(x) - 0.5;}double fderiv(double x) {

return -exp(x) - (2 - x)*exp(x);}int main() {

int k = 0;double x0, x1, eps;cout << "Introduceti valoare initiala x0= ";cin >> x0;cout << "introduceti eroarea : ";cin >> eps;while (1) {

x1 = x0 - f(x0) / fderiv(x0);k++;if (abs(x1 - x0)<eps) { cout << "Rezultat " << x0 << endl << "Nr de iteratii " << k

<< endl; break; }x0 = x1;

}cout << endl;system("pause");return 0;

}

Page 8: DocumentMN

b)

#include<iostream>#include<cmath>#include<cstdlib>using namespace std;double f(double x) {

return pow(x,3) - 12*x + 9;}double fderiv(double x) {

return 3 * pow(x, 2)-12;}int main() {

int k = 0;double x0, x1, eps;cout << "Introduceti valoare initiala x0= ";cin >> x0;cout << "introduceti eroarea : ";cin >> eps;while (1) {

x1 = x0 - f(x0) / fderiv(x0);k++;if (abs(x1 - x0)<eps) { cout << "Rezultat " << x0 << endl << "Nr de iteratii " << k

<< endl; break; }x0 = x1;

}cout << endl;system("pause");return 0;

}

Page 9: DocumentMN

5). Calculul rădăcinii reale prin metoda secantelor :

a)

#include <iostream>#include <math.h>using namespace std;double f(double x){

return (2 - x) * exp(x) - 0.5;}int main(){

double x2, x1, x3, y, eps = 0.000001;int n = 0;x3 = 0;y = 0;cout << "Introduceti x1: ";cin >> x1;cout << "Introduceti x2: ";cin >> x2;do {

n++;y = x3;x3 = x2 - (f(x2)*(x2 - x1) / (f(x2) - f(x1)));x1 = x2;x2 = x3;

} while (fabs(y - x3) >= eps);cout << "Radacina x= " << x3 << endl;cout << "Nr de iteratii : " << n << endl;system("pause");return 0;

}

Page 10: DocumentMN

b)

#include <iostream>#include <math.h>using namespace std;double f(double x){

return pow(x, 3) - 12 * x + 9;}int main(){

double x2, x1, x3, y, eps = 0.000001;int n = 0;x3 = 0;y = 0;cout << "Introduceti x1: ";cin >> x1;cout << "Introduceti x2: ";cin >> x2;do {

n++;y = x3;x3 = x2 - (f(x2)*(x2 - x1) / (f(x2) - f(x1)));x1 = x2;x2 = x3;

} while (fabs(y - x3) >= eps);cout << "Radacina x= " << x3 << endl;cout << "Nr de iteratii : " << n << endl;system("pause");return 0;

}

Page 11: DocumentMN

6) Compararea rezultatelor și concluzia

Metoda Radacina (x0) Nr. De iteratii Valoarea f = (x0) Eroarea ε

f1(x) f(x) f1(x) f(x) f1(x) f(x)

Bisectiei 0.789063 1.92969 9 9 0.0008 0.002 0.01

Apr. Succesive 0.791289 1.92722 8 7 0.00000009 0.0000002 0.000001

Tangentelor 0.791288 1.92722 4 10 0.0000001 0.0000001 0.000001

Secantelor 0.791288 1.92722 7 6 0.0000001 0.0000003 0.000001

Concluzie :

În urma efectuării lucrării de laborator am realizat în practică rezolvarea numerică a ecuațiilor algebrice și transcendente. Putem concluziona că cea mai eficientă metoda este metoda tangentelor,calculatorul efectuînd un numar mic de iterații , însă numarul acestor iterații este dependent de aproximația inițială aleasă. Acest număr este cu atît mai mic cu cît aproximația inițială este mai aproape de rădăcina căutată.Un minus al metodei lui Newton(tangentelor) poate fi considerat necesitatea calculului derivatei, ceea ce în unele cazuri poate fi dificil sau practic imposibil. Pentru astfel de funcții o alegere mai bună este metoda secantelor. In final am obtinut niste rezultate cu o precizie inalta.