Sunteți pe pagina 1din 11

Ministerul Educaţiei Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică şi Microelectronică.
Departamentul Informatică și Ingineria Sistemelor

Raport la
Lucrare de laborator Nr.1
la Metode și Modele de Calcul

A efectuat: st. gr. IA-181 Paniș Iulian

A verificat: lect.univ. Moraru Vasile

Chișinau, 2019
Rezolvarea numerică a ecuațiilor neliniare

Sarcini de lucru:
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 rădăcină reală a ecuației date cu ajutorul metodei injumă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,evaluările pentru funcții
și derivată.

Nr. Variantei: 13
a) 𝑥 lg 𝑥 − 1.2 = 0 b) 𝑥 3 − 0.1𝑥 2 + 0.4𝑥 − 1.5 = 0

1a)Separarea rădăcinilor prin metoda grafică:


𝑥 lg 𝑥 − 1.2 = 0
1.2
𝑦 = lg⁡(𝑥) 𝑦=
𝑥

Ecuația are o singură rădăcină reală pe intervalul [1; 4]


1b)Separarea rădăcinilor prin metoda analitică:
𝑥 3 − 0.1𝑥 2 + 0.4𝑥 − 1.5 = 0
0.1+1.5
𝑘= = 16 [-16; 16]
0.1

′ (𝑥)
15𝑥 2 − 𝑥 + 2
𝑓 =
5
15𝑥 2 − 𝑥 + 2 = 0
𝛥 = (−1)2 − 4 ∗ 15 ∗ 2 = −121 < 0
-16 0 16
- - +

Ecuația are o singură rădăcină reală pe intervalul [0; 16]

2. Determinarea unei rădăcini reale prin metoda înjumătățirii intervalului


Listingul:
#include<iostream>
#include<math.h>

using namespace std;

double func(double x)
{
return //functia;
}

int main(){

double Epsilon = 0.01;

double x, x0, x1, a, b, y;

std::cout<<"Introduceti intervalul [a, b]"<<endl;


std::cout<<"a="; cin>>a;
std::cout<<"b="; cin>>b;

x0=a; x1=b; x=x0; y=func(x);

if (func(x0)*func(x1)<0){

while ( (y<-Epsilon) || (y>Epsilon) ){


x=(x0+x1)/2;
y=func(x);

if (func(x0)*y<0){
x1=x;
} else {
x0=x;
}
cout<<"\n\nF("<<x<<")="<<func(x);
}

} else
std::cout<<"Erroare interval";
}
Rezultatele pentru functia 𝑥 lg 𝑥 − 1.2 = 0 :

Rezultatele pentru functia 𝑥 3 − 0.1𝑥 2 + 0.4𝑥 − 1.5 = 0 :


2. Precizarea rădăcinii
2.1 Metoda aproximațiilor succesive
Listingul:
#include <iostream>
#include <math.h>

using namespace std;

double func(double x){


return //functia;
}

int Iter(double func(double), double *x){


double eps = 0.000001;
int itmax = 100;
double dx, f;
int it;
dx = -func(*x);

for(it = 1; it<=itmax; it++){


f = func(*x);

if(fabs(f)>fabs(dx))
goto divergent;

dx = -f;
*x += dx;

if(fabs(dx)<= eps * fabs(*x))


return 0;

std::cout<<"\n\nF("<<*x<<")="<<f<< " la iteratia "<<it;

std::cout<<"Iter: nr.maxim de iteratii depasit\n";


return 1;

divergent:
std::cout<<"Iter: proces divergent\n";
return 2;

int main(){
double x;
std::cout<<"Introduceti valoare pentru x de pe interval"<<endl;
std::cout<<"x0 = ";
cin>>x;

Iter(func, &x);

return 0;
}
Rezultatele pentru functia 𝝋 = 1 + 𝑐⁡(𝑥 lg 𝑥 − 1.2)⁡𝑢𝑛𝑑𝑒⁡𝑐 = ⁡ −0.159 :

Rezultatele pentru functia 𝝋 = 1 + 𝑐⁡(𝑥 3 − 0.1𝑥 2 + 0.4𝑥 − 1.5)⁡𝑢𝑛𝑑𝑒⁡𝑐 =⁡ -0.004:


2.2 Metoda tangentelor
Listingul:
#include <iostream>
#include<math.h>
#define eps 0.000001
#define iter 100

using namespace std;

double func(double x){


return //functia;
}

double func_d(double x){

return //functia derivata;


}

double itang(double a,double b,double(*f)(double),double(*f1)(double)){


int i = 0;
double x,y1,y;

x=a;
y=func(x);
y1=func_d(x);

while ( (i<=iter) && ((y<-eps) || (y>eps)) ){

x=x-y/y1;
y=f(x);
y1=f1(x);

cout<<"\n\nf("<<x<<")="<<y<<" la iteratia "<<(int)i;


i++;
}

if (i>iter){
cout<<"problema nu se poate rezolva in nr.maxim de iteratii";
return 0;
} else return x;

int main(){
double x, y1, y, a, b;
std::cout<<"a="; cin>>a;
std::cout<<"b="; cin>>b;

x=itang(a,b,func,func_d);

if (x!=0) std::cout<<"\nSolutia = "<<x;


}
Rezultatele pentru funcția 𝑥 lg 𝑥 − 1.2 = 0 :

Rezultatele pentru functia 𝑥 3 − 0.1𝑥 2 + 0.4𝑥 − 1.5 = 0 :


2.3 Metoda secantelor
Listingul:
#include <iostream>
#include<math.h>
#define eps 0.000001
#define iter 100

using namespace std;

double func(double x)
{
return //functia;
}

int main(){
int i = 0;
double x,x0,x1,a,b,y;
std::cout<<"a="; cin>>a;
std::cout<<"b="; cin>>b;

x0=a; x1=b; x=x0; y=func(x);

if (func(x0)*func(x1)<0){

while ( (i<=iter) && ((y<-eps) || (y>eps)) ){


x=x0-func(x0)*(x1-x0)/(func(x1)-func(x0));
y=func(x);

if (func(x0)*y<0){
x1=x;
} else {
x0=x;
}
std::cout<<"\n\nf("<<x<<")="<<func(x)<<" la iteratia "<<(int)i;
i++;
}

if (i>iter){
cout<<"problema nu se poate rezolva in nr.maxim de iteratii";
}
} else{
cout<<"interval invalid";
}
}
Rezultatele pentru funcția 𝑥 lg 𝑥 − 1.2 = 0 :

Rezultatele pentru functia 𝑥 3 − 0.1𝑥 2 + 0.4𝑥 − 1.5 = 0 :


Concluzie:

În urma acestei lucrări am aprofundat cunoștințele în studiul rezolvării numerice a ecuațiilor


neliniare. Pentru soluționarea sarcinilor propuse am utilizat diferite metode de calcul precum
cea a tangentei, secantei, înjumătățirii și cea a aproximațiilor succesive. În urma efectuării
lucrării de laborator a fost determinat că cea mai optimală metodă a determinării soluțiilor
unei ecuații neliniare este cea a tangentelor(Newton), deoarece are o precizie bună într-un
interval de interații mai mic.Din termenii noi cunoscuți fac parte funcția Fi. De asemenea am
aplicat aceste cunoștințe în domeniul informatic prin crearea unui program în limbajul C++.

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