Python之枚举法解数学题
作为初二的学生,数学题总是令我苦恼的问题。尤其是我们这里的预备班考试(即我们这里最好的两所高中提前一年招生,选拔尖子生的考试)将近,我所面对的数学题越发令人头疼。
这不,麻烦来了:

如图,在正方形ABCD中,E在射线BC上,连接AE、CE,则DE/AE的最小值为________.
拿到这题,信心慢慢的我从容淡定地设AB:CE为1:x,即AB=k,CE=xk,于是原式(设为y)=[k^2+(xk)^2]^0.5/[k^2+(k+xk)^2]^0.5(这里的“^”代表乘方)。这不就只要求[k^2+(xk)^2]/[k^2+(k+xk)^2]的最小值嘛!这是一个求代数式最小值的问题。
可是……越看越不对劲。这个代数式是个分式,而我们常接触的同类型题涉及的都只是整式。凭着我对六本初中数学书的印象,我不禁提出疑问:这真的是初中的内容吗?书上似乎只字未提吧?
但是,本着埋头苦干的老黄牛精神,我就在那里毫无结果地和这道题目耗了几个小时。最终,我放弃了。
但也许是梦里来的灵感,第二天早上,我突然想到:何不通过一个Python程序来逐个列举,从中选择近似值呢?
于是,第一个程序出来了:
k=1
answer=100
myx=0
for x in range(10):
y=(k**2+(x*k)**2)**0.5/(k**2+(k+x*k)**2)**0.5
if y<answer:
answer=y
myx=x
print(answer,myx)
输出结果:
0.6324555320336759 1
唉,怎么越看越不对劲?
最后,我终于发现问题的所在:像这样遍历x,它的值都是整数,而事实上最小的y所对应的x不一定是整数。
那好,我们改:
k=1
answer=100
myx=0
for x in range(10000):
x=x/1000
y=(k**2+(x*k)**2)**0.5/(k**2+(k+x*k)**2)**0.5
if y<answer:
answer=y
myx=x
print(answer,myx)
输出:
0.6180339889095493 0.618
这个总没有问题了吧?还是有问题。你怎么能确定x的区间?
这个问题看似很致命,但并非完全不可解。我们可以大致推断,y的变化趋势应该是先下降后上升或先上升后下降(这个推理对我来说是本能的,以至于我自己都无法详细解释过程,但确实可以推理得到这个结论),而既然是求最小值,那自然是前者。因此,由于x从o.618到1是在增加,所以x一定在0.618或其以下,而这些数显然我们已经遍历到了(至少在某个精度上)。接下来,我们所需要的只是提高精度,以此来得到更接近真实值的结果,并凭借它猜测正确答案。
最终,在较高的精度下(程序与前面大致相同,只是加大了遍历的数值与x缩小的倍数,在此不列出),我们得到结果:
0.6180339887498948 0.618034
我们都知道,黄金分割比的小数点后前65位等于0.6180339887498948482045868343656381177203091798057628621354486227,这个数的前面几位和我们遍历的结果完全吻合。我们有理由相信,答案是黄金分割比(5^0.5-1)/2。于是,我们完美地用Python解决了这个问题。
当然,后来我们老师为我们讲解了这题不需要程序的解决方法:设法将式子中未知部分化为x+a/x的形式,这个式子永远不会小于2a^0.5。这样,我们就可以求得最值了。
Python之枚举法解数学题的更多相关文章
- python穷举法解数独
总体思路 : 数独九行九列,一个list装一行,也就需要一个嵌套两层的list 初始会有很多数字,我可不想一个一个赋值 那就要想办法偷懒啦 然后再是穷举,如何科学的穷举 第一部分:录入 某在线数独网站 ...
- 谁是嫌疑犯问题Python枚举法
原文:https://blog.csdn.net/yunzifengqing/article/details/81941592 问题描述:有6名犯罪嫌疑人A.B.C.D.E.F,已知如下事实: A.B ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- (转)python collections模块详解
python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...
- Python基于回溯法解决01背包问题实例
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
- python基础——枚举类
python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...
- Python 字符串方法详解
Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息. ...
- OpenJudge计算概论-完美立方【暂时就想到了枚举法了】
/*===================================== 完美立方 总时间限制: 1000ms 内存限制: 65536kB 描述 a的立方 = b的立方 + c的立方 + d的立 ...
- 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...
随机推荐
- AcWing 158. 项链 (最小表示法)
项链 题源:https://www.acwing.com/problem/content/160/ 题目 原理:最小表示法 找字典序最小的字符串 循环移位,破环成链 (把原串复制一倍) memcpy ...
- android软件简约记账app开发day07-备注界面完善
android软件简约记账app开发day07-备注界面完善 ## 昨天我们已经绘制了备注页面,今天来用Java代码组装完善一下. 首先我们新建BeiZhuDialog类关联备注页面,并且实现点击接口 ...
- 对比学习 ——simsiam 代码解析。
目录 1 : 事先准备 . 2 : 代码阅读. 2.1: 数据读取 2.2: 模型载入 3 训练过程: 4 测试过程: 5 :线性验证 6 : 用自己数据集进行对比学习. 第一: 改数据集 : ...
- node.js -- 身份认证
请问昨天结束的早是对堆积在了今天吗,今天还来加个班更博,看在这个毅力的份上能否给亿点点推荐. 有个好消息有个坏消息,先说坏消息吧,就是在这么学下去我急需急支糖浆,来回顾回顾前面的知识,这几天学的太急了 ...
- ElasticSearch7.3学习(十九)---- deep paging
1.什么是deep paging 根据相关度评分倒排序,所以分页过深,协调节点会将大量数据聚合分析. 2.deep paging 性能问题 1消耗网络带宽,因为所搜过深的话,各 shard 要把数据传 ...
- wireshark、tcpdump使用笔记
最近使用wireshark抓包icmp协议,过滤的命令如下所示: ip.addr eq 192.168.20.54 and ip.addr eq 192.168.50.131 and (icmp) 如 ...
- [STL] map 映射
- 小干货:Linux 系统的备份恢复
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! tar 命令 副本(本机备份整个系统,以后还原还是还原到 ...
- selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装
今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...
- 前端js堆栈
1.介绍创建数据的时候就会占用内容.内存主要开辟了两类空间1. 堆(进程,线程共享) 大小不固定,可随时增加不允许js直接访问堆内存存储引用类型数据按引用访问存储的值大小不定,可动态调整主要用来存放对 ...