Zero.m % CALCOLO DELLO ZERO DI UNA FUNZIONE help
zero; disp('Scegliere
tra i seguenti metodi di calcolo dello zero di una funzione: '); q=0; while
q==0 clear; q=0; err=0; while err==0 disp('1.
Metodo di
bisezione');
disp('2. Metodo di Newton-Rapson');
disp('3. Metodo delle secanti a due punti'); disp('4.
Metodo di Newton a doppio passo per il calcolo di tutti gli zeri reali di un
generico polinomio');
s=input('Introduci il numero corrispondente
: ');
if s~=1 & s~=2 & s~=3 & s~=4
disp('Scelta
errata');
disp('Ricomincia');
else
err=1;
end
end
if s~=4
disp('INTRODUCI:');
err=0; while err==0
F=input('-
Il nome della function contenente la funzione : ','s');
if
exist(F)==0
disp('La
funzione non esiste, introduci :');
else
err=1; end
end
e=input('-
L''errore massimo che si può commettere (massimo 0.1) : ');
err=0; while err==0
if e>0.1
| e<=0
disp(' Il valore dell''errore massimo
introdotto non é corretto');
e=input('Introducilo nuovamente : ');
else
err=1; end
end
end
if s==1 % METODO DI BISEZIONE
a=input('- L''estremo inferiore
dell''intervallo : ');
b=input('- L''estremo superiore
dell''intervallo tale che f(a)*f(b)<0 : ');
if a>=b
disp('L''estremo inferiore deve essere
strettamente minore di quello superiore');
disp('Ricomincia dall''inizio .');
disp('Scegli nuovamente il metodo di
calcolo : ');
else
w1=feval(F,a); w2=feval(F,b); if w1*w2>0 disp('Il
metodo non è applicabile .');
disp('Infatti agli estremi la funzione
assume lo stesso segno.');
disp('Scegli un altro metodo :');
else
if w1==0
disp('Lo
zero è : ');
c=a;
g=0; else
if w2==0
disp('Lo
zero è : ');
c=b;
g=0;
else
k=(log((b-a)/e))/log(2);
bk=b;
ak=a;
k=ceil(k);
i=1;
while i<=k
c=(ak+bk)/2;
g=feval(F,c);
if g==0
disp('Lo
zero é : ');
i=k;
else
w=feval(F,ak);
if g*w>0
ak=c;
else bk=c;
end
end
i=i+1;
end
end
while g>e
c=(ak+bk)/2;
g=feval(F,c);
if g==0
disp('Lo
zero é : ');
c
else
w=feval(F,ak);
if g*w>0
ak=c;
else bk=c;
end
end
end end
if
g~=0
disp('Lo zero é approssivamente: ');
end
disp(c); q=1; end
end
end
if s==2
% METODO DI NEWTON-RAPSON
err=0;
while err==0
G=input('- Il nome della function
contenente la derivata prima della funzione : ','s');
if
exist(G)==0
disp('La
funzione non esiste, introduci :');
else err=1; end
end
x0=input('-
L''approssimazione iniziale dello zero da calcolare : ');
i=1; g=feval(F,x0); if g==0
disp('Lo
zero é : ');
x1=x0;
i=2;
w=1; else w=feval(G,x0);
if w==0
disp('Metodo non applicabile');
disp('Infatti si annulla la derivata prima
della funzione in esame.');
disp('Scegli un altro metodo o cambia
l''approssimazione iniziale :');
i=2; else
x1=x0-(g/w); end end
while i==1
& (abs(x1-x0)>=e | abs(g)>=e) x0=x1; g=feval(F,x0); if
g==0
disp('Lo
zero é : ');
i=2; else
w=feval(G,x0);
if w==0
disp('Metodo non applicabile');
disp('Infatti si annulla la derivata prima della funzione in esame.');
disp('Scegli un altro metodo o cambia l''approssimazione iniziale :');
i=2;
else
x1=x0-(g/w);
end
end end
if w~=0
if g~=0
disp('Lo zero é approssivamente: ');
end
q=1; x0 end
end if s==3
% METODO DELLE SECANTI A DUE PUNTI
dom=0; while dom==0
x0=input('-
La prima approssimazione iniziale dello zero da calcolare : ');
x1=input('- La seconda approssimazione
iniziale dello zero da calcolare : ');
if x0==x1
disp('I due punti devono essere
differenti.Ricomincia');
disp('Introduci nuovamente : ');
else
b=feval(F,x0);
c=feval(F,x1);
if b==0
disp('Lo zero é :');
b
q=1;
else
i=1;
while i==1
& (abs(x1-x0)>e | abs(c)>e)
if c==b
disp('Metodo non applicabile');
disp('Scegline un altro oppure cambia i
dati iniziali:');
i=2;
else
q=1;
if c==0
disp('Lo
zero é :');
i=2;
x2=c;
else
x2=x1-c*((x1-x0)/(c-b));
b=c;
x0=x1;
x1=x2;
c=feval(F,x1);
end
end
end
if q==1
if c~=0
disp('Lo zero é approssivamente: ');
end
disp(x2);
end
end
dom=1; end
end
end if s==4 % METODO DI NEWTON A DOPPIO PASSO
disp('Scegli tra :');
err=0; while err==0
disp('1. -
Introdurre a priori il numero di zeri reali del polinomio interessato');
disp('2. - Applicare altri metodi ');
pr=input('Introduci il numero
corrispondente : ');
if
pr~=1
& pr~=2
disp('Scelta
errata');
disp('Ricomincia');
else
err=1;
end
end
if pr==1
disp('Introduci
:');
disp('-
il vettore dei coefficienti del polinomio a partire dal termine');
vett=input('
noto fino ad arrivare a quello di grado massimo : ');
err=0;
err1=0;
while err==0
[o,h]=size(vett); if
o~=1 & h~=1
vett=input('
Non é stato introdotto un vettore.Inseriscilo : ');
err1=1;
else
if o==1
& h==1
vett=input('
Il vettore deve avere almeno 2 elementi.Inseriscili : ');
err1=1;
else
[o,h]=size(vett);
if o==1
vett=vett';
o=h;
end
j=o;
while j>0
if vett(j)==0
% controllo dell'effettivo
vett=vett(1:j-1);
% grado del polinomio
else
j=0;
end
j=j-1;
end
[o,h]=size(vett);
if o==0
vett=input('
E''stato introdotto un vettore nullo.Inseriscilo nuovamente : ');
err1=1;
else
err=1;
end
end
end
end if
err1==1 disp('Introduci
:');
end
disp('- il numero di zeri reali del
polinomio (nel caso di polinomi di secondo grado');
num=input('
verranno calcolati tutti gli zeri compreso quelli complessi) : ');
err=0;
err1=0;
while err==0
if num<0 | round(num)~=num
num=input('
Valore errato.Inserisci quello giusto : ');
err1=1;
else
if num>o-1
disp('
il numero di zeri non può superare il grado del polinomio');
num=input('
Inserisci quello giusto : ');
err1=1;
else
err=1;
end
end
end if
err1==1
disp('Introduci
:');
end
g=input('- l''errore massimo di
approssimazione (al massimo 0.1): ');
err=0; while
err==0
if g>0.1 | g<=0
g=input('
Valore errato.Inserisci quello giusto : ');
else
err=1;
end
end
if o==1
disp('Il polinomio introdotto ha grado
zero');
else if
num==0
disp('Il
polinomio non ha zeri reali');
else
[b,risp,dom]=zerpol(vett,num,g);
if risp==0
disp('Gli zeri del polinomio sono : ');
disp(b);
if dom==1
disp('OSS.:in
questo caso é stato possibile calcolare anche gli zeri complessi');
end
else
disp('Metodo
non applicabile in questo caso');
end
end
end q=1; end
end if q==1
fine=input('Se
vuoi ricominciare nuovamente premi il tasto ''1'' :');
if
fine==1 q=0;
disp('Scegli
di nuovo tra :');
end
end end
|