Esercizio con Matlab

hastings1
E' data la seguente equazione
$f(x)= x(1 − x)^2 +2(4 − x)(0.5 − x) log(4 − x) = 0$

dopo aver stabilito quante sono le radici (3, visto che è di terzo grado) e dopo averli separati in intervalli di ampiezza non superiore ad 1, si chiede il seguente:

scelto un $ x_0 in [-0.5, 0.5] $, si verifichi che il metodo iterativo ad un passo
$x_k=g(x_(k-1))$, $k>=1$ con $g(x)= (2*( x-4)*(0.5- x)*log(4- x )) / (1 -x)^2=0$ converge a uno zero di f(x).

function x= metodoiter1 (max_iter, x0)
x(1)=x0;
for k=2:max_iter
    x(k)=( 2*( x(k-1) -4)*(0.5- x(k-1))*log(4- x(k-1)) ) / (1 -x(k-1))^2; 
end    
 


Dunque dovrebbe venir fuori qualcosa come -6,12... invece viene 0.32...
Inotre dice che la "x" nella prima riga, non è corretta, me lo sottolinea in arancione.
Perchè? Come lo fareste?
PS: A proposito, deve essere una function, ad esempio: function x= metodoiter1 (max_iter, x0)
dove max_iter è il numero massimo di iterazioni e x0 è il valore iniziale

Risposte
cozzataddeo
L'equazione in questione non è puramente algebrica perché c'è anche il termine $log(4-x)$ e quindi non è detto che abbia 3 soluzioni.

hastings1
ok, hai ragione, cmq l'ho disegnato con fplot ed effettivamente ha 3 radici. Però, a priori come si fa a dirlo?
Per quanto riguarda il codice, l'ho risolto

>>v(1)=0.3; %x0 deve appartenere all'intervallo [-0.5, 0.5]
>> for i=2:10
v(i)=(2*(v(i-1) -4)*(0.5 -v(i-1))*log(4- v(i-1)) )/(1 -v(i-1))^2;
end
>> v(i)


così viene -6.1172 che è una delle radici.

cozzataddeo
Credo che il numero di soluzioni per un'equazione di questo tipo si possa capire solo studiandone il grafico. Oltretutto anche se fosse stata puramente algebrica una soluzione è certamente reale ma le altre due avrebbero potuto essere complesse coniugate. :)
Mi sembra che non ci siano differenze tra il codice che avevi scritto prima e quest'ultimo che hai riportato. Com'è che prima non ti veniva un risultato corretto? :?

hastings1
bah!... Sono alle prime armi con Matlab.
Adesso, come faccio a costruire un m-file tipo funzione con questo codice?
Voglio fare una funzione che riceva come parametri d'ingresso il numero massimo di itaraz e il valore iniziale (visto che si tratta di un metodo iterativo ad un passo). In uscita deve dare l'approssimazione.

come lo scrivo?
function a= approssimazione(N_iter, x0)  %ci vuole il ";" ?
v(1)=x0; %x0 deve appartenere all'intervallo [-0.5, 0.5]
for i=2:10
     v(i)=(2*(v(i-1) -4)*(0.5 -v(i-1))*log(4- v(i-1)) )/(1 -v(i-1))^2;
end
disp('approssimazione: ')
v(i)



Ma in fondo, questo metodo iterativo g(x) non è come un limite?

cozzataddeo
Mi sembra che il codice che hai scritto sia corretto (nella prima riga non serve il ";") l'unico problema è che se vuoi che il risultato sia restituito in uscita (e non semplicemente visualizzato) devi caricarlo in una variabile che ha il nome di quella indicata nella prima riga. Nel tuo caso devi salvare il valore nella variabile "a".

function a= approssimazione(N_iter, x0)  %ci vuole il ";" ? 
v(1)=x0; %x0 deve appartenere all'intervallo [-0.5, 0.5] 
for i=2:N_iter
     v(i)=(2*(v(i-1) -4)*(0.5 -v(i-1))*log(4- v(i-1)) )/(1 -v(i-1))^2; 
end
a=v(i);
disp('approssimazione: ') 
v(i)


In questo modo quando chiami la funzione
sol = approssimazione(0.3,10);

otterai, oltre alla visualizzazione su monitor fatta mediante le chiamate a "disp" e "v(i)", che la soluzione sarà salvata nella variabile "sol" e potrà essere utilizzata per succesive elaborazioni.

Un consiglio: a parte l'utilizzo per scopi di debug, la visualizzazione dei valori calcolati è stilisticamente meglio delegarla agli m-file che chiamano le funzioni e non inserirla nelle funzioni che svolgono i calcoli stessi.

