Implementación de Newton-Raphson y Métodos de Relajación en C++
Clasificado en Informática
Escrito el en
español con un tamaño de 3,01 KB
Implementación del Algoritmo de Newton-Raphson
En esta sección se detalla la lógica para el cálculo de la matriz derivada y la ejecución del proceso iterativo de Newton-Raphson.
/** HACER ALUMNO */
for (int i = 0; i < u.dim(); i++) {
Array1D u2 = u.copy(); // vector auxiliar
u2[i] += h;
Array1D derivada2 = ((*f)(u2) - (*f)(u)) / h;
for (int j = 0; j < u.dim(); j++) {
derivada[j][i] = derivada2[j];
}
}
return derivada;
}
/** HACER ALUMNO */
/** usar dentro del bucle la instrucción u.print("u"); para poder comparar los resultados
de cada iteración con los resultados que tienen que salir */
Array1D fu = (*f)(u);
Array1D fu2;
for (int Niter = 0; Niter < max_iter; Niter++) {
if (fu.norm() < tol) {
// Condición de convergencia alcanzada
}
// Resolución del sistema lineal por Gauss
fu2 = mn_gauss(matriz_derivada(f, u, h), (*f)(u) * (-1));
if (fu2.norm() < tol) {
// Condición de parada por incremento
}
u += fu2;
u.print("u");
}
return -1; // Ha excedido el número de iteraciones.
Método de Relajación para Sistemas Lineales
El siguiente código implementa el algoritmo de relajación (SOR) para resolver sistemas de ecuaciones de la forma Ax = b.
// REALIZAMOS LAS ITERACIONES DEL ALGORITMO
Array1D t(u.dim());
for (int num = 1; num < max_iter; num++) {
// RECORREMOS LAS INCÓGNITAS DE MANERA ASCENDENTE
real error = 0.0; // VARIABLE QUE ALMACENARÁ EL ERROR EN LA ITERACIÓN
// RECORREMOS CADA FILA
for (int i = 0; i < u.dim(); i++) {
real save = b[i]; // CREAMOS LA VARIABLE QUE GUARDARÁ EL NUEVO VALOR u[i]
for (int j = 0; j < i; j++) {
save = save - A[i][j] * u[j];
}
for (int j = i + 1; j < u.dim(); j++) {
save = save - A[i][j] * u[j];
}
save = w * save / A[i][i] + (1 - w) * u[i];
t[i] = u[i];
u[i] = save;
}
error = mn_error_vectores(u, t);
if (error < tol) {
return num;
}
}
return -1;
Relajación para Matrices Escasas
Optimización del método de relajación diseñado para trabajar con estructuras de matrices escasas, mejorando el rendimiento computacional.
// HACER ALUMNO
for (int Niter = 1; Niter < max_iter; Niter++) {
// RECORREMOS LAS INCÓGNITAS DE FORMA ASCENDENTE
real error = 0.0; // variable para almacenar el error en la iteración
for (int i = 0; i < u.dim(); i++) {
// RECORREMOS CADA FILA
real suma = b[i];
for (int j = 1; j < A[i].size(); j++) {
suma -= A[i][j] * u[J[i][j]];
}
if (A[i][0] == 0) return -1;
suma = w * suma / A[i][0] + (1 - w) * u[i];
error += mn_distancia(u[i], suma);
u[i] = suma;
}
if ((error / u.dim()) < tol) {
return Niter;
}
}
return -1;