计算方法实验四 解线性方程组的间接方法

【实验性质】

综合性实验。

【实验目的】

掌握迭代法求解线性方程组。 

【实验内容】

应用雅可比迭代法和Gauss-Sediel迭代法求解下方程组:

【理论基础】

线性方程组的数值解法分直接算法和迭代算法。迭代法将方程组的求解转化为构造一个向量序列,如果该向量序列存在极限,其极限就是方程组的解。

迭代法程序简单,但有时工作量较大,在有限步内,得不到精确解,适宜系数矩阵阶数较高的问题。

构造关于解向量的迭代序列,的常见方法有Jacobi迭代和Gauss-Seidel加速迭代。

设:

统一的迭代公式为:

−1

对于雅可比迭代,矩阵;对于高斯-赛德尔迭代,G = −(𝐷+L) 𝑈,f =(𝐷+L)−1𝑏。

实际的计算与编程应尽量避免矩阵求逆、矩阵相乘等运算,而使用如下公式:

【实验过程】

取三个不同初值,分别用雅可比法和高斯-塞得尔法求解,用表格记载求解过程,并分析迭代初值、迭代公式对迭代的影响。

附表:

 

雅可比法

高斯-塞得尔法

 

初值

近似根

迭代次数

近似根

迭代次数

1

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

代码:

主函数:

//实验四

#include <iostream>

#include <windows.h>

#include "colvector.h"

#include "matrix.h"

#include <windows.h>

#include "linearequations.h"

using namespace std;

int main()

{

    double a1[]={8,7,0,0,6,12,5,0,0,4,9,3,0,0,1,2};

    double b1[]={0,-2,8,6};

    double x1[]={0,0,0,0};

    double e=0.0001;

    int flag=1,max=100;

    Matrix A(4,4);

    ColVector b(4),x(4),x0(4);

    A.initMatrix(a1);

    b.initMatrix(b1);

    x0.initMatrix(x1);

    LinearEquations obj;

    obj.JacobiIterativeMethod(A,b,e,x0,max,flag,x);

    cout<<x<<endl;

    return 0;

}

头文件:

#ifndef LINEAREQUATIONS_H
#define LINEAREQUATIONS_H
#include "matrix.h"
#include "colvector.h"
#include  <math.h>
class LinearEquations
{
public:
    void GaussElimin(Matrix A,ColVector b,int &flag,ColVector &x);
    void colPivotGaussElimin(Matrix A,ColVector b,int &flag,ColVector &x);
    void LUDecomposition(Matrix &mat,int &flag,Matrix &L,Matrix &U,int type=1);
    void TrigDecompositionMethod(Matrix &A,ColVector &b,int &flag,ColVector &x,int type=1);
    void Catchup(ColVector&a,ColVector &b,ColVector &c,ColVector &f,int &flag,ColVector &x,int type=1);
    LinearEquations();
    //雅可比迭代
    void JacobiIterativeMethod(Matrix &A,ColVector &b,double e,ColVector &x0,int MAX, int &flag,ColVector &x);
    //高斯-赛德尔迭代
    void Gauss_SeidelIterativeMethod(Matrix &A,ColVector &b,double e,ColVector &x0,int MAX, int &flag,ColVector &x);
 
};
#endif // LINEAREQUATIONS_H
 

源文件:

#include "linearequations.h"

LinearEquations::LinearEquations()

