Esercizio con Matlab
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).
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
$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
L'equazione in questione non è puramente algebrica perché c'è anche il termine $log(4-x)$ e quindi non è detto che abbia 3 soluzioni.
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
così viene -6.1172 che è una delle radici.
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.
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?

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?

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?
Ma in fondo, questo metodo iterativo g(x) non è come un limite?
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?
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".
In questo modo quando chiami la funzione
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.
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.


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".
$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".
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...

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$
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$
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$
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$
"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.
@david_e
Grazie per l'azione di supporto!
Grazie per l'azione di supporto!
