柯西平均值定理作为已经被证明的数学难题,在高中数学中就有应用。它又叫柯西不等式,也称为柯西均值定理,一般表述为:n个正数的几何平均值不大于这些数的算术平均值。
设有n个非负实数X1,X2,X3……Xn,则有
今天我们用Python、Scratch和APPInventor来做简单验证。一、创意来源
在Python学习中,解决数学问题可以帮助我们显著提高学习效果。近几期我们一直在分享研究历史数学难题的收获,希望对大家有所帮助。二、设计思路
定理内容比较简单,就是需要计算算术平均值和几何平均值。算术平均值,就是n个正数的和除以n得到的结果。几何平均值,是n个正数的积,开n次方得到的结果。
让程序先产生n个随机数,再计算两个平均值,最后进行比较即可。
但随机数如果都是正整数,验证结果受限,还要用小数来验证。为了产生n位的小数,将范围扩大10n倍,产生随机数后,再缩小10n倍,这样便可用整数和小数来验证。
在实际运行过程中,却出现了一个问题。那就是小数位数有上限,三种语言都出现了这种情况,比如Python就是17位有效数字。所以在程序中都需要根据语言环境进行相应的处理。三、程序设计过程(一)Python程序设计
本例涉及等级考试二级内容。通过键盘输入范围、数据个数和小数位数后,首先做范围处理,如果范围的位数和小数位数的和超出17位,则不做验证(图1)。
然后随机生成n个数p位小数,添加到列表中,再计算算术平均值和几何平均值。最后做比较,输出结果。
程序不是很难,主要是用到了两个函数。一个是random库中的randint()函数产生一定范围内的随机整数,还有一个是pow(x,y)函数,是求x 的y次方,我这们这里利用这个函数做开n次方运算,即y值在(0,1)之间的值为开方运算,比如pow(2,1/2),即是求2的平方根。(二)Scratch程序设计
1.首先初始化,键盘输入范围、个数和小数位数(图2)
同时清空数据列表,将4个变量初始化。
2.产生n个随机数并计算
循环“个数”次,产生的n个随机数,进行加法和乘法运算,保存在变量中,同时将数据添加到列表中,以备查看(图3)。
3.求出几何平均值和算术平均值
算术平均值就是用n个数的和除以n,得到的结果(图4)。
几何平均值是将n个数的积,开n次方根的结果。因为Scratch里没有提供开n次方根的积木块,这里利用了指数和对数的性质。公式中n就是数据的个数,“积”为保存n个数积的变量。
4.输出结果
先判断几何平均值是不是超出范围,再判断小数位数和扩大范围后的值,是不是超出范围,如果都没有超出范围,则判断几何平均值是否小于或等于算术平均值,如果满足条件,则说明柯西平均值定理成立,说:“柯西平均值定理成立”5秒,否则说“柯西平均值定理不成立”5秒(图5、图6)。
(三)APPInventor程序設计1.UI设计
界面设置参考APP运行结果。注意设置3个文本输入框的提示信息。
2.变量与初始化
变量6个,功能如下。验证数据列表,存储随机产生的验证数据。随机数,即保存每次产生的随机数。其他4个变量如名字(图7)。
3.清除数据和退出
清除按钮:清除输入的数据,回到初始状态。退出按钮:退出APP程序(图8)。
4.提交
这也是最重要的按钮,显示我们需要的数据。初始化显示结果标签,清除验证数据列表数据,初始化变量列表元素和、列表元素积。
在APPInventor里,对于精度范围我也是第一次测试,才发现精度受限还是挺严重的。整数最大是10位,而且前两位数字一定是“10”,所以设定范围不能多于9位;其次小数最多是5位。
输入数据处理,首先是判断三个文本输入框是否为空,为空则提示输入。然后判断输入的小数位数,超过5位则提示不能超过5位。再判断无小数位数时,取值范围是否超过9位数,超过9位则提示不能超过9位。再判断有小数位数时,取值范围是否超过6位数,超过6位则提示有小数时,不能超过6位。如果超出范围则使用科学计数法,无法看到真实的数据。所以做了限制,这个精度应该是APPInventor默认的精度。
最后判断范围和10的小数位数次方之积,是否超过10的9次方,超过则提示减小范围或小数位数(图9)。
按输入的个数要求,产生n个数据,并做加法和乘法,同时添加到验证数据列表中,以最后显示验证数据。变量“随机数”保存的是随机产生的数据。为了得到小数,将随机生成的“范围”内的整数扩大n倍,再缩小n倍,因而才有了有效数字的限制。
计算两个平均值,并在显示结果文本标签中显示出来,更直观明了。乘积开方算法与Scratch一致。
比較两个平均值,如果几何平均值不大于(小于或等于)算术平均值,则说明柯西平均值定理成立,否则说明不成立。最后把验证的数据,用列表的形式显示出来。(四)测试与改进
1.Python和Scratch图形化程序测试
两个程序的测试比较简单,给定范围和测试数据的个数、小数位数,就可以直接测试,结果很快就出来。需要根据软件默认精度改进小数位数问题。
2.APPInventor测试
超出精度限制时,APPInventor会用科学计数法显示,无法看到测试结果。当范围降低一位时,显示正常。所以对数据的取值范围做了具体限制(图10)。
(五)精度和有效数字Python和Scra
tch精度可以达到17位有效数字,一般情况下足够了。而APPInventor的小数位数最多就5位,所以解决它的精度问题更加有必要。
我想到的方法,就是分别生成整数部分和小数部分,再合并到一起,这样小数和整数就都能有10位了。如果需要对多个值计算,道理是一样的,可以做连乘或连加或其他运算。测试代码如下(图11)。
生成的数值在我们所希望的范围内,直接利用字符串合并成一个小数,APPInventor在计算时,不区分数值和字符串的数字,但如果执行运算则会保留5位小数。所以测试结果里,生成的两个数是满足条件的,再计算后的结果就又是5位小数了。起初只是验证柯西定理,但验证过程中发现了更多问题,在深入探讨后我们的能力是不是提高了?