{

}

 void LinearEquations::GaussElimin(Matrix A,ColVector b,int &flag,ColVector &x)

 {

      flag=1;

      int n=A.getRowSize();

      if(n!=A.getColSize() || n!=b.getRowSize())

      {

          flag =0;

          return;

      }

      cout<<"初始曾广矩阵"<<Matrix::merge(A,b)<<endl;

     for(int k=1;k<=n-1;k++)

     {

         for(int i=k+1;i<=n;i++)

         {

             if(A(k,k)==0)

             {

                 flag =0;

                 return;

             }

             double m=A(i,k)/A(k,k);

             for(int j=1;j<=n;j++)

             {

                 A(i,j)=A(i,j)-m*A(k,j);

             }

             b[i]=b[i]-m*b[k];

         }

         cout<<"第"<<k<<"次消元"<<Matrix::merge(A,b)<<endl;

     }

     cout<<" x"<<endl;

     x=ColVector(n);

     if(A(n,n)==0)

     {

         flag=0;

         return;

     }

     x[n]=b[n]/A(n,n);

     cout<<x<<endl;

     for(int i=n-1;i>=1;i--)

     {

         double sum=0;

         for(int j=i+1;j<=n;j++)

         {

             sum+=A(i,j)*x[j];

         }

         x[i]=(b[i]-sum)/A(i,i);

         cout<<" x"<<endl;

         cout<<x<<endl;

     }

 }

void LinearEquations::colPivotGaussElimin(Matrix A,ColVector b,int &flag,ColVector &x)

{

    flag=1;

    int n=A.getRowSize();

    if(n!=A.getColSize() || n!=b.getRowSize())

    {

        flag =0;

        return;

    }

    cout<<"初始曾广矩阵"<<Matrix::merge(A,b)<<endl;

   for(int k=1;k<=n-1;k++)

   {

       double max=fabs(A(k,k));

       int p=k;

       for(int w=k+1;w<=n;w++)

       {

           if(max< fabs(A(w,k))){

               max=fabs(A(w,k));

               p=w;

           }

       }

       if(max==0){

           flag=0;

           return;

       }

       if(p!=k){

           double temp=0;

           for(int s=1;s<=n;s++)

           {

               temp =A(k,s);

               A(k,s)=A(p,s);

               A(p,s)=temp;

           }

           temp=b[k];

           b[k]=b[p];

           b[p]=temp;

       }

       for(int i=k+1;i<=n;i++)

       {

           if(A(k,k)==0)

           {

               flag =0;

               return;

           }

           double m=A(i,k)/A(k,k);

           for(int j=1;j<=n;j++)

           {

               A(i,j)=A(i,j)-m*A(k,j);

           }

           b[i]=b[i]-m*b[k];

       }

       cout<<"第"<<k<<"次消元"<<Matrix::merge(A,b)<<endl;

   }

  cout<<" x"<<endl;

   x=ColVector(n);

   if(A(n,n)==0)

   {

       flag=0;

       return;

   }

   x[n]=b[n]/A(n,n);

   cout<<x<<endl;

   for(int i=n-1;i>=1;i--)

   {

       double sum=0;

       for(int j=i+1;j<=n;j++)

       {

           sum+=A(i,j)*x[j];

       }

       x[i]=(b[i]-sum)/A(i,i);

       cout<<" x"<<endl;

       cout<<x<<endl;

   }

}

void LinearEquations::LUDecomposition(Matrix &mat,int &flag,Matrix &L,Matrix &U,int type)

{

    flag=0;

    int n=mat.getRowSize();

    if(n!=mat.getColSize()||type<1||type>2){

        flag=-1;

        return;

    }

    L=Matrix(n,n);

    U=Matrix(n,n);

    switch(type){

    case 1:

        for(int i=1;i<+n;i++){

        U(1,i)=mat(1,i);

        }

        for(int i=1;i<=n;i++){

        L(i,1)=mat(i,1)/U(1,1);

        }

        for(int k=2;k<=n;k++)

        {

            for(int j=k;j<=n;j++){

                double sum=0;

                for(int r=1;r<=k-1;r++){

                sum+=L(k,r)*U(r,j);

                }

                   U(k,j)=mat(k,j)-sum;

            }

            for(int i=k;i<=n;i++){

            double sum=0;

            for(int r=1;r<=k-1;r++){

            sum+=L(i,r)*U(r,k);

            }

            L(i,k)=(mat(i,k)-sum)/U(k,k);

            }

        }

        break;

    case 2:

        for(int k=1;k<=n;k++)

        {

            for(int j=k;j<=n;j++)

            {

                double sum=0;

                if(k>1){

                    for(int r=1;r<=k-1;r++){

                        sum+=L(j,r)*U(r,k);

                    }

                }

                L(j,k)=mat(j,k)-sum;

            }

            for(int j=k;j<=n;j++)

            {

                if(L(k,k)==0){

                    flag=0;

                    return ;

                }

                double sum=0;

                if(k>1)

                {

                    for(int r=1;r<=k-1;r++){

                        sum+=L(k,r)+U(r,j);

                    }

                }

                U(k,j)=(mat(k,j)-sum)/L(k,k);

            }

        }

     break;

 }

}

