精华内容
下载资源
问答
  • 激光扫描复制

    2021-02-08 11:13:32
    莫尔地形描述法,虽能根据照片比较容易地推测出被测物体的立体形状,但是对于形状急剧变化的物体来说,由于莫尔条纹过于密集,因而条纹的可见度差,所以要得到正确的截面形状,还必须校正莫尔条纹序数所引起的等高线...
  • 与深度优先不同的是,在窗口的下方增加一个队列,其左端为队头,右端为队尾。 23. 求有向图的强连通分量 图示窗口自上而下分别显示有向图的逻辑结构、存储结构和 Finished 数组在算法执行过程...
  • 软件工程相关知识

    2020-01-09 22:03:41
    描述数据信息集合,它数据流图中各个元素按规定格式进行详细的描述和确切解释,是数据流图补充工具。 2. 数据流图 他以图形方式反映系统数据流程。 3. 白盒测试 按照程序内部结构测试程序,...

    1. 数据词典

    是描述数据信息的集合,它对数据流图中的各个元素按规定格式进行详细的描述和确切的解释,是数据流图的补充工具。

    2. 数据流图

    他以图形的方式反映系统的数据流程。

    3. 白盒测试

    按照程序内部的结构测试程序,检验程序中的每条路径是否都能按预定要求正确工作。有两种测试法既逻辑覆盖测试法和路径测试法。

    4. 黑盒测试

    按照程序的功能测试程序,检验与程序功能有关的输入、输出与程序执行是否正确。有四种方法既等价分类法、边界值分析法、错误猜测法和因果图法。

    5. 完善性维护

    为了适应用户业务和机构的发展变化而对软件的功能、性能进行修改、扩充的过程称为完善性维护。因为各种用户的业务和机构在相当长的时期内不可能是一成不变的,所以功能、性能的增加是不可避免的,而且这种维护活动在整个维护工作中所占的比重很大。

    6. 软件可靠性

    指在给定的时间内,程序按照规定的条件成功地运行的概率。

    7. 软件配置

    是一个软件在生存周期内,他的各种形式、各种版本的文档与程序的总称。

    8. 软件再工程

    运用逆向工程、重构等技术,在充分理解原有软件的基础上,进行分解、综合、并重新构建软件,用于提高软件的可理解性、可维护性可复用性或演化性。

    9. α测试

    是在一个受控的环境下,由用户在开发者的“指导”下进行的的测试,由开发者负责记录错误和使用中出现的问题。

    10. β测试

    是由软件的最终用户(多个)在一个或多个用户场所来进行。由用户负责记下遇到的所有问题,包括主观认定的和真实的问题,定期向开发者报告,开发者在综合用户的报告之后进行修改,最后将软件产品交付给全体用户使用。

     

    简答题

    1.软件工程的七条基本原理是什么?

    软件工程的七条基本原理是:

    (1) 用分阶段的是的生存周期计划严格管理;

    (2) 坚持进行阶段评审;

    (3) 严格实施的产品控制;

    (4) 采用现代程序技术;

    (5) 结果应能清楚地审查;

    (6) 开发小组的成员应该少而精;

    (7) 承认不断改进软件工程的必要性。

     

    2.良好的编码风格应具备哪些条件?

    应具备以下条件:

    (1)使用标准的控制结构;

    (2)有限制地使用GOTO语句;

    (3)源程序的文档化 (应具备以下内容)

              ①有意义的变量名称 —— “匈牙利命名规则 ”。

              ②适当的注释 ——“注释规范”。

              ③标准的书写格式:

                        ——用分层缩进的写法显示嵌套结构的层次(锯齿形风格);

                        ——在注释段的周围加上边框;

                        ——在注释段与程序段、以及不同程序段之间插入空行;

                        ——每行只写一条语句;

                        ——书写表达式时,适当使用空格或圆括号等作隔离符。

    (4)满足运行工程学的输入输出风格。

     

    3.简述文档在软件工程中的作用。

    (1) 提高软件开发过程的能见度

    (2) 提高开发效率

    (3) 作为开发人员阶段工作成果和结束标志

    (4) 记录开发过程的有关信息便于使用与维护;

    (5) 提供软件运行、维护和培训有关资料;

    (6) 便于用户了解软件功能、性能。

     

    4.可行性研究包括哪几方面的内容?

    (1)经济可行性:是否有经济效益,多长时间可以收回成本;

    (2)技术可行性:现有技术能否实现本系统,现有技术人员能否胜任,开发系统的资源能否满足;

    (3)运行可行性:系统操作在用户内部行得通吗?

    (4)法律可行性:新系统开发是否会侵犯他人、集体或国家利益,是否违反国家法律。

     

    5.结构化的需求分析描述工具有哪些?

    有数据流图(DFD)、数据字典(DD)、判定表、判定树、结构化语言(PDL)、层次方框图、Warnier图、IPO图、控制流图(CFD)、控制说明(CSPEC)、状态转换图(STD)和实体—关系图(E—R)等。

     

    6.一般面向对象分析建模的工具(图形)有哪些?

    用例图、类/对象图、对象关系图、实体—关系图(E—R)、事件轨迹图(时序图)和状态转换图(STD)等。

     

    7.UML统一建模语言有哪几种图形?

    用例图、类图、对象图、构件(组件)图、部署(配置)图、状态图、活动图、顺序(时序)图、合作(协作)图等九种图。

     

    8.在面向对象分析时类和对象的静态关系主要有哪几种?

    类和对象的静态关系主要有关联、聚集、泛化、依赖等四种关系。

     

    9. 什么是模块化?模块设计的准则?

    模块化是按规定的原则将一个大型软件划分为一个个较小的、相对独立但又相关的模块。

    模块设计的准则:

    (1) 改进软件结构, 提高模块独立性:在对初步模块进行合并、分解和移动的分析、精化过程中力求提高模块的内聚,降低藕合。

    (2) 模块大小要适中:大约50行语句的代码,过大的模块应分解以提高理解性和可维护性;过小的模块,合并到上级模块中。

    (3) 软件结构图的深度、宽度、扇入和扇出要适当。一般模块的调用个数不要超过5个。

    (4) 尽量降低模块接口的复杂程度;

    (5) 设计单入口、单出口的模块。

    (6) 模块的作用域应在控制域之内。

     

    10.什么是模块独立性?用什么度量?

     模块独立性概括了把软件划分为模块时要遵守的准则,也是判断模块构造是不是合理的标准。独立性可以从两个方面来度量:即模块本身的内聚和模块之间的耦合。

     

    11. 变换型数据流由哪几部分组成?

    变换型结构由三部分组成:传入路径、变换(加工)中心和传出路径。

     

    12. 变换分析设计的步骤?

    (1) 区分传入、传出和变换中心三部分,划分DFD图的分界线;

    (2) 完成第一级分解:建立初始SC图的框架;

    (3) 完成第二级分解:分解SC图的各个分支;

    (4) 对初始结构图按照设计准则进行精化与改进。

     

    13. 事务型数据流由哪几部分组成?

    事务型结构由至少一条接受路径、一个事务中心与若干条动作路径组成。

     

    14. 事务分析设计的步骤?

    (1) 在DFD图中确定事务中心、接收部分(包含全部接收路径)和发送部分(包含全部动作路径);

    (2) 画出SC图框架,把DFD图的三部分,分别映射"为事务控制模块,接收模块和动作发送模块.一般得到SC图的顶层和第一层(如果第一层简单可以并入顶层);

    (3) 分解和细化接收分支和动作分支,完成初始的SC图;

    (4) 对初始结构图按照设计准则进行精化与改进。

     

    15.数据字典包括哪些内容?

    数据字典是描述数据流图中数据的信息的集合。它对数据流图上每一个成分:数据项、文件(数据结构)、数据流、数据存储、加工和外部项等给以定义和说明;它主要由数据流描述、加工描述和文件描述三部分组成。

     

    18.什么是软件生存周期?把生存周期划分为阶段的目的是什么?

     一个软件从开始计划起,到废弃不用止,成为软件的生存周期。把整个生存周期划分为较小的阶段,给每个阶段赋予确定而有限的任务,能够简化每一步的工作内容,使因为软件规模增长而大大增加了的软件复杂性变得较易控制和管理。

     

    19.详细设计的目的?

    为软件结构图(SC图或HC图)中的每一个模块确定采用的算法和块内数据结构,用某种选定的表达工具给出清晰的描述。

     

    20.详细设计的任务是什么?

    (1) 为每个模块确定采用的算法;

    (2) 确定每一模块使用的数据结构;

    (3) 确定模块接口的细节;

    (4) 编写过程设计说明书;

    (5) 设计每一模块的测试用例。

     

    21. 编码的任务?

    使用选定的程序设计语言,把模块的过程性描述翻译为用语言书写的源程序(源代码)。

     

    22.软件测试的基本任务?

    软件测试是按照特定的规则,发现软件错误的过程;好的测试方案是尽可能发现迄今尚未发现错误的测试;成功的测试方案是发现迄今尚未发现错误的测试;

     

    23.什么是黑盒测试?黑盒测试主要采用的技术有哪些?

    黑盒测试也称为功能测试,它着眼于程序的外部特征,而不考虑程序的内部逻辑结构。测试者把被测程序看成一个黑盒,不用关心程序的内部结构。黑盒测试是在程序接口处进行测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。

    黑盒测试主要采用的技术有:等价分类法、边界值分析法、错误推测法和因果图等技术。

     

    24.什么是白盒测试?白盒测试主要采用的技术有哪些?

    白盒测试是测试者了解被测程序的内部结构和处理过程,对程序的所有逻辑路径进行测试,在不同点检查程序状态,确定实际状态与预期状态是否一致。

    白盒测试主要采用的技术有:路径测试技术和事务处理流程技术,对包含有大量逻辑判断或条件组合的程序采用基于逻辑的测试技术。

     

    25.路径测试技术中几种主要覆盖的含义?举例说明?

    语句覆盖:至少执行程序中所有语句一次。

    判定覆盖:使被测程序中的每一个分支至少执行一次。故也称为分支覆盖。

    条件覆盖:执行所有可能的穿过程序的控制路流程。

    条件组合测试:设计足够的测试用例,使每个判定中的所有可能条件取值组合至少执行一次。

    (例略)

     

    26.等价分类法的测试技术采用的一般方法?举例说明?

    (1) 为每个等价类编号;

    (2) 设计一个新的测试方案,以尽可能多的覆盖尚未被覆盖的有效等价类,重复这一步骤,直到所有有效等价类被覆盖为止。

    (3) 设计一个新的测试方案,使它覆盖一个尚未被覆盖的无效等价类, 重复这一步骤,直到所有无效等价类被覆盖为止。

    (例略)

     

    29.为什么说软件的维护是不可避免的?

    因为软件的开发过程中,一般很难检测到所有的错误,

    其次软件在应用过程中需要随用户新的要求或运行环境的变化而进行软件的修改或完成功能的增删等,为了提高软件的应用水平和使用寿命,软件的维护是不可避免的。

     

    30.软件的维护一般分为哪几类?

    完善性维护:满足用户在使用过程中提出增加新的功能或修改已有功能,以满足用户日益增长的需要而进行的工作; 适应性维护:是软件适应新的运行环境而进行的工作; 纠错性维护:纠正开发期间未发现的遗留错误,即在程序使用期间发现的程序错误进行诊断和改正的过程;

    预防性维护:为了改善未来的可维护性或可靠性而修改软件的工作。

     

    31.决定软件可维护性的因素?

    (1) 软件的可理解性、可测试性、可修改性;

    (2) 文档描述符合要求、用户文档简洁明确、系统文档完整并且标准。

     

    32.分析软件危机产生的主要原因有哪些?

    导致软件危机的主要原因有:

    (1)软件日益复杂和庞大

    (2)软件开发管理困难和复杂

    (3)软件开发技术落后

    (4)生产方式落后

    (5)开发工具落后

    (6)软件开发费用不断增加

     

    33.说明结构化程序设计的主要思想是什么?

    (1)自顶向下、逐步求精的程序设计方法。

    (2)使用3种基本控制结构、单入口、单出口来构造程序。

     

    34、软件测试的基本任务是什么?测试与纠错有什么区别?

    软件测试的基本任务是通过在计算机上执行程序,暴露程序中潜在的错误。测试和纠错目的和任务都不相同,测试是为了发现程序的错误,纠错是为了定位和纠正错误,从而消除软件故障,保证程序的可靠运行。

     

    35.软件测试包括哪些步骤?同时说明这些步骤的测试目的是什么?

    (1)单元测试,目的是代码达到模块说明书的要求。

    (2)集成测试,目的是将经过单元测试的模块逐步组装成具有良好一致性的完整的程序。

    (3)确认测试,目的是确认程序系统是否满足软件需求规格说明书的要求。

    (4)系统测试,目的是检查能否与系统的其余部分协调运行,并且完成SRS对他的要求。

     

    36.需求分析与软件设计二个阶段任务的主要区别是什么?

    需求分析定义软件的用户需求,即定义待开发软件能做什么。

    软件设计定义软件的实现细节以满足用户需求,即研究如何实现软件。

     

    37.说明软件测试和调试的目的有何区别?

    测试的目的是判断和发现软件是否有错误

    调试的目的是定位软件错误并纠正

     

    43、什么是软件复用?简述软件复用和软件共享、软件移植的差别。

    软件复用是指在构造新的软件系统的过程中,对已存在的软件人工制品的使用技术。如果是在一个系统中多次使用一个相同的软件成分,这叫软件共享;对一个软件进行修改,使它能运行于新的软、硬件平台这称作软件移植。

     

    44、什么是软件再工程?软件再工程的主要活动有哪些?

    软件再工程是运用逆向工程、重构等技术,在充分理解原有软件的基础上,进行分解、综合,并重新构建软件,用以提高软件的可理解性、可维护性、可复用性或演化性。主要活动:信息库分析、文档重构、逆向工程、代码重构、数据重构、正向工程。

    展开全文
  • 软件工程知识

    2012-12-02 21:34:25
    系统分析是软件项目的高层分析,需要获取的是有关系统的框架描述,并需要使系统从它所处的环境中分离出来,为划分系统边界与确定系统构架提供依据。 (3)系统分析模型 分析模型是指采用作图方式系统进行直观的...
  • 上节我们完成了神经网络基本框架搭建,当时剩下了最重要一个接口train,也就是通过读取...第二步是将计算结果与正确结果相比,获取误差,采购采用我们前面描述的误差反向传播更新网络里每条链路权重。 ...

    上节我们完成了神经网络基本框架的搭建,当时剩下了最重要的一个接口train,也就是通过读取数据自我学习,进而改进网络识别效率的功能尚未实现,从本节开始,我们着手实现该功能。

    自我训练过程分两步走,第一步是计算输入训练数据,给出网络的计算结果,这点跟我们前面实现的query()功能很像。第二步是将计算结果与正确结果相比对,获取误差,采购采用我们前面描述的误差反向传播法更新网络里的每条链路权重。

    我们先用代码完成第一步,代码如下:

    def  train(self, inputs_list, targets_list):
            #根据输入的训练数据更新节点链路权重
            '''
            把inputs_list, targets_list转换成numpy支持的二维矩阵
            .T表示做矩阵的转置
            '''
            inputs = numpy.array(inputs_list, ndmin=2).T
            targets = numpy.array(targets_list, nmin=2).T
            #计算信号经过输入层后产生的信号量
            hidden_inputs = numpy.dot(self.wih, inputs)
            #中间层神经元对输入的信号做激活函数后得到输出信号
            hidden_outputs = self.activation_function(hidden_inputs)
            #输出层接收来自中间层的信号量
            final_inputs = numpy.dot(self.who, hidden_outputs)
            #输出层对信号量进行激活函数后得到最终输出信号
            final_outputs = self.activation_function(final_inputs)

    函数的实现跟我们在上一节对query函数的实现逻辑是一样的,不同在于它多了两个输入函数inputs_list和targets_list,这两个参数分别代表输入的训练数据,已经训练数据对应的正确结果。函数中有一点知道注意的是,我们要把输入的参数转换成numpy类型的二维矩阵,输入的inputs_list类型是二维列表,它跟二维矩阵不同,如果不转换成numpy支持的二维矩阵,那么numpy导出的很多计算函数就无法使用,例如做矩阵点乘的dot函数,举个例子:

    l = [[1,2],[3,4]]
    print("origin l is {0}".format(l))
    ll = numpy.array(l, ndmin=2)
    print(ll)

    l对应的就是一个二维列表,它调用numpy.array转换格式后,输出如下:

    这里写图片描述

    上面代码根据输入数据计算出结果后,我们先要获得计算误差,误差就是用正确结果减去网络的计算结果。在代码中对应的就是(targets - final_outputs).我们前面讲过,在误差回传时,要根据链路的权重来把误差分配给每条链路,然后节点再把由它发出的每条链路分配到的误差加总起来,例如下面网络:

    这里写图片描述

    中间层节点1对应的误差是两条链路分配到的误差之后,中间层节点1到最外层节点1链路会分配到一部分误差,中间层节点1和最外层节点2之间的链路会分配到一部分误差,这两部分误差合在一起就是中间层节点1的得到的误差。由此,中间层节点对应的误差就可以通过下面公式计算:

    这里写图片描述

    回忆一下Weight(hidden_output)矩阵格式,它是一个二维数组,对应着中间层节点到做外层节点的链路权重所组成的矩阵二维矩阵,对应于上面网络就是:

    [w(11), w(21)
     W(12), w(22)
    ]

    errors(output)对应于上面网络就是:

    [e1,
     e2
    ]

    把上面矩阵做转置后在与errors向量做点乘就是:

    [                       [
    w(11), w(12)             e1
    w(21), w(22)       *     e2
    ]                       ]
    =  [w(11)*e1+w(12)*e2 , w(21)*e1 + w(22)*e2]

    其中w(11)*e1+w(12)*e2就是中间层节点1根据反向传播后得到的误差。当我们要改进中间层到最外层间链路权重时,我们需要output_errors,当我们要修改输入层与中间层的链路权重时,我们需要hidden_errors,相应代码实现如下:

    #计算误差
    output_errors = targets - final_outputs
    hidden_errors = numpy.dot(self.who.T, output_errors)

    前面我们已经推导出链路权重更新的公式:

    这里写图片描述

    上面公式最前面的a对应的就是学习率,sigmoid对应的就是代码中的self.activation_function,其中的’*’表示普通数值乘法,而符号’.’表示向量乘法,计算出上面的权重更新后,原有权重要加上这个更新数值。我们用代码实现如下:

            #根据误差计算链路权重的更新量,然后把更新加到原来链路权重上
            self.who += self.lr * numpy.dot((output_errors * final_outputs *(1 - final_outputs)),
                                           numpy.transpose(hidden_outputs))
            self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1 - hidden_outputs)),
                                           numpy.transpose(inputs))

    上面代码不好理解,可以把上面代码对应到下面公式:
    这里写图片描述

    上图是我们以前讲过的内容,后面横着的(O1,O2…)对应代码中的numpy.transpose(hidden_outputs),其中的E1, E2 …对应的就是output_errors,而S1*(1-S1), S2*(1-S2)….对应final_outputs*(1-final_outputs)。至此网络自我训练的代码就完成了,train函数的整体代码如下:

    def  train(self, inputs_list, targets_list):
            #根据输入的训练数据更新节点链路权重
            '''
            把inputs_list, targets_list转换成numpy支持的二维矩阵
            .T表示做矩阵的转置
            '''
            inputs = numpy.array(inputs_list, ndmin=2).T
            targets = numpy.array(targets_list, nmin=2).T
            #计算信号经过输入层后产生的信号量
            hidden_inputs = numpy.dot(self.wih, inputs)
            #中间层神经元对输入的信号做激活函数后得到输出信号
            hidden_outputs = self.activation_function(hidden_inputs)
            #输出层接收来自中间层的信号量
            final_inputs = numpy.dot(self.who, hidden_outputs)
            #输出层对信号量进行激活函数后得到最终输出信号
            final_outputs = self.activation_function(final_inputs)
    
            #计算误差
            output_errors = targets - final_outputs
            hidden_errors = numpy.dot(self.who.T, output_errors)
            #根据误差计算链路权重的更新量,然后把更新加到原来链路权重上
            self.who += self.lr * numpy.dot((output_errors * final_outputs *(1 - final_outputs)),
                                           numpy.transpose(hidden_outputs))
            self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1 - hidden_outputs)),
                                           numpy.transpose(inputs))
            pass

    接下来我们就得拿实际数据来训练我们的神经网络了,在最开始时,我们曾经用MNIST数字图片来进行识别,现在我们使用一种cvs格式的数据来训练,其下载路径如下:

    https://raw.githubusercontent.com/makeyourownneuralnetwork/makeyourownneuralnetw ork/master/mnist_dataset/mnist_test_10.csv

    上面数据下载后格式如下:
    这里写图片描述

    第一个数字表示的是图片对应的数字,根据上面例子,第一个数字是7,接下来有28*28 = 768个数字,对应的其实是一张黑白图片的像素点,经过第一节的同学能看过这样的数字图片。根据链接把数据下载后,我们用代码将其读入程序中:

    #open函数里的路径根据数据存储的路径来设定
    data_file = open("/Users/chenyi/Documents/人工智能/mnist_test_10.csv")
    data_list = data_file.readlines()
    data_file.close()
    len(data_list)
    data_list[0]

    上面代码运行后结果如下:

    这里写图片描述

    注意看,后面28*28个数值中,每个数字都不超过256,也就是数字表示的是像素点的灰度,值越大,颜色就越倾向于黑色。我们用代码把数字画出来,看看其是否真的对应一个数子:

    import numpy
    import matplotlib.pyplot
    %matplotlib inline
    #把数据依靠','区分,并分别读入
    all_values = data_list[0].split(',')
    #第一个值对应的是图片的表示的数字,所以我们读取图片数据时要去掉第一个数值
    image_array = numpy.asfarray(all_values[1:]).reshape((28, 28))
    matplotlib.pyplot.imshow(image_array, cmap='Greys', interpolation='None')

    数据读入时,每个数字其实都是字符,asfarray把all_values里面的数字字符全部转换成浮点数,reshape((28,28)),把含有768个元素的all_values列表转换成28行28列的二维数组,上面代码运行后结果如下:

    这里写图片描述

    从绘制的结果看,数据代表的确实是一个黑白图片的手写数字。数据读取完毕后,我们再对数据格式做些调整,以便输入到神经网络中进行分析。我们需要做的是将数据“正规化”,也就是把所有数值全部转换到0.01到1.0之间,由于表示图片的二维数组中,每个数大小不超过255,由此我们只要把所有数组除以255,就能让数据全部落入到0和1之间,有些数值虽然很小,除以255后会变为0,这样会导致链路权重更新出问题,所以我们需要把除以255后的结果先乘以0.99,然后再加上0.01,这样所有数据就处于0.01到1之间。代码实现为:

    scaled_input = image_array / 255.0 * 0.99 + 0.01
    print(scaled_input)

    上面代码运行后结果如下:

    这里写图片描述

    从下节开始,我们把处理好的数据传入网络,看看它是怎么从数据中学习,最终能练就识别手写数字图片的能力的。

    更详细的讲解和代码调试演示过程,请点击链接

    更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
    这里写图片描述

    展开全文
  • STM32G是意半导体这年新推出系列芯片,相比原先F系列芯片有很多提升,将来必将取代F系列芯片地位。对于新芯片应用来说能够正确下载与运行程序是比较重要一点,这篇文章将 STM32G0 系列芯片...

    目的

    STM32G是意法半导体这两年新推出的系列芯片,相比原先的F系列的芯片有很多提升点,将来必将取代F系列芯片的地位。对于新芯片的应用来说能够正确下载与运行程序是比较重要的一点,这篇文章将对 STM32G0 系列芯片的启动配置与程序下载做个简单的说明。

    启动配置

    STM32G0系列芯片的启动配置相关内容在官方文档《AN5096:Getting started with STM32G0 Series hardware development》第三章中有详细的描述:
    在这里插入图片描述
    启动配置相关内容其实是不多的,下面将对这部分内容做个简单的说明。

    STM32系列芯片程序启动方式分为下面三种:

    • Main Flash memory 从主闪存启动,想要运行我们自己的程序就要选择这种方式;
    • System memory 从系统存储区启动,想要通过串口下载程序就要选择这种方式;
    • Embbeded SRAM 从内存启动;

    STM32G0系列芯片通过选项字节(option byte)中的 BOOT_LOCKnBOOT1nBOOT_SELnBOOT0这几位加上外部的 BOOT0 管脚的电平来确定启动方式。当 nBOOT_SEL0 时, BOOT0 的值来源于外部的 BOOT0 管脚的电平,低电平为 0 ,高电平为 1 ;当 nBOOT_SEL1 时, BOOT0 的值来源于 nBOOT0 的值。

    芯片启动时会检查闪存地址0x080000000(即用户程序起始地址)处的数据,如果该数据为0xFFFFFFFF则表示用户程序为空,此时不管上面的那些设置程序会从 System memory 启动。

    芯片在出厂后只要没有经过程序下载等操作启动时总是会从 System memory 启动。

    程序下载

    STM32系列系统程序下载通常通过串口进行,而使用串口下载程序重要的是要让芯片从 System memory 启动。

    从上一章节内容可以知道芯片在初次烧写时就是从 System memory 启动的,你可以正常使用串口进行连接烧写,不需要关心外部 BOOT0 管脚的电平,如果连接不上就拉低下芯片 NRST 引脚复位下芯片试试。(如果还是连接不上就检查下芯片供电、线路连接、串口模块、串口驱动等试试。

    在初次连接芯片烧写程序前特别需要注意的一点是配置选项字节(option byte)。默认情况下 nBOOT_SELnBOOT0 均为 1 ,也就是当你在这种情况下下载程序后下次芯片上电时将从 Main Flash memory 启动(不管外部BOOT0引脚上的电平是多少)。如果你下载的程序中没有操作对 nBOOT_SELnBOOT0 进行操作的话你再也无法通过串口重新下载程序或是修改选项字节了。
    在这里插入图片描述

    补救办法有,那就是通过ST-LINK连接芯片进行程序擦写或是修改选项字节。(修改完成后可能需要芯片断电然后重新上电才能通过串口连接)
    在这里插入图片描述

    如果更严重点,程序中把ST-LINK连接需要的 SWDIOSWCLK 引脚用作它用了,ST-LINK也连接不上怎么办?解决方法也有,断开这两个引脚上别的电路连接,然后将芯片的 NRST 引脚保持下拉,这时候 STM32CubeProgrammer 上选择ST-LINK点击Connect,然后断开 NRST 的下拉,芯片会在启动的一瞬间被ST-LINK连接上。

    总结

    了解上面内容后在STM32G0系列芯片上下载与运行程序应该就没什么问题了,配合STM32Cube等就可以愉快的使用新系列的芯片了。

    展开全文
  • matlab中曲线拟合与插值

    万次阅读 2010-09-10 23:57:00
    在插值里,数据假定是正确的,要求以某种方法描述数据之间所发生的情况。这种方法在下一节讨论。这里讨论的方法是曲线拟合或回归。人们设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过任何数据。图11.1...

    曲线拟合与插值
    在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。对这个问题有两种方法。在插值法里,数据假定是正确的,要求以某种方法描述数据点之间所发生的情况。这种方法在下一节讨论。这里讨论的方法是曲线拟合或回归。人们设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过任何数据点。图11.1说明了这两种方法。标有'o'的是数据点;连接数据点的实线描绘了线性内插,虚线是数据的最佳拟合。
    11.1 曲线拟合
    曲线拟合涉及回答两个基本问题:最佳拟合意味着什么?应该用什么样的曲线?可用许多不同的方法定义最佳拟合,并存在无穷数目的曲线。所以,从这里开始,我们走向何方?正如它证实的那样,当最佳拟合被解释为在数据点的最小误差平方和,且所用的曲线限定为多项式时,那么曲线拟合是相当简捷的。数学上,称为多项式的最小二乘曲线拟合。如果这种描述使你混淆,再研究图11.1。虚线和标志的数据点之间的垂直距离是在该点的误差。对各数据点距离求平方,并把平方距离全加起来,就是误差平方和。这条虚线是使误差平方和尽可能小的曲线,即是最佳拟合。最小二乘这个术语仅仅是使误差平方和最小的省略说法。


    在MATLAB中,函数polyfit求解最小二乘曲线拟合问题。为了阐述这个函数的用法,让我们以上面图11.1中的数据开始。
     x=[0.1.2.3.4.5.6.7.8.91];
     y=[-.4471.9783.286.167.087.347.669.569.489.3011.2];
    为了用polyfit,我们必须给函数赋予上面的数据和我们希望最佳拟合数据的多项式的阶次或度。如果我们选择n=1作为阶次,得到最简单的线性近似。通常称为线性回归。相反,如果我们选择n=2作为阶次,得到一个2阶多项式。现在,我们选择一个2阶多项式。
     n=2;%polynomial order
     p=polyfit(x, y, n)
    p =
    -9.810820.1293-0.0317
    polyfit 的输出是一个多项式系数的行向量。其解是y = -9.8108x2 +20.1293x-0.0317。为了将曲线拟合解与数据点比较,让我们把二者都绘成图。
     xi=linspace(0, 1, 100);%x-axis data for plotting
     z=polyval(p, xi);
    为了计算在xi数据点的多项式值,调用MATLAB的函数polyval。
     plot(x, y, ' o ' , x, y, xi, z, ' : ' )
    画出了原始数据x和y,用'o'标出该数据点,在数据点之间,再用直线重画原始数据,并用点' : '线,画出多项式数据xi和z。
     xlabel(' x '), ylabel(' y=f(x) '), title(' Second Order Curve Fitting ')
    将图作标志。这些步骤的结果表示于前面的图11.1中。
    多项式阶次的选择是有点任意的。两点决定一直线或一阶多项式。三点决定一个平方或2阶多项式。按此进行,n+1数据点唯一地确定n阶多项式。于是,在上面的情况下,有11个数据点,我们可选一个高达10阶的多项式。然而,高阶多项式给出很差的数值特性,人们不应选择比所需的阶次高的多项式。此外,随着多项式阶次的提高,近似变得不够光滑,因为较高阶次多项式在变零前,可多次求导。例如,选一个10阶多项式
     pp=polyfit(x, y, 10) ;
     format short e%change display format
     pp.'%display polynomial coefficients as a column
    ans =
    -4.6436e+005
    2.2965e+006
    -4.8773e+006
    5.8233e+006
    -4.2948e+006
    2.0211e+006
    -6.0322e+005
    1.0896e+005
    -1.0626e+004
    4.3599e+002
    -4.4700e-001
    要注意在现在情况下,多项式系数的规模与前面的2阶拟合的比较。还要注意在最小(-4.4700e-001)和最大(5.8233e+006)系数之间有7个数量级的幅度差。将这个解作图,并把此图与原始数据及2阶曲线拟合相比较,结果如何呢?
     zz=polyval(pp, xi);%evaluate 10th order polynomial
     plot(x, y, ' o ' , xi, z, ' : ' , xi, zz)%plot data
     xlabel(' x '),ylabel(' y=f(x) '),title(' 2nd and 10th Order curve Fitting ')
    在下面的图11.2中,原始数据标以'o',2阶曲线拟合是虚线,10阶拟合是实线。注意,在10阶拟合中,在左边和右边的极值处,数据点之间出现大的纹波。当企图进行高阶曲线拟合时,这种纹波现象经常发生。根据图11.2,显然,‘ 越多就越好 ’的观念在这里不适用。

    11.2 一维插值
    正如在前一节对曲线拟合所描述的那样,插值定义为对数据点之间函数的估值方法,这些数据点是由某些集合给定。当人们不能很快地求出所需中间点的函数值时,插值是一个有价值的工具。例如,当数据点是某些实验测量的结果或是过长的计算过程时,就有这种情况。
    或许最简单插值的例子是MATLAB的作图。按缺省,MATLAB用直线连接所用的数据点以作图。这个线性插值猜测中间值落在数据点之间的直线上。当然,当数据点个数的增加和它们之间距离的减小时,线性插值就更精确。例如,
     x1=linspace(0, 2*pi, 60);
     x2=linspace(0, 2*pi, 6);
     plot(x1, sin(x1), x2, sin(x2), ' - ')
     xlabel(' x '),ylabel(' sin(x) '),title(' Linear Interpolation ')

    如曲线拟合一样,插值要作决策。根据所作的假设,有多种插值。而且,可以在一维以上空间中进行插值。即如果有反映两个变量函数的插值,z=f(x, y),那么就可在x之间和在y之间,找出z的中间值进行插值。MATLAB在一维函数interp1和在二维函数interp2中,提供了许多的插值选择。其中的每个函数将在下面阐述。
    为了说明一维插值,考虑下列问题,12小时内,一小时测量一次室外温度。数据存储在两个MATLAB变量中。
     hours=1:12;%index for hour data was recorded
     temps=[5 89152529313022252724]; %recorded temperatures
     plot(hours, temps, hours, temps,' + ')%view temperatures
     title(' Temperature ')
     xlabel(' Hour '),ylabel(' Degrees Celsius ')

     

    MATLAB画出了数据点线性插值的直线。为了计算在任意给定时间的温度,人们可试着对可视的图作解释。另外一种方法,可用函数interp1。
     t=interp1(hours, temps, 9.3)%estimate temperature at hour=9.3
    t =
    22.9000
     t=interp1(hours, temps, 4.7)%estimate temperature at hour=4.7
    t =
    22
     t=interp1(hours, temps, [3.26.57.111.7])%find temp at many points!
    t =
    10.2000
    30.0000
    30.9000
    24.9000
    interp1的缺省用法是由interp1(x, y, xo)来描述,这里x是独立变量(横坐标),y是应变量(纵坐标),xo是进行插值的一个数值数组。另外,该缺省的使用假定为线性插值。
    若不采用直线连接数据点,我们可采用某些更光滑的曲线来拟合数据点。最常用的方法是用一个3阶多项式,即3次多项式,来对相继数据点之间的各段建模,每个3次多项式的头两个导数与该数据点相一致。这种类型的插值被称为3次样条或简称为样条。函数interp1也能执行3次样条插值。
     t=interp1(hours, temps, 9.3, ' spline ')%estimate temperature at hour=9.3
    t =
    21.8577
     t=interp1(hours, temps, 4.7, ' spline ')%estimate temperature at hour=4.7
    t =
    22.3143
     t=interp1(hours, temps, [3.26.57.111.7], ' spline ')
    t =
    9.6734
    30.0427
    31.1755
    25.3820
    注意,样条插值得到的结果,与上面所示的线性插值的结果不同。因为插值是一个估计或猜测的过程,其意义在于,应用不同的估计规则导致不同的结果。
    一个最常用的样条插值是对数据平滑。也就是,给定一组数据,使用样条插值在更细的间隔求值。例如,
     h=1:0.1:12;%estimate temperature every 1/10 hour
     t=interp1(hours, temps, h, ' spline ') ;
     plot(hours, temps, ' - ' , hours, temps, ' + ' , h, t)%plot comparative results
     title(' Springfield Temperature ')
     xlabel(' Hour '),ylabel(' Degrees Celsius ')
    在图11.5中,虚线是线性插值,实线是平滑的样条插值,标有' + '的是原始数据。如要求在时间轴上有更细的分辨率,并使用样条插值,我们有一个更平滑、但不一定更精确地对温度的估计。尤其应注意,在数据点,样条解的斜率不突然改变。作为这个平滑插值的回报,3次样条插值要求更大量的计算,因为必须找到3次多项式以描述给定数据之间的特征。

    展开全文
  • 语音识别MATLAB实现

    热门讨论 2009-03-03 21:39:18
    这里采用的是Levinson-Durbin。由上面的式子有: 其中, 为待分析与引信号的自相关序列: 因此:Levinson-Durbin算法为: 1. 初始化: 2. 迭代计算:对于 3. 最后就算: 以上式中的 为...
  • 3.7.2 模式结构的正确命名 53 3.7.3 ER概念设计设计选择 54 3.7.4 ER图候选表示 55 3.8 其他表示示例:UML类图 55 3.9 高于2度联系类型 57 3.9.1 二元和三元(或高度)联系选择 ...
  • 不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? *3.4 有这样一个巧妙的表达式:a^=b^=a^=b;它不需要临时变量就可以交换a和b的值。 3.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副...
  • LINGO软件学习

    2009-08-08 22:36:50
    注意如果派生集B父集是另外派生集A,那么上面所说原始父集是集A向前回溯到最终原始集,其顺序保持不变,并且派生集A过滤器派生集B仍然有效。因此,派生集索引个数是最终原始父集个数,索引取值是...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? 34  *3.4 有这样一个巧妙的表达式:a^= b^= a^= b; 它不需要临时变量就可以交换a和b的值。 34 3.5 可否用显式括号来强制执行我所需要的计算顺序并...
  • 曲线拟合与插值

    千次阅读 2006-08-08 21:56:00
    在插值里,数据假定是正确的,要求以某种方法描述数据之间所发生的情况。这种方法在下一节讨论。这里讨论的方法是曲线拟合或回归。人们设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过任何数据。图11.1...
  • 不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? 34  *3.4 有这样一个巧妙的表达式:a^= b^= a^= b; 它不需要临时变量就可以交换a和b的值。 34 3.5 可否用显式括号来强制执行我所需要的计算顺序并...
  • 那段日子每天到两点是肯定,不过也正是又一次把自己逼出了舒适区,让自己至少从业务产品角度看到一个技术方案脑子里是有一个清晰全貌。当然这个全貌不是整个电商线全链路,交易详情下单那些...
  • (24) 建立良好的程序设计风格,下面描述正确的是(A) 注:P48 A. 程序应简单、清晰、可读性好 B. 符号名的命名要符合语法 C. 充分考虑程序的执行效率 D. 程序的注释可有可无 (25) 下面对对象概念描述错误的是(A) 注...
  • (24) 建立良好的程序设计风格,下面描述正确的是______。(A) A. 程序应简单、清晰、可读性好 B. 符号名的命名要符合语法 C. 充分考虑程序的执行效率 D. 程序的注释可有可无 (25) 下面对对象概念描述错误的是______...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    3, 有的为4, 哪个是正确的? . . . . . . . . . . . . . . . . . . . . . 14 3.4 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换a 和b 的值。. . . . . . . . . . . . . . . . . . . . . . ....
  • 2.4.5 以下STORE ANDFORWARD描述正确的是? 2.4.6 以下交换机工作方式描述正确的是? 2.4.7 VLAN的主要作用有? 2.4.8 在交换机中用户权限分为几个级别? 2.4.9 在路由器的配置过程中查询以S开头所有命令的...
  • 读者能有正确的软件版权意识,这样才能更好地为我国软件事业增添光 彩,为打造良好的应⽤市场以及⽣态环境作出贡献。因此,本书主要选择 使⽤GCC、Clang这个主流开源免费的C语⾔编译器,⽽集成开发环境 (IDE)则...
  • 理解大o推导不算难,难的其实是数列的一些相关运算,这考察的更多的是数学知识和能力。 2.9.1算法时间复杂度定义 29 2.9.2推导大o阶方法 30 2.9.3常数阶 30 2.9.4线性阶 31 2.9.5对数阶 32 2.9.6平方阶 32 2.10...
  • 第6章 用况:过程的描述 6.1 导言 6.2 活动及其相互间依赖关系 6.3 用况 6.3.1 高层用况举例:购买商品 6.3.2 扩展用况举例:用现金购买商品 6.3.3 扩展格式说明 6.4 参与者 6.5 使用用况...
  • 理解大o推导不算难,难的其实是数列的一些相关运算,这考察的更多的是数学知识和能力。 2.9.1算法时间复杂度定义 29 2.9.2推导大o阶方法 30 2.9.3常数阶 30 2.9.4线性阶 31 2.9.5对数阶 32 2.9.6平方阶 32 2.10...
  • 大话数据结构

    2019-01-10 16:35:22
    理解大o推导不算难,难的其实是数列的一些相关运算,这考察的更多的是数学知识和能力。 2.9.1算法时间复杂度定义 29 2.9.2推导大o阶方法 30 2.9.3常数阶 30 2.9.4线性阶 31 2.9.5对数阶 32 2.9.6平方阶 32 2.10...
  • 大话数据结构 程杰

    2018-09-01 10:06:43
    理解大o推导不算难,难的其实是数列的一些相关运算,这考察的更多的是数学知识和能力。 2.9.1算法时间复杂度定义 29 2.9.2推导大o阶方法 30 2.9.3常数阶 30 2.9.4线性阶 31 2.9.5对数阶 32 2.9.6平方阶 32 2.10...
  • 2.7.1 事后统计方法 24 2.7.2 事前分析估算方法 25 2.8 函数的渐近增长 27 2.9 算法时间复杂度 29 理解大O推导不算难,难的其实是数列的一些相关运算,这考察的更多的是数学知识和能力。 2.9.1 算法时间复杂度...

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

对两点法描述正确的是