空间访问权限:游客, 头像访问权限:自己
[登录]后可以浏览更多信息
博客正文
【操作】
用单循环枚举法解方程组的可行性预测、实施和建模

环境:三中模拟上课,3评委+1上课老师+本人网络听课

问题提出:模拟上课老师提出枚举需要多重循环嵌套,对于学生来说有难度,有没有办法用单循环实现枚举。

一、头脑风暴的过程

?? 问题提出后,大家进行了一番讨论,笔者根据数学知识预测了可行性,猜测得出:

枚举循环的的层数 = 未知数个数 - 方程数 + 1

?? 但在头脑还是很模糊,没能拿出实施方案。

头脑风暴截图隐藏

作者隐藏了部分内容,需要[登录]才能查看
???

?? 上课老师老师开始上课,她把百钱百鸡问题改成了鸡兔同笼的2个未知数2个方程2层循环来简化难度。笔者觉得她的改法很赞。受其启发,立马用实践证明了前面理论的可行性。

snap5.jpg

作者隐藏了部分内容,需要[登录]才能查看

snap4.jpg

?

二、意义

?? 可以简化现行浙教版信息技术教材上的枚举问题的难度,把教材的白钱百鸡三个未知数两个方程双循环问题改成鸡兔同笼两个个未知数两个方程单循环。同时笔者也建议在编的新教材Python里也能用上简化实例。


以下为午后更新的内容

三、实践和补充

??? 用百钱百鸡来证明上述理论

?1、3个未知数1个方程---3重循环

snap6.jpg

?2、3个未知数2个方程---2重循环

snap7.jpg

?3、3个未知数3个方程---1重循环

snap8.jpg

代码实现的思想:如果为公鸡,母鸡,小鸡分别定义变量 g m x,可以把数学方程式写成赋值语句(清晰版);如果只定义1个变量,就要把方程融入到条件语句中了(精简版)。


四、纠错和建模

1、纠错

snap11.jpg?

?? 继续思考,发现绿色部分恰好错了,要在条件语句里融入三个方程,用and连接,恰恰增加了循环嵌套,请看下面3变量3方程的终极探索。
snap10.jpg

?? ?上图为我们提供了3个未知数3个方程单循环、双循环、三循环的解法。三个方程都要用的,要么用在赋值语句里进行变量代换,要么放在条件语句里进行数据校验。下面对该问题进行单循环建模。


2、y=f(a,b,c,d ..), n个未知数n个方程单循环枚举建模

  • 取一个方程为主方程准备放到条件语句中
  • 取一个变量为主变量m,即循环枚举的变量
  • 另外n-1个变量通过另外n-1个方程转化成用m来表示,这里是n-1个赋值语句,如果跟m没有直接关系要变通(还没细想过)。
  • 把所有变量的关系代入主方程做为唯一的条件判读语句。

