计算机程序的构造和解释(SICP) Lec2b 复合数据 的个人心得

本文介绍了通过数据抽象构建有理数计算系统的过程,探讨了使用MAKE-RAT、NUMER和DENOM构造函数和选择函数的好处,以及如何通过抽象层降低复杂性。通过示例展示了如何利用序对数据结构实现点和线段的表示,强调了抽象思维在控制程序复杂度中的重要性。

视频地址
https://www.bilibili.com/video/BV1Xx41117tr

在设计一个复杂的计算机系统的时候,如果是要处理分数之间的计算,要如何实现呢?

文中给出了一种假设法

在这里插入图片描述
假设有一个函数MAKE-RAT(第一行),用于记录这个分数,N和D变量表示分子和分母,使用愿望思维,不必关心他是如何实现的,你就当他已经实现了
如何第二行和第三行的NUMER和DENOM分别是MAKE-RAT下的方法,用于取出MAKE-RAT表示的分子和分母
所以这么做的好处是什么呢?
在这里插入图片描述
比如我们要使用XY(XY都是分数),我们就可以使用MAKE-RAT用分子乘分子,分母乘分母
(NUMER X)(NUMER Y))
(*(DENOM X)(DENOM Y))

这么做有什么好处吗?

试问如果不用这种表示方式,每个分子和分母都用不同的变量名来命名我们会得到
在这里插入图片描述
那只要进行一个分数乘法就需要四个变量来记录,这对于我们的使用是非常繁琐不必要的。如果这样的捆绑数据20个为一组?那还咋用

好的,那么现在,我们给MAKE-RAT命名为有理数的构造函数

NUMER 和 DENOM 为选择函数

现在使用这两种方式进行编程
在这里插入图片描述
MAKE-RAT定义一个A和B再使用+RAT来计算得出的结果,我们会发现得到的不是想要的3/4而是6/8
因为+RAT只是把分子乘分母的和(1x4+1x2) 和分母乘分母(2x4)拼接在一起并没有进行约分,那么可以进行改进,改进后为
在这里插入图片描述
在MAKE-RAT中加入一个过程,在构造一个分数的时候自动求出公约数,然后用分子和分母去除以这个公约数,得到的就会是约分后的结果(框起来的这部分就是调用了MAKE-RAT)
在这里插入图片描述
OK那到现在,我们就完成了一个完整的有理数计算系统。我们有+RAT,
*RAT,-RAT等方法,我们是使用了序对来实现了数据的表示(也就是分子和分母的绑定数据),在中间有一个抽象层,就是构造函数和选择函数(看下图)
在这里插入图片描述
这就是数据抽象的形式,在编程的时候不需要关心构造函数如何实现,也不需要关心数据,只是计算方法和构造函数之间的编程。
通过抽象层将数据对象的表示和使用分离开来
那么数据抽象有什么意义呢?我们不使用数据抽象的方式,也可以达成有理数的计算
在这里插入图片描述
图中直接使用了car和cdr表示了分子和分母,省去了中间繁琐的抽象层,但是这么做相比上一个方式有什么区别呢?很明显,我们没有一个值去表示分子和分母了。在程序中需要有一个名字去控制一个值,这样就可以实现解耦以及更高的灵活性。如果是使用上图方法定义的话,现在是实现了+RAT,如果还有x RAT -RAT。那就得重复的写这个约分的步骤。接下来我们继续展示另外一种化简的方式
在这里插入图片描述
我们改变了选择函数NUMBER和DENOM。使它再被调用的时候进行简化,而不是有理数在构造的时候。这种方式和上一种方式各有千秋,如果我们的系统经常构造有理数,那么在创建的时候最好不要简化,可以提升性能,但是如果我们经常需要使用一个有理数的时候,那么在构建初期就简化可以一劳永逸。

小结

在构建一个系统的时候,有时找不到一个合适的解决方式,最高性能的方式就是在使用之前不去决定采取那种方式,那么采取数据抽象就是一个很好的方式,你只需要按照愿望思维编程而并不需要关心他如何实现。在你真正需要使用的时候再采取处理方式(就好像java中的接口,不需要管如何实现,你就当他已经实现了。到了真正要使用的时候,再去完善实现类。)


以上,我们使用了序对的数据结构和抽象层来完成了一个有理数计算系统。举个例子,现在要构建一个更为复杂的二维点处理系统。
比如我们有一个点P坐标x:1,y:2
使用同样的数据结构来表示这个点
MAKE-VECTOR构造函数
XCOR,YCOR为选择函数
在这里插入图片描述
之后又出现了一个点Q(x:2,y:3),我们希望可以表示这个线段,于是在这个基础上又出现了另外一个抽象层
MAKE-SEG为构造函数
seg-start,seg-end分别表示起点和终点(P和Q)
在这里插入图片描述
那么现在的系统结构是这样的
其中包含了两个抽象层
在这里插入图片描述

