基于C语言的Jacobi迭代和Gauss-Seidel迭代的方程组求解实现

文章目录

  • Jacobi迭代方法介绍
  • Gauss-Seidel迭代方法介绍
  • 具体代码实现
  • 示例题目
  • 实现效果

Jacobi迭代方法介绍

Jacobi迭代法是一种简单的迭代求解方法,适用于严格对角占优矩阵。其基本思想是利用当前迭代步的已知解来更新下一个迭代步的解。在C语言实现中,我们首先需要定义系数矩阵A、常数向量b以及迭代向量x。然后,通过循环迭代,不断更新x的值,直到满足收敛条件或达到最大迭代次数。

Jacobi迭代法的优点是简单直观,但收敛速度相对较慢。特别是对于非严格对角占优的矩阵,Jacobi迭代法可能不收敛。因此,在实际应用中,我们需要根据问题的具体情况选择合适的迭代方法。

Gauss-Seidel迭代方法介绍

Gauss-Seidel迭代法是对Jacobi迭代法的一种改进。在Gauss-Seidel迭代法中,我们使用当前迭代步已更新的解来更新下一个解。这种策略可以加速收敛速度,特别是在对角线元素较大的情况下。在C语言实现中,我们需要对系数矩阵A进行适当的分解,以便在迭代过程中方便地获取已更新的解。

与Jacobi迭代法相比,Gauss-Seidel迭代法具有更快的收敛速度。但是,Gauss-Seidel迭代法并不总是收敛的,其收敛性取决于系数矩阵A的性质。因此,在使用Gauss-Seidel迭代法时,我们需要确保系数矩阵A满足一定的条件(如严格对角占优)。

具体代码实现

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "time.h"#define N 3   //要求解的数组大小N x N
#define ERROR 1e-6  //误差要求
#define IterMaxNum 50000   //最大迭代次数float current_error(float* last, float* now)
{float max_error = 0;float temp;for (int i = 0; i < N; i++){temp = *(now + i) - *(last + i);if (temp < 0)temp = -temp;if (temp > max_error)max_error = temp;}return max_error;
}//雅可比迭代函数
float* Jacobi(float* A, float* b)
{clock_t start, end;double cpu_time_used;// 记录开始时间start = clock();int i, j;int iter_num = 0;   //目前的迭代次数float error_now = 100;   //目前迭代下的误差//生成数组用于保存每次迭代得到的x结果并保存上一次迭代结果至x0float* x = (float*)malloc(N * sizeof(float));memset(x, 0, N * sizeof(float));float* x0 = (float*)malloc(N * sizeof(float));memset(x0, 0, N * sizeof(float));while(error_now > ERROR){//将上一次迭代的结果保存到x0中去memcpy(x0, x, N * sizeof(float));for (i = 0; i < N; i++){float sum = 0;for (j = 0; j < N; j++){//printf("%f\t", A[i * N + j]);if (i != j)sum += A[i * N + j] * (x0[j]);}x[i] = (b[i] - sum) / A[i * N + i];}error_now = current_error(x, x0);iter_num++;printf("当前迭代次数为:【%d】,迭代误差为:【%f】\n", iter_num, error_now);printf("迭代结果为:%f,%f,%f\n", x[0], x[1], x[2]);if (iter_num > IterMaxNum){printf("迭代次数超过最大值要求,返回最后一次迭代结果");break;}}// 记录结束时间end = clock();// 计算经过的CPU时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;// 打印Jacobi迭代的运行时间printf("\n【Jacobi迭代运行了 %f 秒。】\n", cpu_time_used);free(x0);return x;
}float* GS(float* A, float* b)
{int i, j;int iter_num = 0;   //目前的迭代次数float error_now = 100;   //目前迭代下的误差//生成数组用于保存每次迭代得到的x结果并保存上一次迭代结果至x0float* x = (float*)malloc(N * sizeof(float));memset(x, 0, N * sizeof(float));float* x0 = (float*)malloc(N * sizeof(float));memset(x0, 0, N * sizeof(float));clock_t start, end;double cpu_time_used;// 记录开始时间start = clock();while (error_now > ERROR){memcpy(x0, x, N * sizeof(float));for (i = 0; i < N; i++){float sum = 0;for (j = 0; j < N; j++){//printf("%f\t", A[i * N + j]);if (i != j)sum += A[i * N + j] * (x[j]);}x[i] = (b[i] - sum) / A[i * N + i];}error_now = current_error(x, x0);  //获得当前迭代的误差结果iter_num++;   //迭代次数加1printf("当前迭代次数为:【%d】,迭代误差为:【%f】\n", iter_num, error_now);printf("迭代结果为:%f,%f,%f\n", x[0], x[1], x[2]);if (iter_num > IterMaxNum){printf("迭代次数超过最大值要求,返回最后一次迭代结果");break;}}// 记录结束时间end = clock();// 计算经过的CPU时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;// 打印Gauss-Seidel迭代的运行时间printf("\n【Gauss-Seidel迭代运行了 %f 秒。】\n", cpu_time_used);free(x0);return x;
}int main()
{// 例子float A[N][N] = {{10,-1,-2},{-1,10,-2},{-1, -1, 5},};   //要求解的矩阵float b[N] = {72, 83, 42};float* x;//    x = Jacobi((float*)A, b);x = GS((float*)A, b);printf("\n【最终结果为】:%f, %f, %f\n", x[0], x[1], x[2]);free(x);   //释放x
}