void LinearEquations::TrigDecompositionMethod(Matrix &A,ColVector &b,int &flag,ColVector &x,int type)

{

    flag =1;

    int n=A.getRowSize();

    if(n!=A.getColSize()||n!=b.getRowSize()||type<1||type>2)

    {

        flag=0;

        return;

    }

    Matrix L,U;

    ColVector y(n);

    x=ColVector(n);

    switch(type){

    case 1:

        LUDecomposition(A,flag,L,U);

        if(flag== -1)

        {

            return;

        }

        y[1]=b[1];

        for(int i=2;i<=n;i++)

        {

            double sum=0;

            for(int k=1;k<=i-1;k++)

            {

                sum+=L(i,k)*y[k];

            }

            y[i]=b[i]-sum;

        }

        cout<<"y="<<y<<endl;

        if(U(n,n)==0)

        {

            flag=0;

            return;

        }

        x[n]=y[n]/U(n,n);

        for(int i=n-1;i>=1;i--)

        {

            if(U(i,i)==0){

            flag=0;

            return;

    }

            double sum=0;

            for(int k=i+1;k<=n;k++)

        {

            sum+=U(i,k)*x[k];

       }

           x[i]=(y[i]-sum)/U(i,i);

    }

break;

    case 2:

        LUDecomposition(A,flag,L,U);

        if(flag<1)

        {

            return;

        }

        if(L(1,1)==0)

        {

            flag=0;

            return;

        }

        y[1]=b[1]/L(1,1);

        for(int i=2;i<=n;i++)

        {

            if(L(i,i)<=0){

                flag=0;

                return;

            }

            double sum=0;

            for(int k=1;k<=i-1;k++)

            {

                sum+=L(i,k)*y[k];

            }

            y[i]=(b[i]-sum)/L(i,i);

        }

        x[n]=y[n];

        for(int i=n-1;i>=1;i--)

        {

            double sum=0;

            for(int k=i+1;k<=n;k++)

        {

            sum+=U(i,k)*x[k];

       }

           x[i]=y[i]-sum;

    }

 break;

}

}

void LinearEquations::Catchup(ColVector&a,ColVector &b,ColVector &c,ColVector &f,int &flag,ColVector &x,int type)

{

    flag=1;

    int n=b.getRowSize();

    if(n!=a.getRowSize()||n!=b.getRowSize()||n!=f.getRowSize())

    {

        flag=0;

        return;

    }

    if(fabs(b[1])<=fabs(c[1])||fabs(b[n])<=fabs(a[n])||b[1]*c[1]==0||a[n]*b[n]==0)

    {

        flag=0;

        return;

    }

    for(int i=2;i<=n-1;i++)

        if(fabs(b[i])<fabs(a[i])+fabs(c[i])||a[i]*c[i]==0)

        {

            flag=0;

            return;

        }

    ColVector d(n),u(n),y(n),l(n);

    x=ColVector (n);

    switch(type){

    case 1:

        d=c;

        u[1]=b[1];

        for(int i=2;i<=n;i++)

        {

            l[i]=a[i]/u[i-1];

            u[i]=b[i]-l[i]*c[i-1];

        }

        y[1]=f[1];

        for(int i=2;i<=n;i++)

        {

            y[i]=f[i]-l[i]*y[i-1];

        }

         x[n]=y[n]/u[n];

         for(int i=n-1;i>=1;i--)

         {

           x[i]=(y[i]-c[i]*x[i+1])/u[i];

         }

        break;

    case 2:

        l[1]=b[1];

        for(int i=1;i<=n-1;i++)

        {

            u[i]=c[i]/l[i];

            l[i+1]=b[i+1]-a[i+1]*u[i];

        }

        y[1]=f[1]/l[1];

        for(int i=2;i<=n;i++)

        {

            y[i]=(f[i]-a[i]*y[i-1])/l[i];

        }

        x[n]=y[n];

        for(int i=n-1;i>=1;i--)

        {

          x[i]=y[i]-u[i]*x[i+1];

        }

        break;

    }

}

void LinearEquations::JacobiIterativeMethod(Matrix &A,ColVector &b,

                                            double e,ColVector &x0,int MAX, int &flag,ColVector &x){

    flag =1;

    int n=A.getRowSize();

    if(n!=b.getRowSize()||n!=A.getColSize()||n!=x0.getRowSize())

    {

        flag=0;

        return;

    }

    for(int i=1;i<=n;i++){

        if(A(i,i)==0){

            flag=0;

            return ;

        }

    }

    double eps=0;

    int k=0;

    int sum=0;

    int i,j;

    ColVector x1(n);

    ColVector dist(n);

    while(k<MAX){

        for(i=1;i<=n;i++){

            double sum=0;

            for(j=1;j<=n;j++){

                if(j==1){

                    continue;

                }

                sum+=A(i,j)*x0[j];

            }

            x1[i]=(b[i]-sum)/A(i,i);

        }

        k++;

        dist=x1-x0;

        eps=dist.norm(3);

        cout<<endl;

        cout<<"k="<<k<<"\nx1="<<x1<<"x0="<<x0<<endl;

        cout<<"dist="<<dist<<endl;

        cout<<"eps="<<eps<<endl;

        if(eps<=e){

            break;

        }

        else{

            x0=x1;

        }

    }

    if(k==MAX){

        flag=0;

        return;

    }

    else{

        x=x1;

    }

}

void LinearEquations::Gauss_SeidelIterativeMethod(Matrix &A,ColVector &b,double e,

                                                  ColVector &x0,int MAX, int &flag,ColVector &x){

    flag =1;

    int n=A.getRowSize();

    if(n!=b.getRowSize()||n!=A.getColSize()||n!=x0.getRowSize())

    {

        flag=0;

        return;

    }

    for(int i=1;i<=n;i++){

        if(A(i,i)==0){

            flag=0;

            return ;

        }

    }

    double eps=0;

    int k=0;

    ColVector x1(n);

    ColVector dist(n);

    while(k<MAX){

        for(int i=1;i<=n;i++){

            double sum=0;

            for(int j=1;j<=n;j++){

                if(j<i){

                    sum+=A(i,j)*x1[j];

                }

                else if(j==i){

                    continue;

                }

                else{

                    sum+=A(i,j)*x0[j];

                }

            }

            x1[i]=(b[i]-sum)/A(i,i);

        }

        k++;

        dist=x1-x0;

        eps=dist.norm(3);

        cout<<"k="<<k<<"\nx1="<<x1<<"x0="<<x0<<endl;

        cout<<"dist="<<dist<<endl;

        cout<<"eps="<<eps<<endl;

        if(eps<=e){

            break;

        }

        else{

            x0=x1;

        }

    }

    if(k==MAX){

        flag=0;

        return;

    }

    else{

        x=x1;

    }

}

 

运行结果:

【实验心得】

我在实验中使用了间接方法解线性方程组,获得了一些心得。首先,我发现使用间接方法可以简化计算过程,特别适用于方程组较大的情况。通过将方程组转化为矩阵形式,并利用矩阵的运算性质来求解,可以大大减少计算量。其次,我注意到间接方法的精度较高,能够得到比较准确的解。与直接方法相比,间接方法不容易出现舍入误差,因为矩阵运算过程中的舍入误差可以通过精确的结果进行修正。此外,我发现间接方法还可以应用于其他数学问题的求解中,例如线性最小二乘问题等。总体来说,间接方法是一种简单高效、精度较高的解线性方程组的方法,对于数学问题的求解也具有一定的推广价值。通过这次实验,我不仅学到了解线性方程组的间接方法,还深入了解了矩阵运算的原理和应用,对数学问题的求解能力也有了一定的提升。

得    分________

 

评阅日期________

教师签名________

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

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

相关文章

G919-GAS软件 JSON格式数据通讯协议-阵列数据解析

G919-GAS软件 JSON格式数据通讯协议-阵列数据解析 版本记录 DateAuthorVersionNote2024.04.07Dog TaoV1.0发布通讯协议。2025.05.06Dog TaoV1.11. 增加了【高速采样】模式下的通讯协议。2. 增加了“软件开发建议”小节。 文章目录 G919-GAS软件 JSON格式数据通讯协议-阵列数据…

TCGA数据库临床亚型可用!贝叶斯聚类+特征网络分析,这篇 NC 提供的方法可以快速用起来了!

生信碱移 贝叶斯网络聚类 CANclust是一种基于贝叶斯的聚类方法&#xff0c;系统性地对基因突变、细胞遗传学信息和临床指标进行联合建模&#xff0c;用于多种模态数据的联合聚类分析&#xff0c;并识别在患者群体中反复出现的特征模式。 个体的遗传与环境背景决定其应对疾病的…

【算法】随机快速排序和随机选择算法

文章目录 1、随机快速排序1.1 什么是随机快排1.2 随机快排的好处 2、随机选择算法 前言&#xff1a; 快速排序就是每次划分前&#xff0c;通过一种方法将一个基准值的位置确定好&#xff0c;再进入不同的部分重复相同的工作以此确定好每个值的位置以达到有序。如果你之前并不了…

网络技术基础,NAT,桥接,交换机,路由器

什么是NAT Network Address Translation&#xff08;网络地址转换&#xff09;&#xff0c;它负责将目标IP或源IP进行了改变&#xff0c;相当于一个中间代理&#xff0c;我们家庭常用的路由器就是一个NAT设备&#xff0c;NAT是为了解决IPv4的IP地址快要耗尽的问题&#xff0c;…

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证&#xff1a; 关键点是&#xff1a;在真实的网络环境中&a…

【Ansible自动化运维实战:从Playbook到负载均衡指南】

本文是「VagrantVirtualBox虚拟化环境搭建」的续篇&#xff0c;深入探索Ansible在自动化运维中的核心应用&#xff1a; ✅ Ansible核心技能&#xff1a;Playbook编写、角色&#xff08;Roles&#xff09;模块化、标签&#xff08;Tags&#xff09;精准控制 ✅ 实战场景覆盖&a…

基于STM32、HAL库的STC31-C-R3气体传感器驱动程序设计

一、简介: STC31-C-R3是Sensirion公司推出的一款基于CMOSens技术的CO2传感器,具有以下特点: 测量范围:0-100%体积浓度 I2C数字接口 低功耗设计 高精度和长期稳定性 小尺寸封装(5mm x 5mm) 二、硬件接口: STC31-C-R3 STM32L4xx ---------------------------- VDD (P…

Nginx篇之限制公网IP访问特定接口url实操

一、nginx配置限制IP访问 要在 Nginx 配置中添加 IP 限制&#xff0c;阻止来自指定公网 IP 地址段的访问&#xff0c;并且只对特定路径进行限制&#xff0c;可以在 location 配置中使用 deny 和 allow 指令来控制访问。 二、案例 1. 需求 对来自特定公网的地址段&#xff0…

算法研习:无重复字符的最长子串问题剖析

算法研习:无重复字符的最长子串问题剖析 一、引言 在算法的广袤天地中,字符串相关问题一直是备受关注的焦点。“无重复字符的最长子串”这一问题,不仅在面试中频繁出现,更是对算法思维和编程技巧的一次深度考验。它要求我们从给定字符串中找出不含有重复字符的最长子串的长…

Spring Cloud Gateway路由+断言+过滤

目录 介绍核心功能三大核心Route以服务名动态获取URLPredicate常用断言Path Route PredicateAfter Route PredicateBefore Route PredicateBetween Route PredicateCookie Route PredicateHeader Route PredicateHost Route PredicateQuery Route PredicateRemoteAddr Route Pr…

springboot集成langchain4j记忆对话

流式输出 LLM 一次生成一个标记&#xff08;token&#xff09;&#xff0c;因此许多 LLM 提供商提供了一种方式&#xff0c;可以逐个标记地流式传输响应&#xff0c;而不是等待整个文本生成完毕。 这显著改善了用户体验&#xff0c;因为用户不需要等待未知的时间&#xff0c;几…

【SpringCloud GateWay】Connection prematurely closed BEFORE response 报错分析与解决方案

一、背景 今天业务方调用我们的网关服务报错: Connection prematurely closed BEFORE response二、原因分析 三、解决方案 第一步: 增加 SCG 服务的JVM启动参数,调整连接获取策略。 将连接池获取策略由默认的 FIFO&#xff08;先进先出&#xff09;变更为 LIFO&#xff08…

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第十一讲)

这一期讲解lvgl中下拉框的基础使用&#xff0c;下拉列表允许用户从选项列表中选择一个值&#xff0c;下拉列表的选项表默认是关闭的&#xff0c;其中的选项可以是单个值或预定义文本。 当单击下拉列表后&#xff0c;其将创建一个列表&#xff0c;用户可以从中选择一个选项。 当…

【神经网络与深度学习】VAE 在解码前进行重参数化

在 VAE 中&#xff0c;解码之前进行重参数化主要有以下几个重要原因&#xff1a; 可微分性 在深度学习里&#xff0c;模型是通过反向传播算法来学习的&#xff0c;而这需要计算梯度。若直接从潜在变量的分布 (q_{\theta}(z|x))&#xff08;由编码器输出的均值 (\mu) 和方差 (…

BBDM学习笔记

1. configs 1.1 LBBDM: Latent BBDM [readme]

mysql主从复制搭建,并基于‌Keepalived + VIP实现高可用

以下是基于 ‌Keepalived VIP‌ 实现 MySQL 主从复制高可用的详细步骤&#xff0c;涵盖主从复制搭建与故障自动切换&#xff1a; 一、MySQL 主从复制搭建&#xff08;基础步骤回顾&#xff09; 1. ‌主库&#xff08;Master&#xff09;配置‌ 修改配置文件‌ /etc/my.cnf&…

CD36.【C++ Dev】STL库的string的使用 (下)

目录 1.reserve函数(不是reverse) 代码示例 2.resize 代码示例 3.reserve和resize的区别 4.shrink_to_fit 代码示例 5.与C语言的配合的接口函数: c_str 代码示例 6.rfind 知识回顾:find函数 rfind 代码示例 练习题: 字符串最后一个单词的长度 代码 提交结果 ​…

STM32的网络天气时钟项目

一、项目概述与硬件架构 1.1 核心功能 本智能天气时钟系统集成了实时天气获取、网络时间同步、环境监测和低功耗管理四大核心功能&#xff1a; 网络数据获取&#xff1a; 通过ESP8266 WiFi模块连接心知天气API&#xff08;每小时更新&#xff09;获取北京标准时间服务器的时…

FPGA DDR4多通道管理控制器设计

DDR4控制器一般采用自带的MIG控制器&#xff0c;用户控制主要是基于MIG IP核进行设计 实际工程项目中可能只挂载了一组DDR&#xff0c;但是用户数据可能有很多种&#xff0c;用户通过给每种数据划分特定地址进行存储&#xff0c;如何实现灵活管理成为设计的关键 为了方便后端数…

低代码 x AI,解锁数智化应用的创新引擎

AI 智能体开发指南 随着全球信息化浪潮的持续推进&#xff0c;数字化、智能化转型已成为企业发展的必经之路。在这个变革的时代&#xff0c;企业面临着前所未有的挑战与机遇。一方面&#xff0c;市场环境瞬息万变&#xff0c;企业需要快速响应并调整业务模式&#xff1b;另一方…