Localizzare l'intervallo dello zero di massimo modulo

morgano2011
Salve a tutti, chiedo il vostro aiuto ...devo svolgere un esercizio in matlab che riguarda un polinomio, in particolare il punto che mi ha fermato è la localizzazione dell'intervallo dello zero di massimo modulo necessario per il proseguimento dell'esercizio in quanto questo intervallo va poi inserito nei parametri di ingresso della function bisezio_gen....riposto in seguito la function bisezio_gen, e l'esercizio svolto.....

mi interessa sapere in che modo sono calcolati i parametri di ingresso a e b della seguente function : (nell'esercizio i valori di a e b calcolati sono: -5-5,-4)

function[x, iter, test, itmax, numvalfunzioni] = bisezio_new(c,a,b,toll)
%metodo di bisezione
%[x,iter, test]=bisez(c,a,b,toll)
%Obiettivo:calcola una radice del polinomio di grado n i cui coefficienti
%sono dati nel vettore c
%a,b estremi intervallo in cui cade la radice
%La radice viene calcolata con precisione toll
%Output: x = vettore contenente l'approssimazione della radice
%iter= numero di iterazioni effettivo
%test=0, f(a)f(b)>0, test=1:f(a)*f(b)<0
%itmax:valore massimo iterazioni
%scarsa efficienza e rikiede ipotesi partikolarmente restrittive, ma ha il
%pregio di essere stabile in ogni occasione e garantire sempre la buona
%riuscita dell'operazione.
disp('test=0:f(a)*f(b)>0')
disp('test=1:f(a)*f(b)<0')
test=1;
fa=polyval(c,a);
fb=polyval(c,b);
numvalfunzioni=2;
itmax=[];
if fa*fb > 0
x=[];
iter=[];
test=0;
return
end
disp(test);
%calcolo itmax
itmax=ceil(log((b-a)/toll)/log(2));
iter=1;
x(iter)=(a+b)/2;
fk=polyval(c,x(iter));
numvalfunzioni=numvalfunzioni+1;
while iter < itmax & abs(fk) > toll
if fa*fk <=0 %una radice in [a,x(iter)]
b=x(iter);
else % radice in [x(iter),b]
a=x(iter);
fa=fk;
end
iter=iter+1;
x(iter)=(a+b)/2;
fk=polyval(c,x(iter));
numvalfunzioni=numvalfunzioni+1;
end
x=x';

esercizio :

Dato il polinomio

x5+ 4.478604285714286 x4 -4.251418750000002 x3 +14.222904350x2+ 14.56983467678571x+7

Applicare quindi uno dei metodi a voi noti per calcolare lo zero reale di massimo modulo con 12 cifre decimali significative. A tale scopo stabilire quale dei criteri di arresto usati all’interno delle functions bisezio e/o newton sono stati soddisfatti. In base all’osservazione della successione che approssima lo zero stabilire se si tratta di uno zero semplice o multiplo.

Localizzo lo zero di massimo modulo nell’intervallo (-5.5, -4) ed applico il metodo di bisezione per determinare un’approssimazione con 2-3 cifre decimali e passare questo dato come punto di innesto alla function che implementa il metodo di Newton.
[x, test,itmax,numvalfunzioni,err] = bisezio_new(q,-5.5,-4,0.5e-3)
test=0: f(a)*f(b)>0
test=1: f(a)*f(b)<0
x =

-4.750000000000000e+000
-4.375000000000000e+000
-4.562500000000000e+000
-4.656250000000000e+000
-4.609375000000000e+000
-4.585937500000000e+000
-4.597656250000000e+000
-4.591796875000000e+000
-4.594726562500000e+000
-4.596191406250000e+000
-4.595458984375000e+000
-4.595825195312500e+000


test =1
itmax =12
numvalfunzioni =14
[x,iter,numvalfunz]=newton (q,10,x(itmax),.5e-11,1)
errore test |f(xk)| 7.016609515630989e-014

errore test |x(k)-x(k-1)|/|x(k)| 0
x = -4.595825195312500e+000
-4.595891878597464e+000
-4.595891874257757e+000
-4.595891874257757e+000

iter = 4
numvalfunz =6

I criteri di arresto sono soddisfatti entrambi . Inoltre la convergenza appare quadratica, essendovi nel risultato ottenuto in ogni nuova iterata il raddoppio delle cifre significative ottenute nella iterata precedente.

Risposte
morgano2011
ho corretto l'intervallo...sono (-5.5,-4), con questi estremi funziona...praticamente riesco a fare tutto l'esercizio che è anche molto semplice, ma l'intervallo dello zero di massimo modulo non so da dove esca,non so proprio da dove esca. Qualcuno potrebbe illuminarmi o darmi qualche dritta, ho pensato anche che si calcolasse tramite sturm ma non penso sia la direzione giusta

factotumleo
Allora, da quanto ho capito ti serve trovate l'intervallo contenente lo zero di massimo modulo giusto? Lo studio che prevede la ricerca degli intervalli in cui cadono gli zeri di una funzione (nel tuo caso un polinomio) si chiama "localizzazione degli zeri". I passaggi sono molto semplici. Per prima cosa devi individuare l'intervallo in cui cadono tutti gli zeri reali. Esiste una formula molto semplice, la "regola" di Cauchy, che ti permette di fare questo:

$ x_i < 1 + (max(|a_0|,|a_1|,...,|a_(n-1)|))/|a_n| $

Ovviamente i coefficienti $ a_0,a_1,...a_n $ sono i coefficienti del polinomio. in questo modo puoi trovarti l'intervallo degli zeri reali (tutti). In matlab sarebbe una cosa del tipo:

>> xi = 1 + (max(abs(c)))/c(1)
xi =

15.5698

Questo vuol dire che tutti gli zeri reali cadono nell'intervallo [-15.5698, 15.5698] (ovviamente si tratta di un intervallo approssimato). Per individuare singolarmente gli intervalli in cui cadono i singoli zeri, bisogna eseguire quella che prende il nome di "tabulazione" (è il metodo più semplice, un altro consiste nel graficare la funzione e andare ad individuare graficamente gli intervalli in cui cadono gli zeri). In matlab:

>> x = linspace(-15.5698, 15.5698);
>> y = polyval(c,x);
>> format long e
>>[x',y']

...
-5.819016161616162e+00 -2.953603561880727e+02
-5.504474747474747e+00 1.250072621601665e+02

...

Ho evidenziato soltanto le due righe che ci interessano. Sulla destra vai a vedere dove la funzione cambia di segno (ossia dove i valori passano da - a + e viceversa). I corrispondenti valori sulla sinistra corrispondono all'intervallo in cui cade uno zero. In questo caso circa [-5.9,-5.4] diciamo. Se vuoi avere una visione più completa vai a vedere nel grafico:

>> x = linspace(-5.9,-5.4);
>> y = polyval(c,x);
>> plot(x,y)

e vedrai che il grafico taglia l'asse delle ascisse nell'intervallo che abbiamo trovato. Ovviamente puoi restringerlo, purchè comunque l'intervallo contenga lo zero! Dalla tabulazione abbiamo trovato un solo intervallo. Questo potrebbe voler dire che ci sono magari due coppie di radici complessee (essendo il polinomio di grado 5). L'enumerazione delle radici è uno studio che si fa preliminarmente a quello della localizzazione. Ovviamente lo zero di massimo modulo è quello che cade nell'intervallo più grande (sempre in modulo). Spero di essere stato sufficientemente chiaro

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.