示例题目

以如下方程组为例,进行迭代方法的测试

在这里插入图片描述

实现效果

Jacobi迭代实现效果,迭代了【17】达到了收敛
在这里插入图片描述
Gauss-Seidel迭代实现效果,而Gauss-Seidel只迭代了【10】次即可达到收敛。
在这里插入图片描述
注意,有些示例中,Jacobi迭代是比Gauss-Seidel收敛的的,但更多的时候Gauss-Seidel是收敛更快的,并且存在有时候Jacobi收敛,而Gauss-Seidel却发散,要根据情况而定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Textual Learning2 -- 使用时的小问题

1、出现的问题&#xff1a; 在vscode里面直接运行函数会显示报错&#xff1a; 我尝试在vscode中含textual库的环境下运行&#xff0c;但仍然报错 2、解决方案&#xff1a; 在命令行中运行&#xff1a; 首先按winR&#xff0c;输入cmd打开命令行 或在已经安装的conda环境&a…

古人的智慧结晶——水铳:揭秘明清时期的消防神器

明代的《奇器图说》是一本记录了当时各种奇巧机械的著作&#xff0c;而水铳则是书中记载的一项令人惊叹的发明&#xff0c;它不仅展示了古人对物理原理的深刻理解&#xff0c;更是早期消防技术的一个缩影。 水铳&#xff0c;这个名字听起来似乎有些陌生&#xff0c;但在古代&am…

电脑文件kernel32.dll缺失要怎么处理?怎么才能一键修复kernel32.dll文件

关键系统文件kernel32.dll的缺失&#xff0c;这种情况不仅会导致系统运行不稳定&#xff0c;甚至可能完全无法启动某些应用程序。kernel32.dll 是一个至关重要的动态链接库文件&#xff0c;它与Windows操作系统的多个基本操作相关联&#xff0c;包括内存管理、进程和线程的控制…

dledger原理源码分析系列(二)-心跳

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的心跳 关键词 Raft Openmessaging 心跳/…

技术赋能教育:校园3D电子地图与AR导航解决方案

随着高考的落幕&#xff0c;又一批新鲜血液即将注入大学校园。面对陌生的环境&#xff0c;如何快速适应、准确找到目标地点&#xff0c;成为新生们的一大难题。同时&#xff0c;对于学校而言&#xff0c;如何向报考人员直观展示校园环境&#xff0c;提供沉浸式参观体验&#xf…

Mybatis-Plus学习|快速入门CRUD、主键生成策略(雪花算法、主键自增等)、自动填充、乐观锁、分页插件、逻辑删除

MyBatisPlus概述 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间&#xff0c;所有的CRUD代码它都可以自动化完成! JPA、tk-mapper、MyBatisPlus 偷懒的! MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff…

Day 48 消息队列集群RabbitMQ

消息队列集群-RabbitMQ 一、消息中间件 中间件 tomcat java web中间件 web容器 mysql php php mysql uwsgi python mysql mycat 数据库中间件 rabbitMQ 消息中间件 1、简介 MQ 全称为&#xff08;Message Queue消息队列&#xff09;。是一种应用程序对应用程序的通信方…

【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!

