function [salidadeA,n] = F(A,tol) %UNTITLED2 Summary of this function goes here % Detailed explanation goes here disp(newline); cadenainfo1 = "Entrada a la función F que calcula el logaritmo de I + A"; disp(cadenainfo1 ); salidadeA = A; n = 0; dim = length(A); calculoexactoA = log( eye(dim) + A); % Calculao la dimensión de la matriz dimensiones = size(A); % La matriz no es adecuada if dimensiones(1) ~= dimensiones(2) disp("La matriz no es cuadrada. La función terminará ahora."); % Calcular la norma de la matriz de entrada elseif norm(A) >= 1 cadenainfo1 = sprintf("La norma de la matriz de entrada es %f y por tanto al ser > 1 la serie no es convergente. Esta función no puede hacer por tanto un cálculo aproximado.", norm(A)); disp( cadenainfo1 ); % Si la matriz calculada exactamente tiene elmentos infinitos el algoritmo % no va a funcionar. Entonces salir de la función elseif max( max( abs( calculoexactoA ) ) ) == Inf cadenainfo1 = sprintf("La matriz calculada exactamente tiene elementos infinitos, con lo que el algoritmo no va a funcionar. Esta función terminará ahora."); disp( cadenainfo1 ); % La matriz es correcta else cadenainfo1 = sprintf("La matriz es cuadrada de dimensión %u.", dim); disp(cadenainfo1); disp(A); salidadeA = zeros( dim ); nmax = 2000000; while( norm( calculoexactoA) - norm( salidadeA ) > tol ) % Incremento el contador de iteracciones if n+1 > nmax break; end n = n + 1; salidadeA = salidadeA + (1/n)*((-1)^(n+1)) * A^n ; if mod(n,200000) == 0 cadenainfo1 = sprintf( "Iteracción %u", n ); disp(cadenainfo1); end end disp(newline); normamatrizexacta = norm( calculoexactoA); normalmatrizaprox = norm( salidadeA ); tolactual = abs(normamatrizexacta) - abs(normalmatrizaprox) ; cadenainfo1 = sprintf("La norma de la matriz calculada exactamente es de %f", normamatrizexacta); cadenainfo2 = sprintf("La norma de la matriz calculada aproximadamente es de %f", normalmatrizaprox); cadenainfo3 = sprintf("La tolerancia actual es de %f", tolactual); cadenainfo_salida = [ cadenainfo1 ; cadenainfo2 ; cadenainfo3 ]; disp(cadenainfo_salida); disp("Matriz calculada exactamente log( I + A )"); disp(calculoexactoA); disp("Matriz calculada aproximadamente log( I + A )"); disp(salidadeA); disp(newline); cadenainfo1 = "Salida de la función F que calcula el logaritmo de I + A"; disp(cadenainfo1 ); disp(newline); end end