Extras din curs
1. Metoda înjumătăţirii intervalului
Cea mai simplă metodă de rezolvare a ecuaţiilor neliniare este metoda înjumătăţirii intervalului. Această metodă se aplică dacă pe intervalul dat există în mod sigur o singură rădăcină. Dacă [a,b] este intervalul pe care se studiază problema, atunci condiţia de mai sus se poate scrie: f(a) • f(b) < 0. Se calculează punctul c de la mijlocul intervalului şi se determină în care din cele două jumătăţi se află rădăcina. Astfel, dacă f(a) • f(c) < 0, rădăcina se află în intervalul [a,c], iar în caz contrar în intervalul [b,c]. Se aplică acelaşi procedeu pentru noul interval de mai multe ori până când se obţine un interval în jurul rădăcinii mai mic decât o eroare admisă .
Algoritmul descris mai sus se poate scrie astfel:
1. Se declară funcţia f(x).
2. Se declară marginile intervalului a şi b şi eroarea .
3. Dacă f(a) • f(b) > 0 atunci intervalul este ales greşit. STOP.
4. Se calculează c = ( a + b ) / 2.
5. Dacă f(c) = 0 atunci rădăcina exactă este c. Se scrie c. STOP.
6. Dacă f(a) • f(c) > 0 atunci a = c altfel b = c.
7. Dacă ( b - a ) < atunci se scrie rădăcina aproximativă c = ( a + b ) / 2 şi se opresc calculele, altfel se reia întreg procesul de la pasul 4.
package ecuatiineliniare;
public class Bisectie {
/// se declara functia
public static double f(double x){
return Math.log(x) + x;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/// se declara variabilele a, b, c, eps
double a = 0.001, b=2, c, eps = 1e-6;
/// daca f(a)*f(b) < 0 atunci se poate aplica metoda pe acest interval, altfel trebuie ales alt interval
if(f(a)*f(b) < 0){
do{
/// se calculeaza c=(a+b)/2
c = (a + b)/2;
/// daca f(a)*f(c) < 0 atunci b=c, altfel a=c
if(f(a)*f(c)<0){
b=c;
} else {
a=c;
}
}
while(Math.abs(f(c))>eps);
/// daca |f(c)| < eps atunci se scrie radacina
System.out.println("Metoda injumatatirii intervalului");
System.out.println("Radacina = "+Double.toString(c));
} else {
System.out.println("Interval ales gresit!!!");
}
}
}
2. Metoda coardei variabile
In cadrul acestei metode algoritmul de rezolvare este oarecum similar, deosebirea fiind aceea că se foloseşte o altă formulă pentru împărţirea intervalelor. Ea se obţine din intersecţia coardei care uneşte punctele de la capetele curbei cu axa Ox.
Punctul c se află la intersecţia coardei care uneşte punctele (a, f(a)) şi (b, f(b)) cu axa Ox. Acest punct se determină rezolvând sistemul:
soluţia fiind bineînţeles x = c. După determinarea punctului c se determină în care subinterval se află soluţia şi se face substituţia a = c, sau b = c, şi se repetă acest algoritm până când se obţine |f(c)|<.
Algoritmul este identic cu cel prezentat mai sus, singurele deosebiri fiind la punctul 4 unde se schimbă formula de calcul pentru c şi la testul final.
package ecuatiineliniare;
public class secanta {
/**
* @param args
*/
public static double f(double x){
return Math.log(x)+x;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/// se declara variabilele a, b, c, eps
double a = 0.001, b=2, c, eps = 1e-6;
if(f(a)*f(b) < 0){
do{
/// se calculeaza c=(a+b)/2
c = a-f(a)*(b-a)/f(b)-f(a);
/// daca f(a)*f(c) < 0 atunci b=c, altfel a=c
if(f(a)*f(c)<0){
b=c;
} else {
a=c;
}
}
while(Math.abs(f(c))>eps);
/// daca |f(c)| < eps atunci se scrie radacina
System.out.println("Metoda injumatatirii intervalului");
System.out.println("Radacina = "+Double.toString(c));
} else {
System.out.println("Interval ales gresit!!!");
}
}
Preview document
Conținut arhivă zip
- Metode Numerice.doc