3、x(x<>

请下载VB工程 emnu.rar?,若有bug自行修改

?

四、继续深度思考

??? 早上思维比较清晰,乘开车的时间就把枚举的循环层数跟提供的方程数的关系想透了。

??? 注意,建模一节提到的方程就是本节提到的函数,未知数就是本节提到的自变量。

??? 其实计算机枚举就是:当函数y=f(a)的y值确定时,通过计算机去猜测自变量a的取值,然后用函数法则f来验证

?1、枚举解题范式

??? 计算机枚举时要做3件事:

  • ?初步确定a的取值范围
  • ?把a作为循环变量进行枚举
  • ?对每个枚举出来的值用函数法则来检测,即用If语句来判断。

? 于是有了下面的编程范式
?? For a=下界 To a的上界
?????? If f(a) = y Then '用法函数法则(方程)检测
????????? print a
?????? End If
?? Next a

?????
?? [例题1]: 已知整数a的平方是361,求a?
?? [分析]:写成通式361=y=f(a),法则f为a * a, 估算a的取值范围[10, 20]
?snap0.jpg

?? [例题2] 已知浮点数a的平方是367,求a,要求精确到小数点后1位

枚举求367的平方根.jpg

? 本题看起来函数y = f(a) = a * a并没用在判断里,不符合解题范式啊,怎么回事?

2、一个反函数就能顶一个枚举循环

?如果我们能找到y=f(a)的反函数a=g(y),就不需枚举a了,比如平方的反函数就是sqrt求平方根
一个反函数抵得一个枚举循环.jpg
??? 继续推导:一个可确定自变量的赋值表达式就能顶一个循环。

3、多个自变量的枚举解体范式

??按此理论,当函数y=f(a,b)有两个自变量时,我们可以的解题范式就是
? For a=a下界 To a上界
? ??? For b=b下界 To b上界
????????? If f(a,b) = y Then? '用运算法则检测
????????????? Print a,b
??????????End If
??????Next b
??Next a

3、多个自变量,减少枚举循环层数的方法

??? 接上,如果我们能找到a, b的关系b=f1(a),对于每一个确定的a都能得到一个确定的b,我们就不需要再对b进行枚举,于是循环就可以减去一层,变成
??For a=a下界 To a上界
????? b = f1(a)?? 'b被a确定,省一个循环
????? If f(a,b)=y Then '主方程用于验证
??????????Print a,b
????? End If
??Next a

??? 这就是前面建模提到的两个未知数两个方程用一个循环就能解决的原因,即:在把a作为主变量枚举的情况下,用辅助方程b=f1(a)和a的值求出b,从而减少了一个枚举b的循环;再把主方程y=f(a, b)放到If Then里检测,从而判断a的合法性从而找到方程组的解。读者也可以用b作为主变量,在循环里用b来表示a从而减少一层循环。

??? 现在是时候给出n个自变量(未知数)n个函数(方程)到底有几层循环的结论了,公式因该为:

? 循环层数 = 自变量总数 + 1(枚举主自变量) - 可以用主自变量直接或间接迭代的次自变量个数?

??? 计算机枚举的强大之处就是多自变量函数y=f(a, b, c,……),在提供的条件有限,比如找不到各自变量之间的关系时,我们可以通过多层循环来枚举各自变量+用主方程判断的方法来找出它的解。

或许还有思考,尽情持续关注(2019-4-18 8:42)

五、用函数解析式替代循环

??? 本问题和枚举无关,只是单纯的想用函数解析式来取代占用资源的循环问题。看题

流程图.jpg
Dim s As Integer, k As Integer, a As Integer
Const u = 1024????????????? '2的10次方

s = 1: k = 1: a = 8
Do While s <= u
??? s = s + k * a
??? a = a * 2
??? k = 1 - k
Loop
Print s

现在用数学方法来解决。S初始值为0,每个循环都要累加的项Sn写成通式为

?sn.jpg(A=8)

K在循环里的取值为:1, 0, 1, 0, 1, 0, 1, 0…… 经过一番琢磨,得出Kn的通式为

k.jpg

??? 这里用到了电子线路的相关思想,如果把(-1)n 看作是振幅为1的交流电1,-1, 1, -1……的话,(-1)n + 1 就相当于叠加了数值为1的直流电2, 0, 2, 0……,再除以2就缩小了振幅。

??? 最后写出S的解析式为:

s1.jpg

1、当n为偶数时

s2.jpg
括号里的推导过程如下:

偶数次幂.jpg

两边同时乘以2得到2的奇数次幂
奇数次.jpg

两式左右两边相加补全缺少的幂
补全奇数次幂.jpg

左右同时加1,进一步推导得到结果
推导.jpg

2、当n为奇数时,其值等于其前一个偶数幂的各项和

3、最终解析式为

解析式.jpg

4、用程序解答

code.jpg用函数解析式省去循环.rar

5、顺便我们也应该把编程技巧总结一下,下面[]表示循环


? 1) 获得 True,False, True, False…… 队列
?[k = Not k]

? 2) 获得 1,-1, 1, -1…… 队列
?方法1:k=1 , [k=-k]
?方法2:[k=(-1)n]
???? 方法1计算机语言,方法2适用于写数学通式

? 3) 获得 1, 0, 1, 0……
?方法1:k=1, [k=1-k]
?方法2:[k=((-1)n+1)/2]
???? 方法1计算机语言,方法2适用于写数学通式

? 4) 获得 m, 0, m, 0……
?方法1:k=m, [k=m-k]
?方法2:[k=((-1)n+1)*m/2]

更新于 2019-04-25


?

?

栏目划分
WEB应用程序 (30)
桌面应用程序 (10)
Windows操作系统 (12)
xNix操作系统 (5)
数据库技术 (3)
多媒体技术 (1)
硬件技术 (4)
办公软件 (2)
以史为鉴 (2)
教学反思1 (2)
奇闻趣事 (5)
其它 (11)
教学反思 (4)
电子技术 (2)
中学生科技 (3)
?
主人推荐
音象定位和音箱喇叭的排步
我国高层意向已定:制造大飞机
“运十”悲剧
日尔曼人
细说百越族
宇宙深处的秘密——星云
[强烈推荐]中华56民族FLASH完整珍藏版
一组漂亮的植物
??