线性方程组的迭代法(Jacobi 迭代法和Gauss-Seidel 迭代法) C++代码

2023-12-01 09:01

本文主要是介绍线性方程组的迭代法(Jacobi 迭代法和Gauss-Seidel 迭代法) C++代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Jacobi 迭代法

#include <iostream>
#include <cmath>
#include <vector>using namespace std;// 定义方程组的系数矩阵和常数向量
vector<vector<double>> A = {{20, 2, 3},{1, 8, 1},{2, -3, 15}};
vector<double> b = {24, 12, 30};// 定义迭代次数和精度阈值
int maxIterations = 100;
double epsilon = 5e-5;
int iterations = 0;
// 雅可比迭代函数
vector<double> jacobiIteration(const vector<vector<double>>& A, const vector<double>& b, const vector<double>& x0) {int n = A.size();vector<double> x(x0);  // 初始解的近似值for (int k = 0; k < maxIterations; k++) {iterations++;vector<double> x_new(n, 0);for (int i = 0; i < n; i++) {double sum = 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];}// 判断是否满足终止条件double diff = 0;for (int i = 0; i < n; i++) {diff += abs(x_new[i] - x[i]);}if (diff < epsilon) {break;}// 更新解的近似值x = x_new;}return x;
}int main() {int n = A.size();vector<double> x0(n, 0);  // 初始解的近似值vector<double> x = jacobiIteration(A, b, x0);cout << "Solution: \n";for (int i = 0; i < n; i++) {cout << "x" << i+1 << " = " << x[i] << "\n";}cout << endl;cout << "iterations = " << iterations << '\n';return 0;
}

Gauss-Seidel 迭代法

#include <iostream>
#include <cmath>#define N 3 // 线性方程组的未知数个数
#define MAX_ITERATIONS 100 // 最大迭代次数
#define EPSILON 0.00005 // 迭代停止的精度void gaussSeidel(double coef[N][N], double b[N], double x[N]) {double x_new[N];// 初始化迭代结果for (int i = 0; i < N; i++) {x[i] = 0;}int iterations = 0;double error = EPSILON + 1;while (error > EPSILON && iterations < MAX_ITERATIONS) {for (int i = 0; i < N; i++) {double sum1 = 0;for (int j = 0; j < i; j++) {sum1 += coef[i][j] * x_new[j];}double sum2 = 0;for (int j = i + 1; j < N; j++) {sum2 += coef[i][j] * x[j];}x_new[i] = (b[i] - sum1 - sum2) / coef[i][i];}error = 0;for (int i = 0; i < N; i++) {error += std::abs(x_new[i] - x[i]);x[i] = x_new[i];}iterations++;}if (iterations < MAX_ITERATIONS) {std::cout << "Converged in " << iterations << " iterations." << std::endl;} else {std::cout << "Did not converge within the maximum number of iterations." << std::endl;}
}int main() {double coef[N][N] = {{20, 2, 3}, {1, 8, 1}, {2, -3, 15}};double b[N] = {24, 12, 30};double x[N];gaussSeidel(coef, b, x);std::cout << "Solution:" << std::endl;for (int i = 0; i < N; i++) {std::cout << "x" << i << " = " << x[i] << std::endl;}return 0;
}

Jacobi 迭代法与Gauss-Seidel 迭代法的比较

#include <iostream>
#include <vector>
#include <cmath>#define N 3 // 线性方程组的未知数个数
#define MAX_ITERATIONS 100 // 最大迭代次数
#define EPSILON 0.00005 // 迭代停止的精度// 高斯-赛德尔迭代法
int gaussSeidel(const std::vector<std::vector<double>>& A, const std::vector<double>& b, std::vector<double>& x) {std::vector<double> x_new(N);// 初始化迭代结果for (int i = 0; i < N; i++) {x[i] = 0;}int iterations = 0;double error = EPSILON + 1;while (error > EPSILON && iterations < MAX_ITERATIONS) {for (int i = 0; i < N; i++) {double sum1 = 0;for (int j = 0; j < i; j++) {sum1 += A[i][j] * x_new[j];}double sum2 = 0;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;for (int i = 0; i < N; i++) {error += std::abs(x_new[i] - x[i]);x[i] = x_new[i];}iterations++;}return iterations;
}// 雅可比迭代法
int jacobi(const std::vector<std::vector<double>>& A, const std::vector<double>& b, std::vector<double>& x) {std::vector<double> x_new(N);// 初始化迭代结果for (int i = 0; i < N; i++) {x[i] = 0;}int iterations = 0;double error = EPSILON + 1;while (error > EPSILON && iterations < MAX_ITERATIONS) {for (int i = 0; i < N; i++) {double sum = 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;for (int i = 0; i < N; i++) {error += std::abs(x_new[i] - x[i]);x[i] = x_new[i];}iterations++;}return iterations;
}int main() {std::vector<std::vector<double>> A = {{20, 2, 3}, {1, 8, 1}, {2, -3, 15}};std::vector<double> b = {24, 12, 30};std::vector<double> x(N);int gaussSeidelIterations = gaussSeidel(A, b, x);int jacobiIterations = jacobi(A, b, x);std::cout << "Gauss-Seidel iterations: " << gaussSeidelIterations << std::endl;std::cout << "Jacobi iterations: " << jacobiIterations << std::endl;return 0;
}

这篇关于线性方程组的迭代法(Jacobi 迭代法和Gauss-Seidel 迭代法) C++代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440537

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona