0% encontró este documento útil (0 votos)
39 vistas9 páginas

PREGUNTA2

El documento presenta el código en MATLAB para implementar diferentes métodos numéricos como interpolación de Newton, regla de Simpson, eliminación gaussiana con pivoteo parcial y el método de Euler modificado para resolver ecuaciones diferenciales ordinarias.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
39 vistas9 páginas

PREGUNTA2

El documento presenta el código en MATLAB para implementar diferentes métodos numéricos como interpolación de Newton, regla de Simpson, eliminación gaussiana con pivoteo parcial y el método de Euler modificado para resolver ecuaciones diferenciales ordinarias.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

function [approximation, error] = newton_interpolation(x_values,

f_values, x_star)
% Calcula el polinomio interpolante de Newton de diferencias
divididas
% y devuelve la aproximación en x_star y el error de aproximación.

% Verifica si los tamaños de los vectores de valores de x y f son


iguales
if length(x_values) ~= length(f_values)
error('Los tamaños de los vectores de x y f deben ser
iguales.');
end

% Número de puntos de interpolación


n = length(x_values);

% Calcula las diferencias divididas


f_diff = f_values; % Inicializa con los valores de f
for j = 2:n
for i = n:-1:j
f_diff(i) = (f_diff(i) - f_diff(i-1)) / (x_values(i) -
x_values(i-j+1));
end
end

% Calcula la aproximación usando el polinomio interpolante de


Newton
approximation = f_diff(n);
for i = n-1:-1:1
approximation = approximation * (x_star - x_values(i)) +
f_diff(i);
end

% Calcula el error de aproximación


error = abs(f(x_star) - approximation);
end
Código en MATLAB
%Huaroc Loyola Luis
function [approximation, error] = simpsons_rule_approximation()

% Definir la función y los límites de integración


f = @(x) 1/sqrt(x^2 - 4);
a = 3;
b = 5;

% Número de subintervalos
n = 10;

% Calcular la longitud del subintervalo


delta_x = (b - a) / n;

% Calcular la aproximación usando la regla compuesta de Simpson


approximation = (delta_x / 3) * (f(a) + 4 * sum_odd_terms(f, a, n,
delta_x) + 2 * sum_even_terms(f, a, n, delta_x) + f(b));

% Calcular el error de aproximación


error = simpsons_rule_error(f, a, b, n);

% Mostrar resultados
disp('Aproximación:');
disp(approximation);
disp('Error de aproximación:');
disp(error);

end

function result = sum_odd_terms(f, a, n, delta_x)


result = 0;
for i = [Link]n-1
result = result + f(a + i * delta_x);
end
end

function result = sum_even_terms(f, a, n, delta_x)


result = 0;
for i = [Link]n-2
result = result + f(a + i * delta_x);
end
end

function error = simpsons_rule_error(f, a, b, n)


xi = linspace(a, b, n+1);
max_derivative = max(arrayfun(@(x) abs(fourth_derivative(f, x)),
xi));
error = ((b - a)^5) / (180 * n^4) * max_derivative;
end

function derivative = fourth_derivative(f, x)


h = 1e-5;
derivative = (f(x - 2*h) - 4*f(x - h) + 6*f(x) - 4*f(x + h) + f(x
+ 2*h)) / (h^4);
end
function [x] = gaussEliminacionPivoteoParcial(A, b)
[m, n] = size(A);

if m ~= n
error('La matriz A debe ser cuadrada.');
end

% Combinar matriz A y vector b


Ab = [A, b];

% Eliminación gaussiana con pivoteo parcial


for k = 1:n-1
% Encontrar el pivote máximo en la columna actual
[~, pivot_row] = max(abs(Ab(k:end, k)));

% Ajustar el índice de fila


pivot_row = pivot_row + k - 1;

% Intercambiar filas para tener el pivote en la posición


correcta
Ab([k, pivot_row], :) = Ab([pivot_row, k], :);

% Eliminación gaussiana
for i = k+1:n
factor = Ab(i, k) / Ab(k, k);
Ab(i, k:end) = Ab(i, k:end) - factor * Ab(k, k:end);
end
end

% Sustitución hacia atrás


x = zeros(n, 1);
for i = n:-1:1
x(i) = (Ab(i, end) - Ab(i, i+1:n) * x(i+1:n)) / Ab(i, i);
end
end
LUEGO EJECUTAMOS LA FUNCION PARA NUESTRO SISTEMA
function [t_values, y_values] = euler_modificado(tspan, y0, h,
tolerance)
% Método de Euler modificado para resolver ecuaciones
diferenciales ordinarias
% tspan: intervalo de tiempo [t_inicial, t_final]
% y0: condición inicial
% h: tamaño del paso
% tolerance: tolerancia para el error

% Inicialización de los vectores de tiempo y solución


t_values = tspan(1):h:tspan(2);
y_values = zeros(size(t_values));
y_values(1) = y0;

% Función diferencial
f = @(t, y) cos(2*t) + sin(3*t);

% Solución exacta para comparación


y_exact = @(t) (1/2) * sin(2*t) - (1/3) * cos(3*t) + (4/3);

% Iteración
for i = 1:length(t_values)-1
% Predicción usando Euler
y_pred = y_values(i) + h * f(t_values(i), y_values(i));

% Corrección usando el promedio de las derivadas


y_values(i+1) = y_values(i) + h * (f(t_values(i), y_values(i))
+ f(t_values(i+1), y_pred)) / 2;

% Calcular el error actual


error = abs(y_exact(t_values(i+1)) - y_values(i+1));

% Verificar la tolerancia
if error < tolerance
break;
end
end
end

% Parámetros del problema


tspan = [0, 1];
y0 = 1;
h = 0.1;
tolerance = 1e-5;

% Llamada al método de Euler modificado


[t_values, y_values] = euler_modificado(tspan, y0, h, tolerance);

% Muestra los resultados


plot(t_values, y_values, '-o', 'DisplayName', 'Aproximación');
hold on;
t_exact = linspace(tspan(1), tspan(2), 100);
y_exact = (1/2) * sin(2*t_exact) - (1/3) * cos(3*t_exact) + (4/3);
plot(t_exact, y_exact, '--', 'DisplayName', 'Solución exacta');
xlabel('t');
ylabel('y(t)');
title('Aproximación usando Euler modificado y solución exacta');
legend('Location', 'Best');
hold off;

También podría gustarte