目录 1. 引言1.1 数字人技术的发展背景1.2 DUIX数字人项目的开源意义1.3 DUIX数字人技术的独特价值1.4 本文目的与结构 2. DUIX数字人概述2.1 定义与核心概念2.2 硅基智能与DUIX的关系2.3 技术架构2.4 开源优势2.5 应用场景2.6 安全与合规性 3. DUIX数字人技术特点3.1 开源性与…

【Java Gui精美界面】IDEA安装及配置SwingX

SwingX 是一个基于 Swing 的 Java GUI 库&#xff0c;旨在为 Swing 提供额外的功能和丰富的组件 特点描述基于 Swing继承了 Swing 的所有特性和功能。丰富组件SwingX 提供了一组高级 UI 组件&#xff0c;例如 TreeTable仍在发展中不活跃的发展ing。。。支持搜索高亮如 TreeTab…

【分布式系列】分布式锁的设计与实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

steam社区加载异常、加载失败、无法加载、黑屏的解决方法

随着steam夏季特卖的临近&#xff0c;最近几天开启史低折扣的大作已经越来越少了&#xff0c;不过也并不是没有。最经典的知名大作文明6之前已经打到1折的骨折价了&#xff0c;没想到也能背刺&#xff0c;现在是新史低价0.5折11元&#xff0c;很多玩家入手后纷纷前往社区看新手…

ZABBIX-7.0LTS在线部署部署教程

ZABBIX-7.0LTS在线部署部署教程 环境&#xff1a; 操作系统&#xff1a; ubuntu 22.04zabbix-server版本&#xff1a; 7.0LTS系统配置[需结合监控的业务量提供配置]&#xff1a; 建议2C(CPU)8G(运行) 100GB(存储)架构&#xff1a;LNMP 第一步&#xff1a; 系统初始化 1.配置…

计算机网络知识整理笔记

目录 1.对网络协议的分层&#xff1f; 2.TCP/IP和UDP之间的区别&#xff1f; 3.建立TCP连接的三次握手&#xff1f; 4.断开TCP连接的四次挥手&#xff1f; 5.TCP协议如何保证可靠性传输&#xff1f; 6.什么是TCP的拥塞控制&#xff1f; 7.什么是HTTP协议&#xff1f; 8…

MySQL InnoDB支持几种行格式

数据库表的行格式决定了一行数据是如何进行物理存储的&#xff0c;进而影响查询和DML操作的性能。 在InnoDB中&#xff0c;常见的行格式有4种&#xff1a; 1、COMPACT&#xff1a;是MySQL 5.0之前的默认格式&#xff0c;除了保存字段值外&#xff0c;还会利用空值列表保存null…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-20填充与步幅

20填充与步幅 import torch from torch import nn# 此函数初始化卷积层权重&#xff0c;并对输入和输出提高和缩减相应的维数 def comp_conv2d(conv2d, X):# 这里的&#xff08;1&#xff0c;1&#xff09;表示批量大小和通道数都是1#将输入张量 X 的形状调整为 (1, 1, height,…

Grafana-11.0.0 在线部署教程

Grafana-11.0.0 在线部署教程 环境&#xff1a; 操作系统&#xff1a; ubuntugrafana版本&#xff1a; 11.0.0 &#xff08;建议不要按照最新版&#xff09;grafana要求的系统配置不高&#xff0c;建议直接部署在监控服务器上&#xff0c;比如zabbix服务器、prometheus服务器…

从菌群代谢到健康影响——认识肠道丙酸和丁酸

谷禾健康 短链脂肪酸这一词经常出现在谷禾的文章和报告中&#xff0c;那你真的了解短链脂肪酸吗&#xff1f;短链脂肪酸(SCFA)主要是肠道微生物群在结肠内通过发酵碳水化合物(包括膳食和内源性碳水化合物&#xff0c;主要是抗性淀粉和膳食纤维)和一些微生物可利用的蛋白质而产生…

光线追踪:原理与实现

版权声明 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明文章内容不得删减、修改、演绎本文视频版本&#xff1a;见文末 各位同学大家好&#xff0c;今天我要给大家分享的是光线追踪的原理和实现大家知道在过往很多年里面&#x…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

如何从0构建一款类似pytest的工具

Pytest主要模块 Pytest 是一个强大且灵活的测试框架&#xff0c;它通过一系列步骤来发现和运行测试。其核心工作原理包括以下几个方面&#xff1a;测试发现&#xff1a;Pytest 会遍历指定目录下的所有文件&#xff0c;找到以 test_ 开头或 _test.py 结尾的文件&#xff0c;并且…