精华内容
下载资源
问答
  • 文章目录0. 软件的生命周期1. 瀑布模型2. 螺旋模型3. 迭代模型4. 增量模型5....  瀑布模型是最早出现的软件开发模型,是所有其他软件开发模型的基础框架。与软件的生命周期不同的是,它缺少了软...

    0. 软件的生命周期

      软件的生命周期是指从软件产品的设想开始到软件不在使用而结束的时间。
      软件的生命周期分为6个阶段,即需求分析、计划、设计、编码、测试、运行维护

    1. 瀑布模型

    在这里插入图片描述
      瀑布模型是最早出现的软件开发模型,是所有其他软件开发模型的基础框架。与软件的生命周期不同的是,它缺少了软件运行维护阶段。
    描述: 每个阶段都只执行一次,因此是线性顺序的软件开发模型。
      正是由于每个阶段只执行一次,所以前面的需求分析和设计尤为重要。
    优点:

    1. 为项目提供了按阶段划分的检查点,强调开发的阶段性。
    2. 强调早期的计划及需求调查。
    3. 强调产品测试。

    缺点:

    1. 在各个阶段之间极少有反馈。
    2. 只有在项目周期的后期才能看到结果,所以风险往往至后期的测试阶段才显露,因此失去了及早的纠正过程。
    3. 单一流程,开发中的经验教训不能反馈应用于本产品的过程。

    适用项目: 需求比较明确且变更很少的项目。

    2. 螺旋模型

    一般在软件开发初期阶段需求不是很明确时,采用渐进式的开发模型。螺旋模型是渐进式开发模型的代表之一。
    在这里插入图片描述
    描述: 以原型为基础沿螺线旋转、每转一圈都经过计划/风险分析/实施/评估等过程且得到相应新版本、经过若干次螺旋上升得到最终版本。
    螺旋模型沿着螺旋线进行若干次迭代,图中的四个象限代表了一下活动:
    (1)制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
    (2)风险分析:分析评估所选方案,考虑如何识别和清楚风险;
    (3)实施工程:实施软件开发和验证;
    (4)客户评估:评价开发工作,提出修正建议,制定下一步计划。
      迭代开发的模式给软件测试带来了新的要求,它不允许有一段独立的测试时间和阶段,测试必须跟着开发的迭代而迭代,所以回归测试的很重要。
    优点:

    1. 强调严格的风险分析,但要求许多客户接受和相信这种分析,并做出相关反应是不容易的,因此,这种模型往往适用于规模庞大,风险大的项目
    2. 强调各个开发阶段的质量
    3. 这种的开发模式会提供机会探讨项目是否有价值继续下去。

    缺点:

    1. 由于引入了非常严格的风险识别、风险分析和风险控制,将会大大消耗人力、资源,如果严重的影响了项目的利润,风险分析将毫无意义。
    2. 软件开发人员应该擅长寻找可能的风险,准确地分析风险,否则将会带来更大的风险。
    3. 软件建设周期长,但软件技术发展比较快,所以可能会和当前的技术水平有较大的的差距,无法满足当前用户需求。

    适用项目: 对新近开发,需求不明确的情况下,适合用螺旋模型进行开发,便于风险控制和需求变更。

    3. 迭代模型

    在这里插入图片描述
      开发迭代是一次完整地经过所有工作流程的过程:(至少包括)需求工作流程、分析设计工作流程、实施工作流程和测试工作流程。实质上,迭代模型是类似小型的瀑布式项目。
    每一个迭代都会产生一个可以发布的产品,这个产品是最终产品的一个子集。
    描述:
    4. 一次迭代过程包括了所有软件开发流程。
    5. 每一次迭代均产生一个可发布的产品。
    6. 该产品为最终产品的一个子集。
    适用项目: 适合于事先不能完整定义产品的所有需求,计划多期开发的项目。

    4. 增量模型

    在这里插入图片描述
    描述:

    1. 采用随时间进展而交错的线性序列。
    2. 每个序列产生一个可发布的增量。
    3. 每一个增量产生一个可操作的产品。
    4. 第一个增量是核心产品。

    优点: 开始时不用投入大量人力资源,可以事先推出核心产品以稳定用户,可以有计划的管理技术风险。
    缺点: 需要开放式体系结构,可能会产生设计效果差、开发效率低的情况。
    适合项目: 需求经常发生改变的软件开发过程。

    增量和迭代模型的区别:
      增量是逐块建造的概念,例如:画一幅人物画,我们可以先画人的头部,再画身体,再画手脚……。
      迭代是反复求精的概念,例如:同样是画人物画,我们可以先画整体轮廓,在勾勒出基本雏形,再细化、着色……。

    5. 敏捷模型

    描述: 敏捷模型是一种轻量、高效、低风险、更强调团队协作和沟通的开发方式,适合于中小型开发团队,客户需求模糊或多变。
    特点:

    • 强调人与人之间的沟通。
    • 轻文档(弱化文档,但不是不需要文档)
    • 客户需要全程参与
    • 需求可以的变化
    展开全文
  • 一、瀑布模型 1.1什么是瀑布模型 1.2特点 1.3优缺点 1.4客户需求 二、快速原型模型 2.1什么是快速原型模型 2.2优缺点 2.3快速原型模型的思想产生、原理及运用方式 2.4类型 2.5开发步骤 三、增量模型 3.1...

    目录

    一、瀑布模型

    1.1什么是瀑布模型

    1.2特点

    1.3优缺点

    1.4客户需求

    二、快速原型模型

    2.1什么是快速原型模型

    2.2优缺点

    2.3快速原型模型的思想产生、原理及运用方式

    2.4类型

    2.5开发步骤

    三、增量模型

    3.1什么是增量模型

    3.2特点

    3.3优缺点

    3.4作用

    四、螺旋模型

    4.1什么是螺旋模型

    4.2特点

    4.3优缺点

    4.4限制条件


    一、瀑布模型

    1.1什么是瀑布模型

    1970年温斯顿.罗伊斯提出了著名的“瀑布模型”,直到80年代早期,它一直是唯一被广泛采用的软件开发模型

    瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落

    瀑布模型是最早出现的软件开发模型,在软件工程中占有重要的地位,它提供了软件开发的基本框架。其过程是从上一项活动接收该项活动的工作对象作为输入,利用这一输入实施该项活动应完成的内容给出该项活动的工作成果,并作为输出传给下一项活动

    从本质来讲,它是一个软件开发架构,开发过程是通过一系列阶段顺序展开的,从系统需求分析开始直到产品发布和维护,每个阶段都会产生循环反馈,因此,如果有信息未被覆盖或者发现了问题,那么最好 “返回”上一个阶段并进行适当的修改,开发进程从一个阶段“流动”到下一个阶段,这也是瀑布开发名称的由来

    对于经常变化的项目而言,瀑布模型毫无价值

    1.2特点

    1、阶段间具有顺序性和依赖性

    该阶段具有两重含义

    1. 必须等前一阶段的工作完成后,才能开始后一阶段的工作
    2. 前一阶段的输出文档就是后一阶段的输入文档,因此只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果

    2、推迟实现的观点

    对于规模较大的软件项目来说,往往编码开始的越早,最终完成开发所需时间越长。因为前面阶段的工作没做或做的不扎实,过早地考虑进行程序实现,往往导致大量返工,有时甚至发生无法弥补的问题

    瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,分析与设计阶段的基本任务规定,在这两个阶段主要考虑目标系统的逻辑模型,不涉及软件的物理实现

    清楚的区分逻辑设计与物理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发软件的一条重要的指导思想

    3、质量保证的观点

    为了保证所开发的软件的质量,在瀑布模型的每一个阶段都应坚持两个重要做法

    1. 每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务
    2. 每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误

    传统的瀑布模型过于理想化,实际的瀑布模型是带"反馈环"的。如图所示(图中实线箭头表示开发过程,虚线箭头表示维护过程),当在后面阶段发现前面阶段的错误时,需要沿图中左侧的反馈线返回前面的阶段,修正前面阶段的产品后再回来继续完成后面阶段的任务

    瀑布模型是文档驱动的模型,遵守这个约束可使软件维护变得比较容易一些,从而显著降低软件预算

    1.3优缺点

    优点:

    • 项目提供了按阶段划分的检查点
    • 当前一阶段完成后,您只需要去关注后续阶段
    • 可在迭代模型中应用瀑布模型

    缺点:

    • 不适合需求模糊或需求经常变动的系统
    • 由于开销的逐步升级问题,它不希望存在早期阶段的反馈
    • 在一个系统完成以前,它无法预测一个新系统引入一个机构的影响
    • 用户可能需要较长等待时间来获得一个可供使用的系统,也许会给用户的信任程度带来影响和打击
    • 最终产品往往反映用户的初始需求而不是最终需求

    1.4客户需求

    对项目而言,是否使用这一模型主要取决于是否能理解客户的需求以及在项目的进程中这些需求的变化程度;对于经常变化的项目而言,瀑布模型毫无价值,可以考虑其他的架构来进行项目管理,比如螺旋模型

    瀑布模型强调文档的作用,并要求每个阶段都要仔细验证。但是,这种模型的线性过程太理想化,已不再适合现代的软件开发模式,几乎被业界抛弃,其主要问题在于:

    1. 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量
    2. 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险
    3. 早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果

    按照瀑布模型的阶段划分,软件测试可以分为单元测试集成测试系统测试

     

    二、快速原型模型

    2.1什么是快速原型模型

    快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集

    快速原型模型是增量模型的另一种形式,在开发真实系统之前,迅速建造一个可以运行的软件原型 ,以便理解和澄清问题,在该原型的基础上,逐渐完成整个系统的开发工作

    它允许在需求分析阶段对软件的需求进行初步而非完全的分析和定义,快速设计开发出软件系统的原型,该原型向用户展示待开发软件的全部或部分功能和性能;用户对该原型进行测试评定,给出具体改进意见以丰富细化软件需求;开发人员据此对软件进行修改完善,直至用户满意认可之后,进行软件的完整实现及测试、维护

    2.2优缺点

    优点

    • 克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险
    • 适合预先不能确切定义需求的软件系统的开发

    缺点

    • 所选用的开发技术和工具不一定符合主流的发展;快速建立起来的系统结构加上连续的修改可能会导致产品质量低下
    • 使用前提是要有一个展示性的产品原型,一定程度上可能会限制开发人员的创新

    2.3快速原型模型的思想产生、原理及运用方式

    1、思想产生

    在需求分析阶段得到完全、一致、准确、合理的需求说明十分困难

    获得一组基本需求说明后,就快速地使其“实现”,通过原型反馈,加深对系统的理解满足用户基本要求,使用户在试用后对需求说明进行补充和精确化,从而获得合理完整、现实可行的需求说明

    再把快速原型思想用到软件开发的其他阶段,向软件开发的全过程扩展

    先用相对少的成本,较短的周期开发一个简单的、但可以运行的系统原型向用户演示或让用户试用,以便及早澄清并检验一些主要设计策略,在此基础上再开发实际的软件系统

    2、原理

    利用原型辅助软件开发

    经过简单快速分析快速实现一个原型,用户与开发者在试用原型过程中加强通信与反馈,通过反复评价和改进原型,减少误解,弥补漏洞,最终提高软件质量

    3、运用方式

    由于运用原型的目的和方式不同,在使用原型时也采取不同的策略

    • 抛弃策略:将原型用于开发过程的某个阶段,促使该阶段的开发结果更加完整、准确、一致、可靠,该阶段结束后,原型随之作废。探索型和实验型就是采用此策略的
    • 附加策略:将原型用于开发的全过程,原型由最基本的核心开始,逐步增加新的功能和新的需求,反复修改反复扩充,最后发展为用户满意的最终系统,演化型快速原型就是采用此策略

    采用何种形式、何种策略运用快速原型主要取决于软件项目的特点、可供支持的原型开发工具和技术等,根据实际情况的特点决定

    2.4类型

    在软件开发中,原型是软件的一个早期可运行的版本,它反映最终系统的部分重要特性

    探索型

    这种原型目的是要弄清对目标系统的要求,确定所希望的特性,并探讨多种方案的可行性

    实验型

    这种原型用于大规模开发和实现之前,考核方案是否合适,规格说明是否可靠

    进化型

    这种原型的目的不在于改进规格说明,而是将系统建造得易于变化,在改进原型的过程中,逐步将原型进化成最终系统

    2.5开发步骤

    1、快速分析

    在分析人员与用户密切配合下,迅速确定系统的基本需求,根据原型需要体现的特征描述基本需求以满足开发原型的需要

    2、构造原型

    在快速分析的基础上,根据基本需求说明尽快实现一个可行的系统

    要求具有强有力的软件工具的支持,并忽略最终系统在某些细节上的要求,主要考虑原型系统能够充分反映所要评价的特性

    3、运行原型

    发现问题,消除误解,开发者与用户充分协调

    4、评价原型

    在运行的基础上,考核评价原型的特性,分析运行效果是否满足用户的愿望,纠正过去交互中的误解与分析中的错误,增添新的要求,并满足因环境变化或用户的新想法引起的系统要求变动,提出全面的修改意见

    5、修改

    根据评价原型的活动结果进行修改

    若原型未满足需求说明的要求,说明对需求说明存在不一致的理解或实现方案不够合理,根据明确的要求迅速修改原型

    快速原型模型不带反馈环,软件产品的开发基本上是线性顺序进行的

    快速原型的本质是"快速"。开发人员应尽可能地建造出原型系统,以加速软件开发过程,节约软件开发成本

    原型的用途是获知用户的真正需求,一旦需求确定了,原型将被抛弃

     

    三、增量模型

    3.1什么是增量模型

    增量模型也称渐增模型。使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能

    使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能

    把软件产品分解成增量构件时,唯一必须遵守的约束条件是,当把新构件集成到现有构件中时,所形成的产品必须是可测试的

    瀑布模型或快速原型模型目标是一次就把一个满足所有需求的产品提交给用户

    增量模型把整个软件产品分解成许多个增量构件,分批地逐步向用户提交产品

    3.2特点

    把瀑布模型的顺序特征与快速原型法的迭代特征相结合

    将软件看作一系列相互联系的增量,在开发过程的各次迭代中,每次完成其中的一个增量

    风险更大的增量模型

    确定用户需求后就着手拟定第一个构件的规格说明文档,完成后规格说明组转向第二个构件的规格说明文档,同时设计组开始涉及第一个构件

    使用该方法将不同的构件并行构建,可能加快工程进度,但将冒构建无法集成到一起的风险

    3.3优缺点

    优点

    1. 能在较短的时间内向用户提交可完成部分工作的产品
    2. 将待开发的软件系统模块化,可以分批次地提交软件产品,使用户可以及时了解软件项目的进展
    3. 以组件为单位进行开发降低了软件开发的风险。一个开发周期内的错误不会影响到整个软件系统
    4. 开发顺序灵活。开发人员可以对组件的实现顺序进行优先级排序,先完成需求稳定的核心组件。当组件的优先级发生变化时,还能及时地对实现顺序进行调整

    缺点

    1. 由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构
    2. 在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性
    3. 如果增量包之间存在相交的情况且未很好处理,则必须做全盘系统分析,这种模型将功能细化后分别开发的方法较适应于需求经常改变的软件开发过程

    3.4作用

    1、开发初期的需求定义只是用来确定软件的基本结构,使得开发初期用户只需要对软件需求进行大概的描述;而对于需求的细节性描述,则可以延迟到增量构件开发时进行,以增量构件为单位逐个地进行需求补充。这种方式能够有效适应用户需求的变更

    2、软件系统可以按照增量构件的功能安排开发的优先顺序,并逐个实现和交付使用。不仅有利于用户尽早用上系统,能够更好地适应新的软件环境,而且在以增量方式使用系统的过程中,还能获得对软件系统后续构件的需求经验

    3、软件系统是逐渐扩展的,因此开发者可以通过对诸多构件的开发,逐步积累开发经验。实际上,增量式开发还有利于技术复用,前面构件中设计的算法、采用的技术策略、编写的源码等,都可以应用到后面将要创建的增量构件中去

    4、增量式开发有利于从总体上降低软件项目的技术风险。个别的构件或许不能使用,但一般不会影响到整个系统的正常工作

    5、实际上,在采用增量模型时,具有最高优先权的核心增量构件将会被最先交付,而随着后续构件不断被集成进系统,这个核心构件将会受到最多次数的测试。这意味着软件系统最重要的心脏部分将具有最高的可靠性,这将使得整个软件系统更具健壮性

     

    四、螺旋模型

    4.1什么是螺旋模型

    螺旋模型是一种演化软件开发过程模型,它兼顾了快速原型的迭代特征以及瀑布模型的系统化与严格监控。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。同时,在每个迭代阶段构建原型是螺旋模型用以减小风险的途径

    螺旋模型是快速原型模型以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。该模型的每一个周期都包括需求定义、风险分析、工程实现和评审4个阶段,由这4个阶段进行迭代。软件开发过程每迭代一次,软件开发又前进一个层次。用螺旋模型的软件过程如下

    简化的螺旋模型

    完整的数据模型

     

    图中带箭头的点划线的长度代表当前累计的开发费用,螺旋线的角度值代表开发进度,螺旋线的每个周期对应于一个开发阶段

    图中的四个象限代表了以下活动

    1. 制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件
    2. 风险分析:分析评估所选方案,考虑如何识别和消除风险
    3. 实施工程:实施软件开发和验证
    4. 客户评估:评价开发工作,提出修正建议,制定下一步计划

    4.2特点

    螺旋模型在“瀑布模型”的每一个开发阶段前引入一个非常严格的风险识别、风险分析和风险控制,它把软件项目分解成一个个小项目。每个小项目都标识一个或多个主要风险,直到所有的主要风险因素都被确定

    螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,继而做出应有的反应,因此特别适用于庞大、复杂并具有高风险的系统

    4.3优缺点

    优点

    1. 对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标
    2. 减少了过多测试(浪费资金)或测试不足(产品故障多)所带来的风险
    3. 在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别

    缺点

    1. 采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失
    2. 过多的迭代次数会增加开发成本,延迟提交时间

    4.4限制条件

    1. 螺旋模型强调风险分析,但要求许多客户接受和相信这种分析,并做出相关反应是不容易的,因此,这种模型往往适应于内部的大规模软件开发
    2. 如果执行风险分析将大大影响项目的利润,那么进行风险分析毫无意义,因此,螺旋模型只适合于大规模软件项目
    3. 软件开发人员应该擅长寻找可能的风险,准确地分析风险,否则将会带来更大的风险

    一个阶段首先是确定该阶段的目标,完成这些目标的选择方案及其约束条件,然后从风险角度分析方案的开发策略,努力排除各种潜在的风险,有时需要通过建造原型来完成。如果某些风险不能排除,该方案立即终止,否则启动下一个开发步骤。最后,评价该阶段的结果,并设计下一个阶段

    展开全文
  • 永磁同步电机矢量控制(一)——数学模型

    万次阅读 多人点赞 2019-05-17 09:51:21
    因为是初学我的理解可能不够,其中每个内容的出处都会在文章内标注出来,大家可以参考原文原著。 1、永磁同步电机的数学模型 (参考于解小刚、陈进采用Id=0永磁同步电机矢量控制文章) 永磁同步电机是一个非...

    注:
    1:此为永磁同步控制系列文章之一,应大家的要求,关于永磁同步矢量控制的系列文章已经在主页置顶,大家可以直接去主页里面查阅,希望能给大家带来帮助,谢谢。
    2:矢量控制的六篇文章后。弱磁、MTPA、位置控制系列讲解已经补充,也放在主页了,请大家查阅。
    3: 恰饭一下,也做了一套较为详细教程放在置顶了,内含基本双闭环、MTPA、弱磁、三闭环、模糊PI等基本控制优化策略,也将滑模,MRAS等无速度控制课题整理完成,请大家查看_
    **

    导师研究的课题是永磁同步电机的控制,首先给我安排的任务就是将其矢量控制系统仿真搭建出来。本文记录矢量控制系统学习过程。因为是初学我的理解可能不够,其中每个内容的出处都会在文章内标注出来,大家可以参考原文原著。

    1、永磁同步电机的数学模型 (参考于解小刚、陈进采用Id=0永磁同步电机矢量控制文章)
    永磁同步电机是一个非线性系统,具有多变量、强耦合的特点。我们对其分析的时候有以下假设:

    • 忽略铁芯饱和,不计涡流和磁滞损耗

    • 忽略换相过程中的电枢反应

    • 转子上无阻尼绕组,永磁体无阻尼作用

    • 永磁体产生的磁场和三相绕组产生的感应磁场呈正弦分布

    • 定子绕组电流在气隙中只产生正弦分布的磁势,无高次谐波

    • 按照电动机应用建模
      在此理想条件下:
      1.1 永磁同步电机在三相静止坐标系下定子电压方程:(下图有误,定子磁链要求个导)
      这里写图片描述
      式中Rs为电枢电阻,ψa ψb ψc分别为abc三相磁链,ia ib ic 分别为其 abc三相的相电流。
      1.2 三相静止坐标系下磁链方程
      这里写图片描述
      其中Laa、Lbb、Lcc为各相绕组自感,且Laa=Lbb=Lcc,式中Mab等为绕组之间互感且均相等。ψf是永磁体磁链,θ为转子N极和a相轴线之间的夹角。
      经过CLARK和PARK左边变换后,得到其在dq坐标系下的数学模型:
      1.3 dq坐标系下电压方程
      这里写图片描述
      其中ud、uq为dq轴电压,id、iq为dq轴电流,ψd、ψq为dq轴磁链,Ld、Lq为dq轴电感,we为转速。
      1.4 dq坐标系下磁链方程
      这里写图片描述
      1.5 转矩方程
      在这里插入图片描述
      从上1.5中转矩方程可以看出,电磁转矩由两个部分组成,第一项是永磁体和定子绕组磁链之间相互作用产生,第二项则是由磁阻变化而产生的。这里我们需要区分一下凸极和隐极电机的区别,隐极电机由于Lq=Ld,所以磁阻变化转矩是凸极电机特有的,我们在搭建仿真的时候也需要注意这的电机类型。

      小结:
      永磁同步电机的数学模型解释了其内部构成,有助于我们设计控制策略,我们进行坐标变换和PI参数整定时都需要对其数学模型进行分析,很重要,很重要,很重要,说三遍!!!

    需要文章资料与仿真模型的同学请博客下评论留一下邮箱,看到就会发过去。
    整理不易,希望大家帮忙点个赞呀,谢谢啦~_

    后续文章链接:

    永磁同步电机矢量控制到无速度传感器控制学习教程(PMSM)
    永磁同步电机矢量控制(二)——控制原理与坐标变换推导
    永磁同步电机矢量控制(三)——电流环转速环 PI 参数整定
    永磁同步电机矢量控制(四)——simulink仿真搭建
    永磁同步电机矢量控制(五)——波形记录及其分析
    永磁同步电机矢量控制(六)——MTPA最大转矩电流比控制
    永磁同步电机矢量控制(七)——基于id=0的矢量控制的动态解耦策略
    永磁同步电机矢量控制(八)——弱磁控制(超前角弱磁)
    永磁同步电机矢量控制(九)——三闭环位置控制系统
    永磁同步电机矢量控制(十)——PMSM最优效率(最小损耗)控制策略

    展开全文
  • **epoll接口**是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下**多路I/O复用接口**中select/poll的增强。其经常应用于Linux下高并发服务型...(4) epoll反应模型 (重点,Libevent库的核心思想)

    epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。

    epoll采用的是事件驱动,并且设计的十分高效。在用户空间获取事件时,不需要去遍历被监听描述符集合中所有的文件描述符,而是遍历那些被内核I/O事件异步唤醒之后加入到就绪队列并返回到用户空间的描述符集合。
    epoll提供了两种触发模式,水平触发(LT)和边沿触发(ET)。当然,涉及到I/O操作也必然会有阻塞和非阻塞两种方案。目前效率相对较高的是 epoll+ET+非阻塞I/O 模型,在具体情况下应该合理选用当前情形中最优的搭配方案。

    接下来的讲解顺序为:
    (1) epoll接口的一般使用
    (2) epoll接口 + 非阻塞
    (3) epoll接口 + 非阻塞 + 边沿触发
    (4) epoll反应堆模型 (重点,Libevent库的核心思想)

    一、epoll接口的基本思想概述

    epoll的设计:
    (1)epoll在Linux内核中构建了一个文件系统,该文件系统采用红黑树来构建,红黑树在增加和删除上面的效率极高,因此是epoll高效的原因之一。有兴趣可以百度红黑树了解,但在这里你只需知道其算法效率超高即可。
    (2)epoll红黑树上采用事件异步唤醒,内核监听I/O,事件发生后内核搜索红黑树并将对应节点数据放入异步唤醒的事件队列中
    (3)epoll的数据从用户空间到内核空间采用mmap存储I/O映射来加速。该方法是目前Linux进程间通信中传递最快,消耗最小,传递数据过程不涉及系统调用的方法。
    这里写图片描述

    epoll接口相对于传统的select/poll而言,有以下优点:
    (1)支持单个进程打开大数量的文件描述符。受进程最大打开的文件描述符数量限制,而不是受自身实现限制。而select单个进程能够打开的文件描述符的数量存在最大限制,这个限制是select自身实现的限制。通常是1024。poll采用链表,也是远超select的。
    (2)Linux的I/O效率不会随着文件描述符数量的增加而线性下降。较之于select/poll,当处于一个高并发时(例如10万,100万)。在如此庞大的socket集合中,任一时间里其实只有部分的socket是“活跃”的。select/poll的处理方式是,对用如此庞大的集合进行线性扫描并对有事件发生的socket进行处理,这将极大的浪费CPU资源。因此epoll的改进是,由于I/O事件发生,内核将活跃的socket放入队列并交给mmap加速到用户空间,程序拿到的集合是处于活跃的socket集合,而不是所有socket集合。
    (3)使用mmap加速内核与用户空间的消息传递。select/poll采用的方式是,将所有要监听的文件描述符集合拷贝到内核空间(用户态到内核态切换)。接着内核对集合进行轮询检测,当有事件发生时,内核从中集合并将集合复制到用户空间。 再看看epoll怎么做的,内核与程序共用一块内存,请看epoll总体描述01这幅图,用户与mmap加速区进行数据交互不涉及权限的切换(用户态到内核态,内核态到用户态)。内核对于处于非内核空间的内存有权限进行读取。
    更多关于mmap可以看看我的另一篇博客了进行了解。
    https://blog.csdn.net/qq_36359022/article/details/79992287

    接下来我们结合epoll总体描述01与上述的内容,将图示进行升级为epoll总体描述02
    这里写图片描述
    让我们来看看图的红黑树文件系统。以epfd为根,挂载了一个监听描述符和5个与客户端建立连接的cfd。fd的增删按照红黑树的操作方式,每一个文件描述符都有一个对应的结构,该结构为

    /*
     *  -[ epoll结构体描述01 ]-
     */
    struct epoll_event {
                __uint32_t events; /* Epoll events */
                epoll_data_t data; /* User data variable */
            };
    
    typedef union epoll_data {
                void *ptr;
                int fd;
                uint32_t u32;
                uint64_t u64;
            } epoll_data_t;

    epoll总体描述02中,每个fd上关联的即是结构体epoll_event。它由需要监听的事件类型和一个联合体构成。一般的epoll接口将传递自身fd到联合体。

    因此,使用epoll接口的一般操作流程为:
    (1)使用epoll_create()创建一个epoll对象,该对象与epfd关联,后续操作使用epfd来使用这个epoll对象,这个epoll对象才是红黑树,epfd作为描述符只是能关联而已。
    (2)调用epoll_ctl()向epoll对象中进行增加、删除等操作。
    (3)调用epoll_wait()可以阻塞(或非阻塞或定时) 返回待处理的事件集合。
    (3)处理事件。

    /*
     *  -[  一般epoll接口使用描述01  ]-
     */
    int main(void)
    {
     /* 
      *   此处省略网络编程常用初始化方式(从申请到最后listen)
      *   并且部分的错误处理省略,我会在后面放上所有的源码,这里只放重要步骤
      *   部分初始化也没写
      */ 
      // [1] 创建一个epoll对象
      ep_fd = epoll_create(OPEN_MAX);       /* 创建epoll模型,ep_fd指向红黑树根节点 */
      listen_ep_event.events  = EPOLLIN;    /* 指定监听读事件 注意:默认为水平触发LT */
      listen_ep_event.data.fd = listen_fd;  /* 注意:一般的epoll在这里放fd */ 
      // [2] 将listen_fd和对应的结构体设置到树上
      epoll_ctl(ep_fd, EPOLL_CTL_ADD, listen_fd, &listen_ep_event);
    
      while(1) { 
          // [3] 为server阻塞(默认)监听事件,ep_event是数组,装满足条件后的所有事件结构体
          n_ready = epoll_wait(ep_fd, ep_event, OPEN_MAX, -1); 
          for(i=0; i<n_ready; i++) {
             temp_fd = ep_event[i].data.fd;
    
             if(ep_event[i].events & EPOLLIN){
                if(temp_fd == listen_fd) {  //说明有新连接到来
                   connect_fd = accept(listen_fd, (struct sockaddr *)&client_socket_addr, &client_socket_len);
                   // 给即将上树的结构体初始化
                   temp_ep_event.events  = EPOLLIN;
                   temp_ep_event.data.fd = connect_fd;
                   // 上树
                   epoll_ctl(ep_fd, EPOLL_CTL_ADD, connect_fd, &temp_ep_event);
                 }
                 else {                      //cfd有数据到来
                   n_data = read(temp_fd , buf, sizeof(buf));
                   if(n_data == 0)  {        //客户端关闭
                       epoll_ctl(ep_fd, EPOLL_CTL_DEL, temp_fd, NULL) //下树
                       close(temp_fd);
                    }
                    else if(n_data < 0) {}
    
                    do {
                       //处理数据
                     }while( (n_data = read(temp_fd , buf, sizeof(buf))) >0 ) ;
                 }
              }
    
             else if(ep_event[i].events & EPOLLOUT){
                    //处理写事件
             }
             else if(ep_event[i].events & EPOLLERR) {
                    //处理异常事件
             }
          }      
       }
      close(listen_fd);
      close(ep_fd);
    }

    二、epoll水平触发(LT)、epoll边沿触发(ET)

    (1) epoll水平触发, 此方式为默认情况。
    当设置了水平触发以后,以可读事件为例,当有数据到来并且数据在缓冲区待读。即使我这一次没有读取完数据,只要缓冲区里还有数据就会触发第二次,直到缓冲区里没数据。
    (2) epoll边沿触发,此方式需要在设置

    listen_ep_event.events  = EPOLLIN | EPOLLET;   /*边沿触发 */

    当设置了边沿触发以后,以可读事件为例,对“有数据到来”这件事为触发。
    这里写图片描述
    总结:
    1.用高低电平举例子就是
    水平触发:0为无数据,1为有数据。缓冲区有数据则一直为1,则一直触发。
    边沿触发:0为无数据,1为有数据,只要在0变到1的上升沿才触发。
    2.
    缓冲区有数据可读,触发 ⇒ 水平触发
    缓冲区有数据到来,触发 ⇒ 边沿触发

    那么,为什么说边沿触发(ET) 的效率更高呢?
    (1) 边沿触发只在数据到来的一刻才触发,很多时候服务器在接受大量数据时会先接受数据头部(水平触发在此触发第一次,边沿触发第一次)。
    (2) 接着服务器通过解析头部决定要不要接这个数据。此时,如果不接受数据,水平触发需要手动清除,而边沿触发可以将清除工作交给一个定时的清除程序去做,自己立刻返回。
    (3) 如果接受,两种方式都可以用while接收完整数据。

    三、epoll + 非阻塞I/O

    在第一大部分中的 一般epoll接口使用描述01代码中,我们使用的读取数据函数为read函数,在默认情况下此类函数是阻塞式的,在没有数据时会一直阻塞等待数据到来。
    (1)数据到来100B,在epoll模式下调用read时,即使read()是阻塞式的也不会在这里等待,因为既然运行到read(),说明数据缓冲区已经有数据,因此这处无影响。
    (2)在服务器开发中,一般不会直接用采用类似read()函数这一类系统调用(只有内核缓冲区),会使用封装好的一些库函数(有内核缓冲区+用户缓冲区)或者自己封装的函数。
    例如:使用readn()函数,设置读取200B返回,假设数据到来100B,可读事件触发,而程序要使用readn()读200B,那么此时如果是阻塞式的,将在此处形成死锁
    流程是:100B ⇒ 触发可读事件 ⇒ readn()调用 ⇒ readn()都不够200B,阻塞 ⇒ cfd又到来200B ⇒ 此时程序在readn()处暂停,没有机会调用epoll_wait() ⇒ 完成死锁

    解决:
    将该cfd在上树前设置为非阻塞式

    /* 修改cfd为非阻塞读 */
    flag  = fcntl(cfd, F_GETFL);
    flag |= O_NONBLOCK;
    fcntl(connect_fd, F_SETFL, flag); 

    四、epoll + 非阻塞I/O + 边沿触发

    /*
     *  -[  epoll+非阻塞+边沿触发 使用描述01  ]-
     */
    
     /* 其他情况不变,与*一般epoll接口使用描述01*描述一致 
      * 变化的仅有第二大部分和第三大部分的这两段代码即可
      */ 
    
    /* ... ... */
    listen_ep_event.events  = EPOLLIN | EPOLLET;   /*边沿触发 */
    /* ... ... */
    /* 修改cfd为非阻塞读 */
    flag  = fcntl(cfd, F_GETFL);
    flag |= O_NONBLOCK;
    fcntl(connect_fd, F_SETFL, flag); 
    /* ... ...  */
    

    五、epoll反应堆模型 (Libevent库核心思想)

    1. 第一步,epoll反应堆模型雏形 —— epoll模型
      我们将epoll总体描述02进行升级为epoll反应堆模型总体描述01
      这里和一般的epoll接口不同的是,现在正式称之为epoll模型(epoll+ET+非阻塞+自定义结构体)
      (1) 还记得每一个在红黑树上的文件描述符所对应的结构体吗?它的结构描述在第一大部分的 epoll结构体描述01中。在epoll接口使用代码中,我们在该结构体中的联合体上传入的是文件描述符本身,那么epoll模型和epoll接口最本质的区别在于epoll模型中,传入联合体的是一个自定义结构体指针,该结构体的基本结构至少包括
    struct my_events {  
        int        m_fd;                             //监听的文件描述符
        void       *m_arg;                           //泛型参数
        void       (*call_back)(void *arg);          //回调函数
        /*
         *  你可以在此处封装更多的数据内容
         *  例如用户缓冲区、节点状态、节点上树时间等等
         */
    };
    /*
     * 注意:用户需要自行开辟空间存放my_events类型的数组,并在每次上树前用epoll_data_t里的  
     *      ptr指向一个my_events元素。
     */

    根据该模型,我们在程序中可以让所有的事件都拥有自己的处理函数,你只需要使用ptr传入即可。
    (2) epoll_wait()返回后,epoll模型将不会采用一般epoll接口使用描述01代码中的事件分类处理的办法,而是直接调用事件中对应的回调函数,就像这样

    /*
     *  -[ epoll模型使用描述01  ]-
     */
     while(1) {
          /* 监听红黑树, 1秒没事件满足则返回0 */ 
          int n_ready = epoll_wait(ep_fd, events, MAX_EVENTS, 1000);
          if (n_ready > 0) {
             for (i=0; i<n_ready; i++) 
                events[i].data.ptr->call_back(/* void *arg */);
           }
           else
              /*  
               * (3) 这里可以做很多很多其他的工作,例如定时清除没读完的不要的数据
               *     也可以做点和数据库有关的设置
               *     玩大点你在这里搞搞分布式的代码也可以
               */
     }

    这里写图片描述

    1. 第二步,epoll反应堆模型成型
      到了这里,也将是epoll的最终成型,如果从前面到这里你都明白了,epoll的知识你已经十之七八了
      让我们先回想以下epoll模型的那张图,我们来理一理思路。
      (1) 程序设置边沿触发以及每一个上树的文件描述符设置非阻塞
      (2) 调用epoll_create()创建一个epoll对象
      (3) 调用epoll_ctl()向epoll对象中进行增加、删除等操作
      上树的文件描述符与之对应的结构体,该结构体应该满足填充事件与自定义结构体ptr,此时,监听的事件与回调函数已经确定了对吧?
      (4) 调用epoll_wait()(定时检测) 返回待处理的事件集合。
      (5) 依次调用事件集合中的每一个元素中的ptr所指向那个结构体中的回调函数

    以上为雏形版本,那么epoll反应堆模型还要比这个雏形版本多了什么呢?
    请看第三步的粗体字,当我们把描述符和自定义结构体上树以后,如果放的是监听可读事件并做其对应的回调操作。也就是说,它将一直作为监听可读事件而存在。
    其流程是:
    监听可读事件(ET) ⇒ 数据到来 ⇒ 触发事件 ⇒ epoll_wait()返回 ⇒ 处理回调 ⇒ 继续epoll_wait() ⇒ 直到程序停止前都是这么循环

    那么接下来升级为成型版epoll反应堆模型
    其流程是:
    监听可读事件(ET) ⇒ 数据到来 ⇒ 触发事件 ⇒ epoll_wait()返回 ⇒
    读取完数据(可读事件回调函数内) ⇒ 将该节点从红黑树上摘下(可读事件回调函数内) ⇒ 设置可写事件和对应可写回调函数(可读事件回调函数内) ⇒ 挂上树(可读事件回调函数内) ⇒ 处理数据(可读事件回调函数内)
    ⇒ 监听可写事件(ET) ⇒ 对方可读 ⇒ 触发事件 ⇒ epoll_wait()返回 ⇒
    写完数据(可写事件回调函数内) ⇒ 将该节点从红黑树上摘下(可写事件回调函数内) ⇒ 设置可读事件和对应可读回调函数(可写读事件回调函数内) ⇒ 挂上树(可写事件回调函数内) ⇒ 处理收尾工作(可写事件回调函数内) ⇒ 直到程序停止前一直这么交替循环
    至此,结束

    (1) 如此频繁的增加删除不是浪费CPU资源吗?
    答:对于同一个socket而言,完成收发至少占用两个树上的位置。而交替只需要一个。任何一种设计方式都会有浪费CPU资源的时候,关键看你浪费得值不值,此处的耗费能否换来更大的收益才是衡量是否浪费的标准。和第二个问题综合来看,这里不算浪费

    (2) 为什么要可读以后设置可写,然后一直交替?
    答:服务器的基本工作无非数据的收发,epoll反应堆模型准从TCP模式,一问一答。服务器收到了数据,再给与回复,是目前绝大多数服务器的情况。
    (2-1) 服务器能收到数据并不是一定能写数据
    假设一 :服务器接收到客户端数据,刚好此时客户端的接收滑动窗口满,我们假设不进行可写事件设置,并且客户端是有意让自己的接收滑动窗口满的情况(黑客)。那么,当前服务器将随客户端的状态一直阻塞在可写事件,除非你自己在写数据时设置非阻塞+错误处理
    假设二 :客户端在发送完数据后突然由于异常原因停止,这将导致一个FIN发送至服务器,如果服务器不设置可写事件监听,那么在接收数据后写入数据会引发异常SIGPIPE,最终服务器进程终止。
    细节部分可以看看我的这篇关于SIGPIPE信号的博客
    https://blog.csdn.net/qq_36359022/article/details/78851178

    以上为网络高并发服务器epoll接口、epoll反应堆模型详解及代码实现,下面是源码
    链接:https://pan.baidu.com/s/1u99U2xEnbXE3sPQ6o2GcUg 密码:gc7k

    展开全文
  • 线性模型基本形式

    千次阅读 2020-04-18 17:04:10
    线性模型基本形式–西瓜书, 基本解法–李航统计学习和花书, 进阶(贝叶斯视角,基函数)–PRML对应贝叶斯学派,ESL统计学习理论,MLAPP对应频率学派 线性模型基本形式 线性模型Linear Model是监督学习中一种...
  • ArcGIS教程 - 2 ArcGIS基础知识

    千次阅读 多人点赞 2020-02-08 11:47:37
    第2章 ArcGIS基础知识 2.1 ArcGIS10.x概述 ArcGIS10.x是ESRI公司开发的GIS产品家族,它集合了数据库、...本章主要介绍ArcGIS产品的发展史、构架等方面的内容。 ESRI(Environmental System Research Institut...
  • 近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 ...同时分享一个自己录制的CSS3动画特效经典案例【推荐教程】--后期会更新vue框架 微信小程序等内容。 https://ke.qq.com/cou...
  • 一、引言 本文以rssi(接收信号强度)滤波为背景,结合卡尔曼的五个公式,设计 ...3、卡尔曼滤波过程及五个基本公式 4、公式中每个参数详细注释 5、结合rssi滤波实例设计滤波器 6、MATLAB实现滤波器 二、模型的...
  • 图像分割综述

    万次阅读 多人点赞 2019-07-09 22:03:48
    近年来还提出了基于曲面拟合的方法、基于边界曲线拟合的方法、基于反应-扩散方程的方法、串行边界查找、基于变形模型的方法。 边缘检测的优缺点: (1)边缘定位准确; (2)速度快; (3)不能保证边缘的连续...
  • CNN卷积神经网络原理详解(上)

    万次阅读 多人点赞 2019-10-18 23:59:17
    这个图层基本上需要一个输入量(无论输出是在其之前的conv或ReLU还是pool层),并输出一个N维向量,其中N是程序必须从中选择的类的数量。例如,如果你想要一个数字分类程序,N将是10,因为有10个数字。这个N维向量中...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 3外部测试: 10 验收测试:(在系统测试之后) 11 回归测试: 11 4.测试过程(干什么,怎么干) 12 5.各阶段输入、输出标准以及入口、出口准则:(测试阶段过程要素) ...
  • 进场之后先去抽号,根据你抽到的题目内容进行一个两分钟的准备,我们组3个话题主要包括: (1)出国留学;(2)90后跳槽现象;(3)对企业加班的看法。 问了一下别的同学,好像还有一些话题包括: 1、沉迷网络...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • 软件测试面试题汇总

    万次阅读 多人点赞 2018-09-27 12:31:09
    33、集成测试也叫组装测试或者联合测试,请简述集成测试的主要内容? .............................................. 10 34、简述集成测试与系统测试关系? ....................................................
  • 《数据库原理》— 数据库系统概论第五版习题解析

    万次阅读 多人点赞 2017-05-29 14:57:48
    由于记录之间联系是通过存取路径实现的,应用程序在访问数据时必须选择适当的存取路径。因此,用户必须了解系统结构的细节,加重了编写应用程序的负担。  13.试述关系模型的概念,定义并解释以下术语: ( l ...
  • 深度学习入门

    万次阅读 多人点赞 2017-11-05 21:23:46
      “神经网络,是一种由具有自适应性的简单单元构成的广泛并行互联的网络,它的组织结构能够模拟生物神经系统对真实世界所作出的交互反应。” 那为什么要用神经网络学习呢?   在人工智能领域,有两大主流...
  • 之前写过的两篇文章,《马尔萨斯人口模型》和《生态学经典...这样一个化学反应的流程可以构造出一个一阶微分方程模型: dAdt=+∑n=1N(creationrate)n−∑n=1N(consumptionrate)n\frac{dA}{dt}=+\sum_{n=1}^N(creationr.
  • Trucksim车辆动力学模型

    千次阅读 2019-11-01 20:05:16
    1. TRUCKSIM动力学模型 TruckSim软件是由美国机械仿真公司(Mechanical Simulation Corporation,简称MSC,专门研究汽车动力学软件的专业公司)开发的专为卡车、客车和挂车动态仿真开发的工业仿真软件。TruckSim...
  • 基于MATLAB的语音信号处理

    万次阅读 多人点赞 2018-07-15 01:21:20
    提出并研制成功第一个声码器,奠定了语音产生模型的基础,其在语音信号处理领域具有划时代的意义。在 20 世纪 40 年代,一种语言声学的专用仪器语谱图仪问世。它可以让你把语音的时变频谱用语图表示出来,得到一个...
  • 64、Reactor反应器模式 65、Connection Per Thread模式 66、ZooKeeper中Leader选举流程 67、设计模式 68、TCP三次握手 四次挥手 69、RabbitMQ消息队列五种队列 70、MQ使用时候的注意事项 71、HashMap的时间复杂度 72...
  • 概念数据模型、逻辑数据模型、物理数据模型

    万次阅读 多人点赞 2018-04-30 10:11:33
    最近在系统的学习数据库存储方面的知识加上在公司经常听同事们说起CDM,结合前段时间对MySQL的使用的心得将概念数据模型...本文将介绍这三种模型基本概念以及他们之间的不同。 在讨论三种数据模型之前,我们首先...
  • 一、数据库基本概念简单介绍 ①、数据:描述事物的符号记录称为数据,包括数字、文字、图形等,简单的说,能够为我们提供信息的符号都可以称为数据。 ②、数据库:数据库是长期储存在计算机内、有组织的、可共享的...
  • 其实这篇文章基本是转自一片论文的,只是论文是用simulink仿真实现,而这里的使用代码实现,并且只是注重实现的方法,对理论分析并没有太多的描述。以下是论文链接,可以相互参考一下: 基于临界比例度法整定PID...
  • 如何优化深度学习模型

    千次阅读 2019-05-01 09:48:34
    如果你听说过AutoML,那么Google基本上就是这样做的:将所有内容都设置为超参数,然后扔大量TPU在这个问题上让它自行解决。 但是对于我们绝大多数只想在黑色星期五销售之后用经济型机器分类猫狗的人来说,现在是...
  • 经济管理学中常用的模型分析法

    万次阅读 2018-03-28 09:24:04
    经济管理学中常用的模型分析法常用的分析模型有:波特五力模型、波士顿矩阵、鱼骨分析法、5W1H分析法、麦肯锡7S模型、杜邦分析法、营销漏斗模型、可行性分析、绩效分析;SMART原则、SWOT分析、PEST分析法、GROW模型...
  • 全面理解Java内存模型(JMM)及volatile关键字

    万次阅读 多人点赞 2017-06-12 11:25:05
    本篇主要结合博主个人对Java内存模型的理解以及相关书籍内容的分析作为前提,对JMM进行较为全面的分析,本篇的写作思路是先阐明Java内存区域划分、硬件内存架构、Java多线程的实现原理与Java内存模型的具体关系,在...
  • 软件开发模型2:增量模型/螺旋模型/敏捷模型

    千次阅读 热门讨论 2019-01-07 08:43:04
    文章目录4 增量模型(Incremental Model)4.1 优点4.2 缺点5 螺旋模型(Spiral Model)6 敏捷模型(Agile Modeling) 转载自博文: 软件开发的11种模式 https://blog.csdn.net/xi_gua_gua/article/details/53107283 ...
  • BP神经网络-- 基本模型

    万次阅读 2018-05-08 22:01:22
    让我们一起来探索下 BP神经网络最初的 基本模型和概念!   从神经网络的生物模型说起  我们知道人大脑信息的传递、对外界刺激产生反应都由神经元控制的,人脑就是由上百亿个的这样神经元构成。这些神经元之间并不...
  • 《工程电磁场(第三版)》(倪光正 主编)复习

    万次阅读 多人点赞 2019-08-23 12:00:33
    还是先从第一章开始去复习,了解什么是电磁场的数学物理基础,还有模型的构成以及需要了解到的麦克斯韦方程组。 首先,了解电荷的分布形式,点电荷、面电荷、线电荷、体电荷…… 第一章 体电流密度J,简称电流...
  • Elman神经网络介绍以及Matlab实现

    万次阅读 多人点赞 2018-06-28 19:27:15
    Elman神经网络是一种典型的动态递归神经网络,它是在BP网络基本结构的基础上,在隐含层增加一个承接层,作为一步延时算子,达到记忆的目的,从而使系统具有适应时变特性的能力,增强了网络的全局稳定性,它比前馈型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,511
精华内容 32,204
关键字:

反应选择模型的基本内容