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

news2024/11/23 19:29:28

文章目录

  • 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结果并保存上一次迭代结果至x0
    float* 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结果并保存上一次迭代结果至x0
    float* 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++;   //迭代次数加1

        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;

    // 打印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.coloradmin.cn/o/1876831.html

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

相关文章

Textual Learning2 -- 使用时的小问题

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

【JVM-01】引言

【JVM-01】引言 1. 什么是JVM&#xff1f;2. JDK、JRE、JVM比较3.常用的JVM有那些4.学习路线 1. 什么是JVM&#xff1f; JVM即 Java Virtual Machine(Java虚拟机)&#xff0c;是Java程序运行的环境(Java 二进制字节码运行环境)。 好处&#xff1a; 一次编写&#xff0c;到处…

Java基础(五)——ArrayList

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

构建现代医疗:互联网医院系统源码与电子处方小程序开发教学

本篇文章&#xff0c;笔者将探讨互联网医院系统的源码结构和电子处方小程序的开发&#xff0c;帮助读者更好地理解和掌握这些前沿技术。 一、互联网医院系统源码结构 互联网医院系统通常由多个模块组成&#xff0c;每个模块负责不同的功能。以下是一个典型的互联网医院系统的主…

高精密机械设备中滚珠导轨的表面处理工艺有哪些?

滚珠导轨是机床传动和定位的传动元件&#xff0c;其表面处理方式对机床性能和使用寿命起着决定性的作用&#xff0c;不同的表面处理方法可以提高导轨的耐磨性、抗腐蚀性和整体性能。那么&#xff0c;滚珠导轨的表面处理方式有哪几种呢&#xff1f; 1、磨削法&#xff1a;磨削技…

myCrayon个人博客项目基于springBoot+Vue全栈开发

目录 项目介绍 简介 项目架构 项目模块组成 数据库设计 项目展示 首页 用户登录与注册 个人信息模块 商城展示 博客模块 博客浏览 博客发布与编辑 博客搜索 社区模块 新闻模块 后台管理系统 部署方式 结语 项目介绍 简介 项目类似于CSDN&#xff0c;支持所…

MyBatis Plus条件构造器使用

1Wrapper&#xff1a; 条件构造抽象类&#xff0c;最顶端父类 1.1 AbstractWrapper&#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 1.2 QueryWrapper&#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 1.3 UpdateWrapper&#xff1a; Update…

AVL树模拟

1.概念 虽然二叉搜索树可以缩短查找的效率&#xff0c;但如果数据有序或者接近有序时二叉搜索树树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。AVL 树是具有一下性质的二叉搜索树&#xff1a; 1.它的左右子树都是AVL树 2.左右子…

[Go 微服务] Kratos 使用的简单总结

文章目录 1.Kratos 简介2.传输协议3.日志4.错误处理5.配置管理6.wire 1.Kratos 简介 Kratos并不绑定于特定的基础设施&#xff0c;不限定于某种注册中心&#xff0c;或数据库ORM等&#xff0c;所以您可以十分轻松地将任意库集成进项目里&#xff0c;与Kratos共同运作。 API -&…

《mysql篇》--查询(进阶)

目录 将查询结果作为插入数据 聚合查询 聚合函数 count sum group by子句 having 联合查询 笛卡尔积 多表查询 join..on实现多表查询 内连接 外连接 自连接 子查询 合并查询 将查询结果作为插入数据 Insert into 表2 select * from 表1//将表1的查询数据插入…

【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程

目录 0 引言1 多人游戏会话1.1 Why&#xff1f;为什么要有这个1.2 How&#xff1f;怎么使用&#xff1f; 2 加入游戏会话的流程总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE 网络】在网络…

爬坑之 [‘NODE_ENV‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。]

在package.json中配置如下&#xff1a; 执行npm run dev启动 报错&#xff1a; 实际上, NODE_ENVdevelopment webpack-dev-server 这条脚本会合并为两条命令执行&#xff0c; 分别为&#xff1a; NODE_EVNdevelopment webpack-dev-server 这种写法在cmd中是不被支持的 解决…

Bootstrap更改默认的“请在电子邮件地址中包含@”

摘要&#xff1a; 今天开发一个外贸系统&#xff0c;必须全部英文的&#xff0c;但是使用到bootatrp 4的input标签的type"email"输入没有含“”符号时会提示&#xff1a;“请在电子邮件地址中包含”中文提示&#xff01;一开始以为是中国下载的谷歌是浏览器自带的提示…

计算机网络知识整理笔记

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

停车场智能化管理:车位引导系统实现车位资源优化与数据分析

随着城市汽车保有量的不断增长&#xff0c;停车难问题日益凸显。尤其是在高峰时段&#xff0c;寻找停车位和取车成为了许多车主的头疼问题。为了解决这一难题&#xff0c;维小帮智能车位引导系统应运而生&#xff0c;它利用先进的技术手段&#xff0c;帮助车主快速找到停车位&a…

【计算机图形学】期末考试知识点汇总

文章目录 第一章计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法反走样 第…

2024steam夏促商店打不开、steam活动加载不了解决方法一览

今年的夏促终于开始了!目前可以看到很多精品小游戏在促销列表内&#xff0c;活动正式开启后还不知道又会是怎样的一幅场景。因为每年夏促都会有不少刚高考完的新手加入&#xff0c;遇到常见的steam商店打不开、活动页面不加载等问题不知道怎么解决。所以这里给大家准备了几种常…

从零创建深度学习张量库,支持gpu并行与自动微分

多年来&#xff0c;我一直在使用 PyTorch 构建和训练深度学习模型。尽管我已经学会了它的语法和规则&#xff0c;但总有一些东西激起了我的好奇心&#xff1a;这些操作内部发生了什么&#xff1f;这一切是如何运作的&#xff1f; 如果你已经到这里&#xff0c;你可能也有同样的…

mybatis的高级映射

mybatis的高级映射(重点) 表与表之间的关系&#xff1a; 一对一关系&#xff1a; 栗子&#xff1a;一个人对应一个身份证号 一对多关系&#xff1a; 栗子&#xff1a;一个用户可以有多个订单 1. 分析需求&…

权限维持-域环境单机版---粘滞键屏保登录

免责声明;本文仅做技术交流与学习,,, 目录 粘滞键: 粘滞键位置&#xff1a; 屏保&登录: 1、WinLogon配合无文件落地上线 结合ps命令: 2、屏幕保护生效后执行后门 粘滞键: Windows维权之粘滞键项维权-腾讯云开发者社区-腾讯云 (tencent.com) 系统自带的辅助功能进行替…