%% Linealización de funciones de 1 variable: ejemplo Matlab
% © 2022, Antonio Sala Piqueras, Universitat Politècnica de València. Todos los derechos reservados.
% *Este código ejecutó sin errores en Matlab R2022b
% Presentación en vídeo: http://personales.upv.es/asala/YT/V/linsisoml.html
% Objetivo: ilustrar el concepto de linealización, recta tangente, aproximación.
%
% Tabla de Contenidos
% Definición de función y punto de operación
% Modelo linealizado
%     Representación/comparación gráfica con modelo original
% Comprobación numérica de la linealización
%%
%% Definición de función y punto de operación

syms x y real
f(x)= cos(x)

% Elegiremos punto de tangencia (punto de operación):

x0=0.85; %valor arbitrario, al menos en este contexto

% El valor de la función en ese punto (punto de operación de y) es:

y0=f(x0) %simbólico
y0_num=eval(y0) %numérico
fplot(f,[-2 3.5],LineWidth=2), hold on, plot(x0,y0_num,'or'), hold off, legend("Función", "pto. operación"), grid on

%% Modelo linealizado
% A partir del desarrollo de Taylor, escogiendo hasta primeras derivadas obtendremos el modelo linealizado:
% f(x)=\ \underbrace{f(x_0)+\underbrace{\frac{df}{dx}_{|x_0}\cdot\Delta x}_{\text{modelo linealizado incr.}}}_{\text{modelo linealizado abs. (afín)}}\ +\ \frac{1}{2}\frac{d^2f}{dx^2}_{|x_0}\cdot\Delta x^2\ +\ \frac{1}{3!}\frac{d^3f}{dx^3}_{|x_0}\cdot\Delta x^3\ +\dots
% siendo \Delta x:=x-x_0.

fprima=diff(f)
m=fprima(x0) %derivada en el punto de funcionamiento, pendiente de la recta tangente
eval(m) %pendiente numérica

% El modelo incremental es \Delta y =\frac{df}{dx}_{|x_0}\Delta x, y es con esta notación como suele ser utilizado en aplicaciones.
% Obviamente, lo podemos escribir como la ecuación de la recta tangente:

AproxLin= (y-y0)==m*(x-x0)
vpa(AproxLin,4) %veamos esto con números decimales

% Es una ecuación "implícita"... Escribiendo "explícitamente" y en función de x, esto es: y_{aprox}=f(x_0)+\frac{df}{dx}\Delta x

AproxLin2= solve(AproxLin,y); %despeja y, resuelve y
vpa(AproxLin2,4)  %con números decimales

%% Representación/comparación gráfica con modelo original

rangegraf=[-1.4 1.4]+x0;
fplot([f AproxLin2],rangegraf,LineWidth=3), grid on,
hold on, plot(x0,y0_num,'ob'), hold off
xline(x0,'-.',Label="x_0"),yline(y0_num,'-.',Label="y_0")
legend("original f","linealización")

% ¿Cuál es el error de linealización?

fplot(f-AproxLin2,rangegraf,LineWidth=3,Color=[.8 .15 .5]), grid on
hold on, plot(x0,0,'or'), hold off
xline(x0,'-.',Label="x_0"), title("Error de linealización")

% El porcentaje de error "error de linealización"/"incremento calculadolineal" es:

fplot((f-AproxLin2)/(AproxLin2-y0),rangegraf,LineWidth=3,Color=[.9 .15 .3]), grid on
hold on, plot(x0,0,'og'), hold off
xline(x0,'-.',Label="x_0"), title("Error de linealización (porcentual)")
yline(-0.1,':r',Label="10%",LineWidth=1.5),yline(0.1,':r',Label="10%",LineWidth=1.5)

%%
%% Comprobación numérica de la linealización
% Para aproximar f(x_0+\Delta x) calculariamos:

incx=0.06;
incyaprox=eval(m*incx)
yaprox=y0_num+incyaprox %aproximación lineal

% Comparamos con el original:

y_correcta=eval(f(x0+incx)) %exacto
error_linealizar=y_correcta-yaprox %error
error_linealizar/incyaprox %en porcentaje sobre el incremento calculado

% Nos equivocamos un pequeño porcentaje en el cálculo del "incremento respecto al punto de operación" si incx es pequeño, no así si es grande...
%%
%