那么现在系统构建好了,假如我们要求P,Q线段的中点,我们就可以使用如下的方法
在这里插入图片描述
使用seg-start和seg-end获取线段的起点和终点,然后在使用XCOR以及YCOR分别取得两个点所代表的的X,Y。将两个X和Y相减,得出一个新的X和Y。使用构造方法MAKE-VECTOR再次构造一个点,这就取得了线段PQ的中点

这里需要提一个很自然但是需要注意的点
点是由两个数组成的序对表示的,线段是由两个序对组成的序对表示的
序对是可以由序对组合而成的,组合成后他们就是一个整体,术语称为“闭包”(closure)
在这里插入图片描述
具有闭包性质的组合方法组合出来的元素,是可以继续使用其来构建更复杂的元素,这是一种控制系统复杂度的方法,就像上面那样
假设如果我们不使用这种抽象层的控制复杂度的方法,那么系统复杂度就会失控

s == 线段
CAR == 函数,表示取出序对的左半部分
CDR == 函数,表示取出序对的右半部分
求中点坐标

s.CAR.CAR - s.CDR.CAR == 中点的X坐标
s.CAR.CDR - s.CDR.CDR == 中点的Y坐标
(s.CAR.CAR - s.CDR.CAR,s.CAR.CDR - s.CDR.CDR)中点坐标X,Y
现在需求变了,Y要放在前面
(s.CAR.CDR - s.CDR.CDR,s.CAR.CAR - s.CDR.CAR)中点坐标Y,X

如果程序更为复杂,复杂度肯定会失控
所以抽象的表示,才是构建系统以及程序的最佳表示。
总所周知,程序就是由数据结构和算法组合而成的。那么抽象的思维是必不可少的。

(课中用到了许多数学知识,勾股定理我都快忘了,得找到自己的理解方式,- -不然得找时间补数学了)


OK,那么回到最开始的地方,我们用MAKE-RAT和NUMER ,DENOM来表示一个有理数,我们使用了模糊的抽象过程来代替有理数的具体表示。
仔细想想,为什么我们可以用这样的数据抽象来代表具体的数据呢?
总不可能是因为我说他是,他就是了吧?这里的构造函数并不是想当然的,这个抽象也必须遵循规则。那么我们如何定义所谓的规则才比较合适呢?我们来带入一下
在这里插入图片描述
如果x是一个有理数,用MAKE-RAT(参数N,D)来表示,可以得知,NUMER X/DENOM X是等于N/D的。
那么有理数到底是什么呢?如果现在在抽象层之上讨论的话,有理数就是满足构造函数公理的过程
在这里插入图片描述
所以现在我们会想当然的把有理数理解成一个序对,一开始我们忽略了序对,说他是语言中自带的过程,实际上我撒了谎,那么序对究竟是什么?
在这里插入图片描述
序对可以是上述的过程,里面有cons,car和cdr的方法和构造函数没什么区别。你会发现序对实际上和上面的有理数的表示没有什么区别,他们都是一些公理
在这里插入图片描述
这里我们展示了序对的一种实现,实际上cons是一个过程,他有参数a和b他返回一个过程pick,当pick=1的时候返回a,pick=b的时候返回b。
当应用car方法的时候吧x当成1,应用cdr的时候吧x当成2
因为cons产生了一个过程,car把它应用于1,cdr把它应用于2
那么注意这其中是没有任何数据的,他也都是一些过程
下面我们来证明cons这个过程同样满足公理
在这里插入图片描述
随意带入37,49两个参数,用代换模型去替换参数得到
注意这里cons返回的是一个过程,就是下面lambda表示的部分
在这里插入图片描述
所以现在我们使用car选择函数带入1(用1替换pick),我们得到了37
在这里插入图片描述
在这里插入图片描述
我们发现了一个很恐怖的事情,那就是构建数据抽象完全不需要用到数据,我们可以用过程做所有的事情。
换句话说系统并不在乎你传递的是一个过程还是一个数据,这都不重要,对于系统来说他都是一个对象。
所以这就涉及到了这本书中所表达的,接下来也会不断体现的,过程和数据的边界会越来越模糊。
总结:所有的构造方法,抽象层,甚至数据的表示都是满足公理的过程,其中并不需要数据,我们可以使用抽象来做所有事。我们需要的不是具体的数字,而是可以满足表示所有数据的公理,并把它抽象出来。

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据技术支持。; 适合人群:具备一定自动控制理论基础Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值