CÁLCULO NUMÉRICO (521230)
LABORATORIO 3 - 2017-2
Ecuaciones y Sistemas de Ecuaciones No Lineales
Contents
EJERCICIO 1
1.1 escriba una función MATLAB que dado k en R (parámetro entrada a la función), calcule F(k). Esta función debe estar escrita de modo que, en caso que el parámetro de entrada sea un vector, ella retorne un vector con los valores de F en cada uno de los puntos especificados en el vector de entrada.
function F = Fkappa(k) F = zeros(size(k)); for i = 1:length(k) F(i) = (10.2 + 1/(2*k(i)))*exp(-k(i)*(21-20)) + (21+24)/2 - 1/(2*k(i)) - 29.4; end end
1.2 Escriba un rutero MATLAB que haga lo siguiente:
- evalúe F en 100 puntos distintos del intervalo [0.1,0.5]. Haga un gráfico de la función y observe que ella tiene un cero en el intervalo considerado. Con la ayuda del comando grid on indique una aproximación inicial de la raíz de esta función.
- Llame a la función MATLAB fzero para obtener una aproximación al cero de F en [0.1,0.5].
OPCIÓN 1
clc clear all close all kk = linspace(.1,.5); plot(kk,Fkappa(kk),'r-') title('$F(\kappa)$'); xlabel('Par\''ametro ($\kappa$)'); ylabel('Temperatura ($F$)'); grid on kappa = fzero('Fkappa',.325,optimset('TolX',1e-10)) %optimset fija una tolerancia distinta a la fijada por defecto, no es obligatorio definirlo siempre
kappa = 0.3310
OPCIÓN 2 (sin crear Fkappa.m)
clc clear all close all Ttk = @(t,k) (10.2 + 1./(2*k)).*exp(-k.*(t-20)) + (t+24)/2 - 1./(2*k); Fk = @(k) Ttk(21,k) - 29.4; kappa = fzero(Fk,.325,optimset('TolX',1e-10))
kappa = 0.3310
1.3 Escriba ahora una función que evalúe a T(t) - 36.5 tomando k igual al valor obtenido antes.
function T = Ttiempo(t,kappa) T = zeros(size(t)); for i = 1:length(t) T(i) = (10.2 + 1/(2*kappa))*exp(-kappa*(t(i)-20)) + (t(i)+24)/2 - 1/(2*kappa) - 36.5; end end
1.4 Proceda de manera similar a como lo hizo en 1.2, pero ahora para determinar el valor de t* en (16,20) en el cual la temperatura del Sr. D era de 36.5. ¿A que hora fuer aseinado el Sr. D?
En este caso, se puede proceder como en la opción 1 o 2. Escogemos la 2.
T = @(t) Ttk(t,kappa) - 36.5; tt = linspace(16,20); plot(tt,T(tt),'b-') title('$T(t)$'); xlabel('Tiempo ($t$)'); ylabel('Temperatura ($T$)'); grid on tmuerte = fzero(T,19,optimset('TolX',1e-10))
tmuerte = 18.9584
EJERCICIO 3
Escriba un rutero en MATLAB que para n = 30 haga lo siguiente:
3.1 Resuelva el problema de valores iniciales utilizando el algoritmo mostrado. 3.2 Aprovechando la partición del intervalo [0,2pi], dibuje la gráfica de la solución obtenida.
clc clear all close all n = 30; h = 2*pi/n; x(1) = 0; y(1) = 1; for i = 1:n-1 x(i+1) = (i+1)*h; funec = @(X,Y,Yi,h) Y - Yi - h*sin(X*Y); y(i+1) = fzero(@(Y)funec(x(i+1),Y,y(i),h),y(i));%y_i es un valor cercano para y_i+1 end plot(x,y) title('Soluci\''on P.V.I.'); xlabel('$x$') ylabel('$y(x)$')
EJERCICIO 4
4.1 Encuentre el valor máximo absoluto y mínimo absoluto de la función
en el intervalo [-5,5].
f = @(x) (x + cos(x.^2))./(log(1 + exp(x.^2))); fplot(f) %esta función hace un plot automático entre -5 y 5 grid on df = @(x) ((1 - 2*x.*sin(x.^2)).*(log(1 + exp(x.^2))) - ((x + cos(x.^2)).*(2*x.*exp(x.^2))./(1 + exp(x.^2))))./(log(1 + exp(x.^2)))^2; xmax = fzero(df,[0 1]); xmin = fzero(df,[-2 -1]); figure hold on fplot(f); plot(xmin,f(xmin),'rx'); plot(xmax,f(xmax),'rx'); hold off fprintf(1,'El valor mínimo y máximo de f en el intervalo [-5,5] son %f y %f respectivamente \n',f(xmin),f(xmax));
El valor mínimo y máximo de f en el intervalo [-5,5] son -0.924513 y 1.788857 respectivamente
EJERCICIO 5
5.1 Modifique la función newtonrd para que resuelva el problema unidimensional de encontrar la solución de una ecuación no lineal f(x) = 0, utilizando el método de Newton-Raphson. Aplíquelo para resolver los ejercicios 1, 4 y 5.
function [sol,it] = newtonrd(f,df,x0,tol,maxit) D0 = feval(df,x0); f0 = feval(f,x0); if D0 == 0 error('derivada igual a cero') end d0 = -f0/D0; x1 = x0 + d0; it = 1; conv = norm(d0) <= tol; while ~conv && (it < maxit) x0 = x1; D0 = feval(df,x0); f0 = feval(f,x0); d0 = -f0/D0; if D0 == 0 error('derivada igual a cero') end x1 = x0 + d0; conv = norm(d0) <= tol; it = it+1; end sol = x1; if ~conv it = -1; end end
5.2 Escriba un programa que resuelva el problema de encontrar la solución de una ecuación no lineal f(x) = 0 utilizando el método de la bisección.
function z = bisex(f,a,b) %Esta función calcula f(x) = 0 mediante %el método de la bisección. if f(a)*f(b) >= 0 error('Valores con signo igual o cero.'); end x_a = a; x_b = b; x_r = (x_a+x_b)/2; while f(x_r) ~= 0 if f(x_a)*f(x_r) < 0 x_b = x_r; else x_a = x_r; end x_r = (x_a+x_b)/2; end z = x_r; end