ACTIVIDAD 4:
EJERCICIOS
Fecha:23/04/24
Nombre del estudiante: Christian Axel Ponce Sánchez
Nombre del docente: Gonzalo Orozco Aceves
1. Resuelve los ejercicios aplicando los conocimientos sobre:
➢ Matrices especiales, método de Jacobi y método de Gauss-Seidel
➢ Métodos numéricos
➢ Programación
2. Con base en el material consultado, replica los siguientes ejercicios indicados para cada método y
realiza pruebas con dos ecuaciones aleatorias a resolver. Revisa nuevamente el siguiente material:
Chapra, S. & Canale, R. (2007). Métodos numéricos
para ingenieros [Archivo PDF].
https://www.academia.edu/35215572/Metodos_N
umericos_Aplicados_a_La_Ingenieria_4a_Nieves
a) Propón un sistema de ecuaciones de 3x3 de la forma “Ax = b” e ingrésalo
para ser resuelto por el método de Jacobi
1.-
PROGRAMA
#include <iostream>
#include <cmath>
using namespace std;
#define N 3 // Tamaño de la matriz
void jacobi(double A[N][N], double b[N], double x[N], int max_iter, double tol) {
double x_new[N];
int iter = 0;
double error;
do {
for (int i = 0; i < N; i++) {
double sum = 0.0;
for (int j = 0; j < N; j++) {
if (j != i) {
sum += A[i][j] * x[j];
x_new[i] = (b[i] - sum) / A[i][i];
}
error = 0.0;
for (int i = 0; i < N; i++) {
error += abs(x[i] - x_new[i]);
x[i] = x_new[i];
iter++;
} while (error > tol && iter < max_iter);
if (iter < max_iter) {
cout << "Solución encontrada:" << endl;
for (int i = 0; i < N; i++) {
cout << "x[" << i << "] = " << x[i] << endl;
} else {
cout << "No se encontró una solución dentro del número máximo de iteraciones."
<< endl;
}
int main() {
double A[N][N] = {{4, 2, -1}, {3, 5, 2}, {1, 1, 3}};
double b[N] = {4, 7, 3};
double x[N] = {0}; // Aproximación inicial
int max_iter = 1000; // Máximo número de iteraciones
double tol = 1e-6; // Tolerancia
jacobi(A, b, x, max_iter, tol);
return 0;
}
RESULTADOS:
X[0]=0.75
X[1]=0.75
X[2]= 0.5
2.-
PROGRAMA
#include <iostream>
#include <cmath>
using namespace std;
#define N 3 // Tamaño de la matriz
void jacobi(double A[N][N], double b[N], double x[N], int max_iter, double tol) {
double x_new[N];
int iter = 0;
double error;
do {
for (int i = 0; i < N; i++) {
double sum = 0.0;
for (int j = 0; j < N; j++) {
if (j != i) {
sum += A[i][j] * x[j];
x_new[i] = (b[i] - sum) / A[i][i];
error = 0.0;
for (int i = 0; i < N; i++) {
error += abs(x[i] - x_new[i]);
x[i] = x_new[i];
iter++;
} while (error > tol && iter < max_iter);
if (iter < max_iter) {
cout << "Solución encontrada:" << endl;
for (int i = 0; i < N; i++) {
cout << "x[" << i << "] = " << x[i] << endl;
} else {
cout << "No se encontró una solución dentro del número máximo de iteraciones."
<< endl;
int main() {
double A[N][N] = {{5, 1, 1}, {1, 4, 1}, {2, 3, 6}};
double b[N] = {10, 7, 20};
double x[N] = {0}; // Aproximación inicial
int max_iter = 1000; // Máximo número de iteraciones
double tol = 1e-6; // Tolerancia
jacobi(A, b, x, max_iter, tol);
return 0;
}
RESULTADOS
X[0]=1.34375
X[1]=0.791667
X[2]=2.48958
b) Programa el algoritmo para el Seudocódigo del método Gauss-Seidel Figura 11.6 (página 316)
1.-
PROGRAMA
#include <iostream>
#include <cmath>
using namespace std;
#define N 3 // Tamaño de la matriz
void gaussSeidel(double A[N][N], double b[N], double x[N], int max_iter, double tol) {
double x_new[N];
int iter = 0;
double error;
do {
for (int i = 0; i < N; i++) {
double sum1 = 0.0;
double sum2 = 0.0;
for (int j = 0; j < i; j++) {
sum1 += A[i][j] * x_new[j];
for (int j = i + 1; j < N; j++) {
sum2 += A[i][j] * x[j];
x_new[i] = (b[i] - sum1 - sum2) / A[i][i];
error = 0.0;
for (int i = 0; i < N; i++) {
error += abs(x[i] - x_new[i]);
x[i] = x_new[i];
iter++;
} while (error > tol && iter < max_iter);
if (iter < max_iter) {
cout << "Solución encontrada:" << endl;
for (int i = 0; i < N; i++) {
cout << "x[" << i << "] = " << x[i] << endl;
}
} else {
cout << "No se encontró una solución dentro del número máximo de iteraciones."
<< endl;
int main() {
double A[N][N] = {{2, 1, -1}, {1, 1, 1}, {3, 2, 3}};
double b[N] = {1, 2, 6};
double x[N] = {0}; // Aproximación inicial
int max_iter = 1000; // Máximo número de iteraciones
double tol = 1e-6; // Tolerancia
gaussSeidel(A, b, x, max_iter, tol);
return 0;
}
RESPUESTAS
X[0]=0.99999
X[1]=1.43051 e-06
X[2]=1
2.-
PROGRAMA
#include <iostream>
#include <cmath>
using namespace std;
#define N 3 // Tamaño de la matriz
void gaussSeidel(double A[N][N], double b[N], double x[N], int max_iter, double tol) {
double x_new[N];
int iter = 0;
double error;
do {
for (int i = 0; i < N; i++) {
double sum1 = 0.0;
double sum2 = 0.0;
for (int j = 0; j < i; j++) {
sum1 += A[i][j] * x_new[j];
for (int j = i + 1; j < N; j++) {
sum2 += A[i][j] * x[j];
}
x_new[i] = (b[i] - sum1 - sum2) / A[i][i];
error = 0.0;
for (int i = 0; i < N; i++) {
error += abs(x[i] - x_new[i]);
x[i] = x_new[i];
iter++;
} while (error > tol && iter < max_iter);
if (iter < max_iter) {
cout << "Solución encontrada:" << endl;
for (int i = 0; i < N; i++) {
cout << "x[" << i << "] = " << x[i] << endl;
} else {
cout << "No se encontró una solución dentro del número máximo de iteraciones."
<< endl;
}
int main() {
double A[N][N] = {{3, 2, -1}, {2, -2, 4}, {-1, 0.5, -1}};
double b[N] = {1, -2, 0};
double x[N] = {0}; // Aproximación inicial de 0
int max_iter = 1000; // Máximo número de iteraciones
double tol = 1e-6; // Tolerancia
gaussSeidel(A, b, x, max_iter, tol);
return 0;
}
RESPUESTAS
No se encontró una solución dentro del número máximo de interaciones
3. Para programar los ejercicios solicitados, utiliza algún lenguaje de programación recomendado por el
docente, consulta la herramienta en línea aquí sugerida. No olvides realizar las capturas de pantalla que
muestre haber corrido y obtenido los resultados derivados de la aplicación de cada método.
https://www.onlinegdb.com/
4. Redacta una conclusión en la que expliques qué fue lo que más aprendiste de errores u omisiones al hacer
el programa y en el momento de capturar y correr los métodos utilizados.
CONCLUSIÓN:
Al trabajar en la implementación de los programas para resolver sistemas de
ecuaciones lineales utilizando los métodos de Jacobi y Gauss-Seidel, aprendí varias
lecciones importantes:
3. Elección de los parámetros: La elección de los parámetros como la
aproximación inicial y la tolerancia es crucial para la convergencia de los
métodos iterativos. En algunos casos, una mala elección de estos parámetros
puede llevar a una convergencia lenta o incluso a la falta de convergencia.
4. Verificación de la convergencia: Es importante verificar la convergencia de los
métodos iterativos, especialmente cuando se trabaja con sistemas que pueden
no tener solución o tener múltiples soluciones. La falta de convergencia puede
indicar problemas en los datos de entrada o en la implementación del algoritmo.
5. Manejo de sistemas sin solución única: Al resolver sistemas de ecuaciones
lineales, es crucial reconocer y manejar adecuadamente los casos en los que no
hay una solución única. En tales casos, los métodos iterativos pueden no
converger o pueden converger a una solución que no satisface todas las
ecuaciones del sistema.
6. Depuración y prueba exhaustiva: La depuración y la prueba exhaustiva son
procesos fundamentales al desarrollar programas para resolver sistemas de
ecuaciones lineales. Es importante verificar los resultados obtenidos por el
programa y realizar pruebas con una variedad de sistemas para garantizar que
el programa funcione correctamente en diferentes escenarios.
5. Incorpora el proceso de desarrollo de los ejercicios en este mismo documento.
6. Genera una carpeta .ZIP donde integres tu reporte, así como el ejecutable y código fuente de cada ejercicio.
7. Al finalizar esta actividad, vuelve a la plataforma y sigue los pasos que se indican para enviar tu trabajo.
* * *