Per quel che riguarda l'analogia tra metodi iterativi e calcolo dei limiti quello che posso dirti è che anche a me sembra che i due concetti in pratica in qualche modo si assomiglino anche se la teoria che sta alla base mi sembra molto diversa, però sono anch'io un principiante nell'ambito del calcolo numerico e poco piú che un praticante in quello dell'analisi, per cui prendi con beneficio di inventario questa mia affermazione. :wink:

:)

hastings1
ok. l'esercizio ora mi chiede di trovare il raggio di inclusione delle radici della funzione
$f(x)=x(1-x)^2+2(4-x)(0.5-x)log(4-x)$

Dalla teoria so che il raggio è dato da uno dei tre seguenti metodi
1) $rho_a=max(|a_n/a_0|, 1+|a_(n-1)/a_0|,... 1+|a_1/a_0| )$
2) $rho_a=max(1 , sum_(j=1)^n |a_j/a_0|)$
3) $rho_a=2max(|a_j/a_0|^(1/j))$ , $1<=j<=n$
con $a_0=$coeff del termine di grado massimo
e $a_n=$ coeff del termine noto

Ad esempio con $p(x)=x^3-9.5x^2+5x+2.3$
$a_0=1$ e $a_n=2.3$
si ha ad esempio $rho_a=max(2.3, 10.5)=10.5$

Il problema è come fare con l'equazione assegnata? non è un polinomio e comunque i suoi coefficienti sono "strabbbbbici".

cozzataddeo
Come hai correttamente osservato, l'equazione non è algebrica e quindi dovresti vedere cosa prevede la teoria in questi casi, personalmente il grado di inclusione delle radici non l'ho mai sentito nominare... :oops:

hastings1
in realtà tutto nasce da un teorema
Ogni zero del polinomio f appartiene al cerchio
$C={z in \ CC : |z| <= rho }$
dove il raggio $rho$ può essere calcolato tramite una delle seguenti formule

1) $rho_a=max(|a_n/a_0|, 1+|a_(n-1)/a_0|,... ,1+|a_1/a_0| )$
2) $rho_a=max(1 , sum_(j=1)^n |a_j/a_0|)$
3) $rho_a=2max(|a_j/a_0|^(1/j))$ , $1<=j<=n$

hastings1
in realtà tutto nasce da un teorema
Ogni zero del polinomio f appartiene al cerchio
$C={z in \ CC : |z| <= rho }$
dove il raggio $rho$ può essere calcolato tramite una delle seguenti formule

1) $rho_a=max(|a_n/a_0|, 1+|a_(n-1)/a_0|,... ,1+|a_1/a_0| )$
2) $rho_a=max(1 , sum_(j=1)^n |a_j/a_0|)$
3) $rho_a=2max(|a_j/a_0|^(1/j))$ , $1<=j<=n$

david_e1
"settembre":
in realtà tutto nasce da un teorema
Ogni zero del polinomio f appartiene al cerchio

Occhio che la $f$ non è un polinomio! Non so se sia un "errore di stampa" il tuo: esistono teoremi simili per le funzioni olomorfe (a parte che in un numero finito di punti) di variabile complessa, non so se questo sia il caso (o se è veramente richiesto il polinomio). In generale il teorema degli zeri di Bolzano risulta il più semplice da applicare in questi casi...

"Cozza Taddeo":
Per quel che riguarda l'analogia tra metodi iterativi e calcolo dei limiti quello che posso dirti è che anche a me sembra che i due concetti in pratica in qualche modo si assomiglino anche se la teoria che sta alla base mi sembra molto diversa, però sono anch'io un principiante nell'ambito del calcolo numerico e poco piú che un praticante in quello dell'analisi, per cui prendi con beneficio di inventario questa mia affermazione.

E' vera in questo senso: un metodo iterativo può essere pensato come il limite, per $k$ che va a $+oo$ di una successione $x_k$:

$ x_{k+1}=\Phi(x_k) $

dove $x_0$ è il valore di inizializzazione del metodo e $\Phi$ "restituisce" il punto successivo dell'approssimazione a partire da quello noto al passo corrente.

Non è solo una perversione matematica: questo modo di vedere le cose serve anche a dimostrare le buone proprietà del metodo (quando esse ci sono) di stabilità e convergenza. In oltre si adatta perfettamente allo studio di problemi ben più complessi del calcolo dello zero di una funzione di una variabile.

cozzataddeo
@david_e
Grazie per l'azione di supporto! :)

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