Calculo numérico: Método de Cholesky

14 visualizzazioni (ultimi 30 giorni)
Fabian
Fabian il 26 Nov 2024
Definir una matriz A ∈ R n×n, como:
donde h es el tamaño del paso, y n se define como n = (1/h) − 1.
Y un vector b ∈ R n, definido como:
Estas definiciones corresponden a la discretización del siguiente problema de valores de frontera:
1. Escriba una función que reciba como entrada un valor para h y devuelva la matriz A y el vector b correspondientes.
2. Llame a la función escrita en el apartado anterior con h = 0.1. Verifique si A es simétrica y definida positiva utilizando el comando chol para obtener la factorización de Cholesky de A.
3. Resuelva el sistema Au = b utilizando la factorización de Cholesky de A. El vector solución u representa una aproximación a los valores de la solución de u(x) en los puntos h, 2h, . . . , nh.
a) Grafique, en un mismo gráfico:
• La solución aproximada u, extendida con los valores de u(0) = 0 y u(1) = 1.
• La solución analítica u(x) = 2(x^2) − 2x + 1, evaluada en 100 puntos igualmente espaciados en el intervalo [0, 1].
  3 Commenti
Fabian
Fabian il 1 Dic 2024
function [A, b] = frontera_discretizacion(h)
h = 0.1;
n = (1/h) - 1;
b1 = -4 * ones(n, 1);
% Construcción del segundo término: vector con 1 en los extremos y 0 en medio
b2 = zeros(n, 1);
b2(1) = 1; % Primer componente es 1
b2(end) = 1; % Último componente es 1
b2 = (1/h^2) * b2; % Multiplicación por el factor 1/h^2
% Definición de b como la suma de los dos términos
b = b1 + b2;
% Mostrar resultado
disp('El vector b es:');
disp(b);
diagonal_principal = (2 / h^2) * ones(n, 1);
diagonal_inferior_superior = (-1 / h^2) * ones(n, 1);
A = spdiags([diagonal_inferior_superior, diagonal_principal, diagonal_inferior_superior], -1:1, n, n);
end
Este es el codigo que he conseguido para hacer el vector y la matriz. Pero no se que codigo debo usar para: verificar si A es simétrica y definida positiva utilizando el comando chol para obtener la factorización de Cholesky de A.
Walter Roberson
Walter Roberson il 1 Dic 2024
[R,flag] = chol(A);
if flag == 0
fprintf('A was symmetric positive definite\n');
else
fprintf('A not symmetric positive definite. Pivot failed at location %d\n', flag);
end

Accedi per commentare.

Risposte (0)

Categorie

Scopri di più su Mathematics in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by