Data la funzione:
f(x)=e2x−2−cos(x),x∈[0,1]
Spiegare perché è possibile stabilire che nell'intervallo considerato f ammette un'unica radice.
Per verificare che f ammette zero unico si può anche impiegare il grafico della funzione.
f = @(x) exp(2*x-2) - cos(x);
t = linspace(0, 1);
plot(t, f(t), t, 0)
Detta σ l'unica radice di f in [0,1], stabilire se entrambe le seguenti funzioni di iterazione:
g1(x)=loge(cos(x))+22,g2(x)=arccos(e2x−2)possono generare un procedimento iterativo convergente a σ e, in caso affermativo, calcolarne l'ordine di convergenza.
loge(cos(x)) è ben definito in [0,1], si ha che cos(x)>0,∀x∈[0,1], perciò la scrittura di g1(x) è valida.
Il punto fisso di g1(x) è zero di f(x), in altri termini vale σ=g1(σ)
Ciò permette di affermare che g1(x) è un buon candidato per un metodo di punto fisso. Per verificare che g1(x) sia effettivamente in grado di generare un procedimento iterativo convergente a σ si deve calcolare la derivata prima.
g′1(x)=12⋅sin(x)cos(x)=tan(x)2
Dato che vale |g′1(x)|<1 (la tangente vale 1 per un valore pari a circa π2), in [0,1], allora si ha convergenza.
Per determinare se la convergenza è superlineare si verifica se un valore per cui g′1 si annulla in [0,1] è anche un possibile zero di f. Ciò non accade, dato che g′1 si annulla solo in 0 e per questo valore f(0)<0. Si può concludere che un metodo iterativo di punto fisso che sfrutta g′1 converge con convergenza lineare.
Si verifica se vale: σ=arccos(e2σ−2)=g2(σ)
Si ha cos(σ)=e2σ−2⟹f(σ)=e2σ−2−cos(σ)=0, perciò anche la funzione g2 è un buon candidato per un metodo di punto fisso con f.
In modo analogo a quanto visto per g1 si calcola la derivata di g2 e si verifica se vale la condizione |g′2(x)|<1 in [0,1].
g′2(x)=−2e2x−2√1−e4x−4
Per x→1 si ha g′2(x)→∞ perciò la funzione non converge.
Utilizzando le funzioni del punto b che possono generare un procedimento iterativoconvergente si implementi il metood id punto fisso per il calcolo dello zero σ di f. Rappresentare su un grafico il valore dell'approssimazione xk ottenuta al variare di k≥0.
g_1 = @(x) (log(cos(x)) + 2) / 2;
x = [1/2; g_1(1/2)];
count = 2;
while abs(x(count) - x(count - 1)) > 10^-12 % da 10^-6 è accettabile
count = count + 1;
x(count) = g_1(x(count-1));
end
figure
plot((0:1:count-1), x, "b-o")
box off
A partire dal sistema lineare:
pkg load symbolic
addpath("./functions")
% conversione del sistema in forma matriciale
% workaround: https://github.com/cbm755/octsympy/issues/8#issuecomment-40945844
syms k
A = [-3/2 4 -k; [1 -3/2 0]; 0 -k 1];
% se la matrice è invertibile il sistema ammette un'unica soluzione
% se il determinante è non nullo allora la matrice è invertibile
det(A)
solve(det(A))
warning("off", "OctSymPy:sym:rationalapprox")
ans = (sym) 2 7 k - ─ 4 ans = (sym 2×1 matrix) ⎡-√7 ⎤ ⎢────⎥ ⎢ 2 ⎥ ⎢ ⎥ ⎢ √7 ⎥ ⎢ ── ⎥ ⎣ 2 ⎦
Per k=√72 si può determinare se sono presenti soluzioni tramite il teorema di Rouche-Capelli.
Si determinano quindi il rango di A e di (A|b). Dato che det(A)=−√72<0 e rank(A|b)=rank(A) il sistema non ha soluzioni per k=√72.
rank(subs(A, k, sqrt(7)/2))
ans = 3
rank([subs(A, k, sqrt(7)/2), [1; 0; 0]])
ans = 3
A = double(subs(A, k, 2));
b = [1 0 0]';
[L, U, P, err] = gauss_partial(A);
[x, err] = lusolve(L, U, P, [], b);
x
error: 'A' undefined near line 1 column 17 error: 'A' undefined near line 1 column 32 error: 'L' undefined near line 1 column 20 error: 'x' undefined near line 1 column 1
Si permutano le equazioni del sistema lineare in modo che la matrice dei coefficienti associata al nuovo sistema lineare sia simmetrica e definita positiva ∀k∈(0,k∗).
Per prima cosa si nota che l'unico elemento non ripetuto è 4, perciò deve stare su una diagonale perché A possa essere simmetrica. Si effettua quindi uno scambio di righe nella matrice A.
A = [[1 3/2 0]; -3/2 4 -k; 0 -k 1];
b = [0 1 0]';
Perché A sia definita positiva per ogni valore di k si può ricorrere a due approcci:
calcolo degli autovalori di A, con parametro k, e verifica della loro positività. Questo approccio richiede il calcolo del polinomio caratteristico della matrice A;
applicazione del criterio di Sylvester, per cui affinché A simmetrica sia definita positiva è necessario che tutti il determinante di tutti i minori principali di A siano strettamente positivi.
Sapendo che il polinomio caratteristico è pari a det(A−xI), si ha:
pcar=det(A)=(1−x)2(4−x)−94(1−x)−(1−x)k2=(1−x)(x2−5x+74−k2)Ci sono tre autovalori. 1 è sempre positivo. Per gli altri due si impiegano la regole per cui il termine noto di un polinomio di secondo grado è pari al prodotto delle radici mentre il coefficiente di x è pari al negativo della somma delle radici pe revitare di risolvere il polinomio.
Devono perciò valere le seguenti condizioni:
Si calcolano i determinanti dei tre minori principali e si verifica che siano tutti positivi:
Tutte e tre le condizioni sono valide per k∈[−√72,√72].
Dato che k∗ deve essere positivo si ha che la matrice dei coefficienti associata al nuovo sistema lineare è simmetrica e definita positiva se k∗<√72.
%syms x
%A = [1-x, -3/2, 0; -3/2, 4-x, -k; 0,-k,1-x]
%solve(det(A))
b = [0 1 0]';
syms k
k = linspace(0, sqrt(7)/2, 22); % 20 punti e gli estremi
k = k(2:end-1);
norma_inf = zeros(20, 1);
norma_2 = zeros(20, 1);
for j = 1:20
A = [[1 -3/2 0]; -3/2 4 -k(j); 0 -k(j) 1];
[R, p] = chol(A);
if p > 0
warning("La matrice A non risulta definita positiva");
end
y = lsolve(R', b);
x = usolve(R, y);
norma_2(j) = norm(x, 2);
norma_inf(j) = norm(x, inf);
end
figure
plot( k, norma_inf, "-*", ...
k, norma_2, "-*", ...
sqrt(7)/2, 0:0.3:14);
legend("norma inf","norma 2","Location","eastoutside");
xlabel("k");
box off
A partire dal valore delle ascisse √72 si nota che la norma della soluzione cresce.
Questo perché quando k=√72 la matrice A è singolare, quindi non invertibile.
Per k→√72 l'autovalore di A diventa sempre più piccolo e la matrice che si ottiene a partire dalla risoluzione del sistema lineare associato ad A tramite l'algoritmo di Cholesky ha un autovalore sempre più grande. Ciò provoca la dilatazione di entrambe le norme. Questo effetto si verifica indipendentemente dalla norma scelta.