基于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.rhkb.cn/news/364438.html

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

相关文章

什么是入侵检测系统:综合指南

在网络安全领域&#xff0c;入侵检测系统 (IDS) 长期以来一直是防御威胁的基石。但由于技术在不断发展&#xff0c;绕过它们的技术也在不断发展&#xff0c;因此评估它们是否足以保护系统是至关重要的。 在这篇综合指南中会深入探讨了 IDS 的复杂性&#xff0c;彻底了解了其功…

策略模式(Strategy Pattern)

策略模式 &#xff08;Strategy Pattern&#xff09; 定义 它是将定义的算法家族、分别封装起来&#xff0c;让它们之间可以相互替换&#xff0c;从而让算法的变化不会影响到使用算法的用户。 可以避免多重分支的 if-else、switch语句。 属于行为型模式。 适用场景 如果系…

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”&#xff0c;意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相…

.net core 的 winform 的 浏览器控件 WebView2

在.NET Core WinForms应用程序中&#xff0c;没有直接的“浏览器控件”&#xff0c;因为WinForms不支持像WebBrowser控件那样的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一个基于Chromium的浏览器内核&#xff0c;可以在WinForms应用程序中嵌入Web内容。 …

数据结构速成--查找

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 …

YonBIP 获取项目代码配置(图文)

项目开发文件在本地环境重新部署后&#xff0c;开发端机器需要重新部署&#xff0c;在此记录一下操作过程。 1. 新建项目目录&#xff0c;在目录下点鼠标右键&#xff0c;选 Git Bash Here 2. 开始下载代码&#xff0c;根据代码量多少&#xff0c;几分钟就能下载完成。 3. 下载…

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合

ONLYOFFICE 8.1版本桌面编辑器深度体验&#xff1a;创新功能与卓越性能的结合 随着数字化办公的日益普及&#xff0c;一款高效、功能丰富的办公软件成为了职场人士的必备工具。ONLYOFFICE团队一直致力于为用户提供全面而先进的办公解决方案。最新推出的ONLYOFFICE 8.1版本桌面编…

6月28日PolarDB开源社区长沙站,NineData联合创始人周振兴将带来《数据库DevOps最佳实践》主题分享

6月28日&#xff08;周五&#xff09;&#xff0c;PolarDB 开源社区将来到湖南长沙&#xff0c;与湖南的开发者朋友们一起进行数据库技术交流&#xff01;NineData 联合创始人周振兴受邀参加&#xff0c;并将带来《数据库 DevOps 最佳实践》的主题分享。 本次活动议程&#xff…

2024年机动车签字授权人题库,助你冲刺!绝对不会让你后悔!

61.&#xff08;&#xff09;使汽车按驾驶人选定的方向行驶。 A.传动系统 B.行驶系统 C.转向系统 D.制动系统 答案&#xff1a;C 62.&#xff08;&#xff09;使汽车各总成及部件安装在适当的位置&#xff0c;对全车起支承作用以保证汽车正常行驶。 A.传动系统 B.行驶系…

STM32第八课:Su-03t语音识别模块

文章目录 需求一、SU03T语音识别模块二、模块配置流程1.固件烧录2.配置串口和传输引脚3.中断函数4.double类型转换5 数据发送6.接收处理 三、该模块完整代码总结 需求 基于上次完成空气质量传感器&#xff0c;利用SU03T语音识别模块&#xff0c;实现空气质量的语音问答播报。 …

【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发

文章目录 一、效果展示二、简介三、安装Jib插件1、区分环境2、安装插件一、效果展示 本地是window系统,无docker环境,没有任何runtime,使用jib工具打包镜像并推送完成,用时20秒 二、简介 Jib 是 Google 开发的一款开源工具,旨在帮助 Java 开发者更高效地将 Java 应用程…

电脑提示vcomp140.dll丢失的几种有效的解决方法,轻松搞定dll问题

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是找不到vcomp140.dll。那么&#xff0c;究竟什么是vcomp140.dll呢&#xff1f;为什么会出现找不到vcomp140.dll的情况呢&#xff1f;本文将从vcomp140.dll的定义、常见原因、对电脑的影响以及解…

Echarts地图实现:各省市计划录取人数

Echarts地图实现&#xff1a;各省市计划录取人数 实现功能 本文将介绍如何使用 ECharts 制作一个展示中国人民大学2017年各省市计划录取人数的地图。我们将实现以下图表形式&#xff1a; 地图&#xff1a;基础的地图展示&#xff0c;反映不同省市的录取人数。散点图&#xf…

Redis 7.x 系列【10】数据类型之有序集合(ZSet)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 ZADD2.2 ZCARD2.3 ZSCORE2.4 ZRANGE2.5 ZREVRANGE2.6 ZRANK2.7…

企业源代码加密软件丨透明加密技术是什么

在一个繁忙的软件开发公司中&#xff0c;两位员工小李和小张正在讨论源代码安全的问题。 “小张&#xff0c;你有没有想过我们的源代码如果被泄露了怎么办&#xff1f;”小李担忧地问。 “是啊&#xff0c;这是个大问题。源代码是我们的核心竞争力&#xff0c;一旦泄露&#…

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了&#xff0c;因为种种原因&#xff0c;也有很久一段时间没接触过stm32了。等我捡起来的时候&#xff0c;发现很多都已经忘记了&#xff0c;重新捡…

数据分析报告制作的结构和思路整理

先画重点&#xff1a;一份分析报告的制作&#xff0c;目前的市场的分析步骤是优先找一些别人的研究报告&#xff0c;现成的东西&#xff0c;重点是要好好总结业务逻辑和潜在运营可能&#xff0c;这也是一位优秀数据分析师的价值体现。 举个例子&#xff0c;以目前小说短剧赛道的…

SQL33 找出每个学校GPA最低的同学 解法详解

题目截图&#xff1a; 建表代码&#xff1a; drop table if exists user_profile; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar(14) NOT NULL, age int , university varchar(32) NOT NULL, gpa float, active_days_within_30 int…

虚拟服务器ESXI上Win11虚拟机安装EnspPro(Window系统安装EnspPro方法)

华为于2023年6月30日发布EnspPro&#xff0c;因其对部署环境使用较高&#xff08;常见8核16GB电脑支持模拟3~6个设备&#xff0c;如果要模拟多台设备大规模组网&#xff0c;则建议使用高性能服务器部署安装&#xff09;&#xff0c;本次将其部署再虚拟服务器中。 环境&#xf…

MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control&#xff0c;多版本并发控制。指维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个…