m0linas
09-05-2011, 12:47
Ciao, devo fare un sottoprogramma matlab che approssimi il valore dello zero di una funzione f con il metodo di bisezione, sottointeso che la f in ingresso rispetti le ipotesi del teorema in un certo intervallo in ingresso [a,b].
Il metodo è molto semplice e devo solo fare dei controlli che f(a)*f(x)<0 o f(b)*f(x)<0.....
Il problema è che il mio prof mi ha contestato il progetto dicendo che in aritmetica finita, il controllo <0 non ha senso ed è meglio usare invece una certa quantità (tolleranza).
Questo è il codice:
function [out,flag] = bisezione(f,a,b,bmax,btoll)
flag = 0;
n=0;
fa = f(a);
fb = f(b);
x = (a+b)/2; fx = f(x);
I=(b-a)/2;
while n <= bmax && flag == 0 && I >= btoll
n=n+1;
if fa*fx < -eps
b = x; fb = fx;
x = a +(b-a)/2;
fx = f(x);
I=(b-a)/2;
elseif fx*fb < -eps
a = x; fa = fx;
x = a +(b-a)/2;
fx = f(x);
I=(b-a)/2;
else
flag = 1;
end
end
out=x;
return
Per ora ho cambiato il controllo e invece di essere < 0 è < -eps, che è il valore della precisione di macchina, ma non sono sicuro che vada bene, e il prof è molto criptico a riguardo, in pratica non mi ha detto ne che va bene ne che va male............qualcuno saprebbe illuminarmi??
Grazie :muro:
Il metodo è molto semplice e devo solo fare dei controlli che f(a)*f(x)<0 o f(b)*f(x)<0.....
Il problema è che il mio prof mi ha contestato il progetto dicendo che in aritmetica finita, il controllo <0 non ha senso ed è meglio usare invece una certa quantità (tolleranza).
Questo è il codice:
function [out,flag] = bisezione(f,a,b,bmax,btoll)
flag = 0;
n=0;
fa = f(a);
fb = f(b);
x = (a+b)/2; fx = f(x);
I=(b-a)/2;
while n <= bmax && flag == 0 && I >= btoll
n=n+1;
if fa*fx < -eps
b = x; fb = fx;
x = a +(b-a)/2;
fx = f(x);
I=(b-a)/2;
elseif fx*fb < -eps
a = x; fa = fx;
x = a +(b-a)/2;
fx = f(x);
I=(b-a)/2;
else
flag = 1;
end
end
out=x;
return
Per ora ho cambiato il controllo e invece di essere < 0 è < -eps, che è il valore della precisione di macchina, ma non sono sicuro che vada bene, e il prof è molto criptico a riguardo, in pratica non mi ha detto ne che va bene ne che va male............qualcuno saprebbe illuminarmi??
Grazie :muro: