当前位置: 首页 > news >正文

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

【实验性质】

综合性实验。

【实验目的】

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

【实验内容】

应用雅可比迭代法和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;

    }

}

 

运行结果:

【实验心得】

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

得    分________

 

评阅日期________

教师签名________

相关文章:

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

【实验性质】 综合性实验。 【实验目的】 掌握迭代法求解线性方程组。 【实验内容】 应用雅可比迭代法和Gauss-Sediel迭代法求解下方程组&#xff1a; 【理论基础】 线性方程组的数值解法分直接算法和迭代算法。迭代法将方程组的求解转化为构造一个向量序列&…...

Qt 中基于 QTableView + QSqlTableModel 的分页搜索与数据管理实现

Qt 中基于 QTableView QSqlTableModel 的分页搜索与数据管理实现 一、组件说明 QTableView&#xff1a;一个基于模型的表格视图控件&#xff0c;支持排序、选择、委托自定义。QSqlTableModel&#xff1a;与数据库表直接绑定的模型类&#xff0c;可用于展示和编辑数据库表数据…...

云计算-容器云-服务网格Bookinfo

服务网格&#xff1a;创建 Ingress Gateway 将 Bookinfo 应用部署到 default 命名空间下&#xff0c;请为 Bookinfo 应用创建一个网 关&#xff0c;使外部可以访问 Bookinfo 应用。 上传ServiceMesh.tar.gz包 [rootk8s-master-node1 ~]# tar -zxvf ServiceMesh.tar.gz [rootk…...

PostgreSQL自定义函数

自定义函数 基本语法 //建一个名字为function_name的自定义函数create or replace function function_name() returns data_type as //returns 返回一个data_type数据类型的结果&#xff1b;data_type 是返回的字段的类型&#xff1b;$$ //固定写法......//方法体$$ LANGUAGE …...

学习记录:DAY22

我的重生开发之旅&#xff1a;优化DI容器&#xff0c;git提交规范&#xff0c;AOP处理器&#xff0c;锁与并发安全 前言 我重生了&#xff0c;重生到了五一开始的一天。上一世&#xff0c;我天天摆烂&#xff0c;最后惨遭实习生优化。这一世&#xff0c;我要好好内卷… 今天的…...

HarmonyOS NEXT第一课——HarmonyOS介绍

一、什么是HarmonyOS 万物互联时代应用开发的机遇、挑战和趋势 随着万物互联时代的开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿IoT设备。全新的全场景设备体验&#xff0c;正深入改变消费者的使用习惯。 同时应用开发者也面临设备底座从手机单设备到全场景多设…...

数据库系统概论|第五章:数据库完整性—课程笔记1

前言 在前文介绍完数据库标准语言SQL之后&#xff0c;大家已经基本上掌握了关于数据库编程的基本操作&#xff0c;那我们今天将顺承介绍关于数据库完整性的介绍&#xff0c;数据库的完整性是指数据的正确性和相容性。数据的完整性是为了防止数据库中存在不符合语义的数据&…...

开源无人机地面站QGroundControl安卓界面美化与逻辑优化实战

QGroundControl作为开源无人机地面站软件,其安卓客户端界面美化与逻辑优化是提升用户体验的重要工程。 通过Qt框架的界面重构和代码逻辑优化,可以实现视觉升级与性能提升的双重目标。本文将系统讲解QGC安卓客户端的二次开发全流程,包括开发环境搭建、界面视觉升级、多分辨率…...

工作记录 2017-12-12 + 在IIS下发布wordpress

工作记录 2017-12-12 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 在IIS下发布wordpress。 郝 服务器更新 RD服务器更新了&#xff0c;更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 数据库更新: 数据库没有更新 更新的文件&#xf…...

BBR 之 ProbeRTT 新改

早在 1981 年&#xff0c;Jaffe 在 Flow Control Power is Nondecentralizable 中就给出过论证&#xff0c;测量 maxbw 必然引入队列&#xff0c;而获得 minrtt 时带宽必然欠载&#xff0c;这确定了后面 30 年的拥塞控制算法基调&#xff0c;但 BBR 在 35 年后非常聪明地在两者…...

[创业之路-354]:农业文明到智能纪元:四次工业革命下的人类迁徙与价值重构

农业文明到智能纪元&#xff1a;四次工业革命下的人类迁徙与价值重构 从游牧到定居&#xff0c;从蒸汽轰鸣到算法洪流&#xff0c;人类文明的每一次跨越都伴随着生产关系的剧烈震荡。四次工业革命的浪潮不仅重塑了物质世界的生产方式&#xff0c;更将人类推向了身份认同与存在…...

敏感词 v0.25.0 新特性之 wordCheck 策略支持用户自定义

开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好&#xff0c;我是老马。 敏感词一开始了内置了多种检验策略&#xff0c;但是很多用户在使用的过程中希望可以自定义策略。 所以 v0…...

从0到上线,CodeBuddy 如何帮我快速构建旅游 App?

引言 腾讯云AI代码助手之前就改成了CodeBuddy我相信这也是在为后期做准备。那么这篇文章会对CodeBuddy进行比较详细的介绍&#xff0c;并一起来上手实战&#xff0c;感受一下实际开发中这款插件能带给我们多少的便利。本篇文章是一边写一边进行测试&#xff0c;并不是测试完之…...

微信小程序 自定义组件 标签管理

环境 小程序环境&#xff1a; 微信开发者工具&#xff1a;RC 1.06.2503281 win32-x64 基础运行库&#xff1a;3.8.1 概述 基础功能 标签增删改查&#xff1a;支持添加/删除单个标签、批量删除、重置默认标签 数据展示&#xff1a;通过对话框展示结构化数据并支持复制 动…...

从 Eclipse Papyrus / XText 转向.NET —— SCADE MBD技术的演化

从KPN[1]的萌芽开始&#xff0c;到SCADE的推出[2]&#xff0c;再到Scade 6的技术更迭[3]&#xff0c;SCADE 基于模型的开发技术已经历许多。现在&#xff0c;Scade One 已开启全新的探索 —— 从 Eclipse Papyrus / XText 转向.NET 8跨平台应用。 [1]: KPN, Kahn进程网络 (197…...

【学习笔记】机器学习(Machine Learning) | 第五章(2)| 分类与逻辑回归

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 二、决策边界决策边界的数学表达线性决策边界示例非线性决策边界非线性决策边界的示例…...

python 常用web开发框架及使用示例

Python常用Web开发框架及使用示例 Python拥有丰富的Web开发框架生态系统&#xff0c;以下是主流框架及其使用示例&#xff1a; 一、Flask - 轻量级框架 安装 pip install flask 基础示例 from flask import Flask, request, jsonifyapp Flask(__name__)app.route(/) def…...

[ Qt ] | 第一个Qt程序

1. 创建Qt项目 我们打开Qt Create工具&#xff0c;左上角“文件”&#xff0c;新建文件。 --- --- --- --- 这个是我们的APP“走出国门”的时候&#xff0c;要关注的&#xff0c;这里就不说了。 后面这两个直接默认&#xff0c;下一步就行~~。 2. 项目默认内容 下面就是Qt C…...

react + antd 实现后台管理系统

文章目录 完整路由搭建Layout 和 Aside组件引入 AntdAside组件实现 项目效果图 项目完整代码地址 https://gitee.com/lyh1999/react-back-management 项目完整代码地址 react依赖安装 最好采用yarn 安装 react-router 安装依赖 配置路由 history模式 / // src/router/…...

vue3+ts项目 配置vue-router

安装vue-router pnpm install vue-router配置 1.src/router/index.ts文件下的内容 import type { App } from vue import type { RouteRecordRaw } from vue-router import { createRouter, createWebHistory } from vue-router import remainingRouter from ./modules/remai…...

MySQL基本查询(二)

文章目录 UpdateDelete插入查询结果&#xff08;select insert&#xff09;聚合函数分组聚合统计 Update 1. 语法&#xff1a; set后面加列属性或者表达式 UPDATE table_name SET column expr [, column expr …][WHERE …] [ORDER BY …] [LIMIT …] 案例 将孙悟空同学的…...

MySQL:联合查询

目录 一、笛卡尔积 ​二、内连接 三、外连接 &#xff08;1&#xff09;左外连接 &#xff08;2&#xff09;右外连接 &#xff08;3&#xff09;全外连接 四、自连接 五、子查询 &#xff08;1&#xff09;单行子查询 &#xff08;2&#xff09;多行子查询 &…...

[算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子)

每周五篇博客&#xff1a;&#xff08;3/5&#xff09; 碎碎念 其实不是我想多水一篇博客&#xff0c;本来这篇是欧拉序的博客&#xff0c;结果dfs序也是可以O1求lca的&#xff0c;而且常数更优&#xff0c;结果就变成这样了。。。 前置知识 [算法学习]——dfs序 思想 分…...

复刻低成本机械臂 SO-ARM100 舵机配置篇(WSL)

视频讲解&#xff1a; 复刻低成本机械臂 SO-ARM100 舵机配置篇&#xff08;WSL&#xff09; 飞特舵机 组装之前需要配置舵机的ID&#xff0c;如下的网址为舵机的资料&#xff0c;实际上用不到&#xff0c;但可以mark在这里 Software-深圳飞特模型有限公司 User Guide里面可以…...

聊一聊接口测试更侧重于哪方面的验证

目录 一、功能性验证 输入与输出正确性 参数校验 业务逻辑覆盖 二、数据一致性验证 数据格式规范 数据完整性 数据类型与范围 三、异常场景验证 容错能力测试 边界条件覆盖 错误码与信息清晰度 四、安全与权限验证 身份认证 数据安全 防攻击能力 五、性能与可…...

【网络安全实验】SSL协议的应用

目录 一、SSL协议介绍 2.功能与特点 1&#xff09;数据加密 2&#xff09;身份验证 3&#xff09;数据完整性校验 3.SSL的工作流程&#xff08;握手过程&#xff09; 1&#xff09;客户端问候&#xff08;ClientHello&#xff09; 2&#xff09;服务器响应&#xff08;…...

测试——用例篇

目录 1. 测试用例 1.1 概念 2. 设计测试用例的万能公式 2.1 常规思考逆向思维发散性思维 2.2 万能公式 3. 设计测试用例例的方法 3.1 基于需求的设计方法 ​编辑 3.2 具体的设计方法 3.2.1 等价类 3.2.2 边界值 3.2.3 正交法 3.2.4 判定表法 3.2.5 场景法 3.2.6…...

计算机视觉技术的发展历程

计算机视觉技术的发展历程可以分为以下几个阶段&#xff1a; 早期探索阶段&#xff08;1960s-1980s&#xff09; 1960年代&#xff1a;计算机视觉的概念开始形成&#xff0c;研究者尝试让计算机识别和理解图像&#xff0c;主要集中在基础的图像处理&#xff0c;如边缘检测和特…...

docker 官方:在 alpine 上安装 python 的方法

在 alpine 上安装 python 的方法在 alpine 上安装 python 的方法&#xff1a; # alpine 官方 apk add python3 # docker 官方 docker pull python:3.11-alpine # 第三方 docker run --rm frolvlad/alpine-python3 python3 -c print("Hello World") # 编译安装 略 要点…...

mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件

1. mescroll的uni版本, 是专门用在uni-app的下拉刷新和上拉加载的组件, 支持一套代码编译到iOS、Android、H5、小程序等多个平台 2. mescroll的uni版本, 继承了mescroll.js的实用功能: 自动处理分页, 自动控制无数据, 空布局提示, 回到顶部按钮 .. 3. mescroll的uni版本, 丰富的…...

openEuler 22.03 安装 Mysql 5.7,RPM 在线安装

目录 一、检查系统是否安装其他版本Mariadb数据库二、安装 MySQL三、配置 MySQL四、修改默认存储路径五、开放防火墙端口六、数据备份七、生产环境优化八、常用命令 一、检查系统是否安装其他版本Mariadb数据库 # 查看已安装的 Mariadb 数据库版本 [rootopeneuler ~]# rpm -qa…...

云原生后端架构的挑战与应对策略

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 随着云计算、容器化以及微服务等技术的快速发展,云原生架构已经成为现代软件开发和运维的主流趋势。企业通过构建云原生后端系统,能够实现灵活的资源管理、快速的应用迭代和高效的系统扩展。然而,尽管云原…...

第十六届蓝桥杯 2025 C/C++组 客流量上限

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 打表找规律&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 得到答案的方式&#xff1a; 按计算器&#xff1a; 暴力求解代码&#xff1a; 快速幂代码&#xff1a; 位运…...

LeetCode算法题 (移除链表元素)Day15!!!C/C++

https://leetcode.cn/problems/remove-linked-list-elements/description/ 一、题目分析 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 今天的题目非常好理解&#xff0c;也就是要删除…...

stm32 HAI库 SPI(一)原理

基本特点 通信方式&#xff1a;同步、串行&#xff08;串行、并行、并发&#xff0c;别再傻傻分不清了&#xff01;_串行和并行的区别-CSDN博客&#xff09;、全双工 &#xff08;也可以选择半双工&#xff09;速率&#xff1a;50MHZ以下数据格式&#xff1a;8位/16位传输顺序…...

仿腾讯会议——主界面设计创建房间加入房间客户端实现

1、实现腾讯会议主界面 2、添加Qt类WeChatDialog 3、定义创建会议和加入会议的函数 4、实现显示名字、头像的函数 调用函数 5、在中间者类中绑定函数 6、实现创建房间的槽函数 7、实现加入房间的槽函数 8、设置界面标题 9、服务器定义创建和进入房间函数 10、服务器实现创建房间…...

在pycharm profession 2020.3上安装使用xlwings

之前写了一篇文章在win7和python3.8上安装xlwings-CSDN博客 今天安装了pycharm profession 2020.3&#xff0c;自带Terminal&#xff0c;所以试一下安装xlwings。 一、新建一个python项目 二、安装xlwings 三、输入安装命令 pip3.exe install -i https://pypi.tuna.tsinghu…...

Mybatis学习笔记

介绍 MyBatis 是一款优秀的持久层开发框架&#xff0c;它在 Java 开发中被广泛应用&#xff0c;以下是对它的详细介绍&#xff1a; 概述 MyBatis 最初是 Apache 的一个开源项目 iBatis&#xff0c;2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code&#…...

「Mac畅玩AIGC与多模态13」开发篇09 - 基于多插件协同开发智能体应用(天气+名言查询助手)

一、概述 本篇介绍如何在 macOS 环境下,同时接入多个自定义 OpenAPI 插件,实现智能体根据用户请求自动分析,调用天气查询或名言查询服务,完成多功能协同应用开发。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问可正常访问外部 API 服务2. 准备天…...

C++--入门基础

C入门基础 1. C的第一个程序 C继承C语言许多大多数的语法&#xff0c;所以以C语言实现的hello world也可以运行&#xff0c;C中需要把文件定义为.cpp&#xff0c;vs编译器看是.cpp就会调用C编译器编译&#xff0c;linux下要用g编译&#xff0c;不再是gcc。 // test.cpp #inc…...

Ubuntu环境下如何管理系统中的用户:创建用户、删除用户、修改密码、切换用户、用户组管理

管理用户的操作需要root权限&#xff0c;在执行命令时需要加sudo&#xff0c;关于sudo命令可以看这篇&#xff1a;Linux_sudo命令的使用与机制 1、添加用户 使用命令&#xff1a; adduser 用户名&#xff0c;主要是按提示输入密码和用户信息&#xff08;可直接回车使用默认配置…...

广告事件聚合系统设计

需求背景 广告事件需要进行统计&#xff0c;计费&#xff0c;分析等。所以我们需要由数据接入&#xff0c;数据处理&#xff0c;数据存储&#xff0c;数据查询等多个服务模块去支持我们的广告系统 规模上 10000 0000个点击&#xff08;10000 00000 / 100k 1wQPS&#xff09; …...

PDF智能解析与知识挖掘:基于pdfminer.six的全栈实现

前言 在数字化信息爆炸的时代&#xff0c;PDF&#xff08;便携式文档格式&#xff09;作为一种通用的电子文档标准&#xff0c;承载着海量的结构化与非结构化知识。然而&#xff0c;PDF格式的设计初衷是用于展示而非数据提取&#xff0c;这使得从PDF中挖掘有价值的信息成为数据…...

VGG网络模型

VGG网络模型 诞生背景 VGGNet是牛津大学计算机视觉组核谷歌DeepMind一起研究出来的深度卷积神经网络。VGG是一种被广泛使用的卷积神经网络结构&#xff0c;其在2014年的ImageNet大规模视觉识别挑战中获得亚军。 通常所说的VGG是指VGG-16(13层卷积层3层全连接层)。具有规律的…...

开闭原则与依赖倒置原则区别:原类不变,新增类(功能)vs 接口类不变,原实现类可变

好&#xff0c;我来用最通俗的方式&#xff0c;用角色扮演 场景对话&#xff0c;不讲术语&#xff0c;让你彻底明白「依赖倒置原则」和「开闭原则」的区别。 &#x1f3ad; 场景&#xff1a;你是老板&#xff08;高层&#xff09;&#xff0c;你要雇人做事 一、【依赖倒置原则…...

【AI面试准备】Azure DevOps沙箱实验全流程详解

介绍动手实验&#xff1a;通过 Azure DevOps 沙箱环境实操&#xff0c;体验从代码提交到测试筛选的全流程。如何快速掌握&#xff0c;以及在实际工作中如何运用。 通过 Azure DevOps 沙箱环境进行动手实验&#xff0c;是快速掌握 DevOps 全流程&#xff08;从代码提交到测试筛选…...

大数据面试问答-数据湖

1. 概念 数据湖&#xff08;Data Lake&#xff09;&#xff1a; 以原始格式&#xff08;如Parquet、JSON等&#xff09;存储海量原始数据的存储库&#xff0c;支持结构化、半结构化和非结构化数据&#xff08;如文本、图像&#xff09;。采用Schema-on-Read模式&#xff0c;数…...

驱动开发系列56 - Linux Graphics QXL显卡驱动代码分析(三)显示模式设置

一:概述 如之前介绍,在qxl_pci_probe 中会调用 qxl_modeset_init 来初始化屏幕分辨率和刷新率,本文详细看下 qxl_modeset_init 的实现过程。即QXL设备的显示模式设置,是如何配置CRTC,Encoder,Connector 的以及创建和更新帧缓冲区的。 二:qxl_modeset_init 分析 in…...

沥青路面裂缝的目标检测与图像分类任务

文章题目是《A grid‐based classification and box‐based detection fusion model for asphalt pavement crack》 于2023年发表在《Computer‐Aided Civil and Infrastructure Engineering》 论文采用了一种基于网格分类和基于框的检测&#xff08;GCBD&#xff09;&#xff…...

单片机-STM32部分:0、学习资料汇总

飞书文档https://x509p6c8to.feishu.cn/wiki/Kv7VwjDD8idFWKkMj4acZA3lneZ 一、软件部分 STM32F1系列资料官网下载地址 https://www.stmcu.com.cn/Designresource/list/STM32F1/document/document STM32官方数据手册 有哪些版本&#xff0c;哪些资源&#xff0c;对应哪些IO…...