程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python之枚舉法解數學題

編輯: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之枚舉法解數學題的更多相關文章

  1. python窮舉法解數獨

    總體思路 : 數獨九行九列,一個list裝一行,也就需要一個嵌套兩層的list 初始會有很多數字,我可不想一個一個賦值 那就要想辦法偷懶啦 然後再是窮舉,如何科學的窮舉 第一部分:錄入 某在線數獨網站 ...

  2. 誰是嫌疑犯問題Python枚舉法

    原文:https://blog.csdn.net/yunzifengqing/article/details/81941592 問題描述:有6名犯罪嫌疑人A.B.C.D.E.F,已知如下事實: A.B ...

  3. 【python進階】詳解元類及其應用2

    前言 在上一篇文章[python進階]詳解元類及其應用1中,我們提到了關於元類的一些前置知識,介紹了類對象,動態創建類,使用type創建類,這一節我們將繼續接著上文來講~~~ 5.使⽤type創建帶有 ...

  4. (轉)python collections模塊詳解

    python collections模塊詳解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模塊簡介 collections包含了一些特 ...

  5. Python基於回溯法解決01背包問題實例

    Python基於回溯法解決01背包問題實例 這篇文章主要介紹了Python基於回溯法解決01背包問題,結合實例形式分析了Python回溯法采用深度優先策略搜索解決01背包問題的相關操作技巧,需要的朋友 ...

  6. python基礎——枚舉類

    python基礎——枚舉類 當我們需要定義常量時,一個辦法是用大寫變量通過整數來定義,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好處是簡單 ...

  7. Python 字符串方法詳解

    Python 字符串方法詳解 本文最初發表於賴勇浩(戀花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙轉載,敬請保留全文完整,切勿去除本聲明和作者信息.        ...

  8. OpenJudge計算概論-完美立方【暫時就想到了枚舉法了】

    /*===================================== 完美立方 總時間限制: 1000ms 內存限制: 65536kB 描述 a的立方 = b的立方 + c的立方 + d的立 ...

  9. 【NYOJ-187】快速查找素數—— 枚舉法、篩選法、打表法

    快速查找素數 時間限制:1000 ms  |  內存限制:65535 KB 難度:3   描述 現在給你一個正整數N,要你快速的找出在2.....N這些數裡面所有的素數. 輸入 給出一個正整數數N(N ...

  10. python time模塊詳解

    python time模塊詳解 轉自:http://blog.csdn.net/kiki113/article/details/4033017 python 的內嵌time模板翻譯及說明  一.簡介 ...

隨機推薦

  1. PHP Switch case 條件並用實例

    眾所周知,Switch循環比if...else...循環效率要好的多,當case有相同代碼結構的時候,怎麼樣來簡化代碼結構,能讓代碼更具有通用性呢? 在網上找了一下,好多都是復制粘貼,還有的看起來太復 ...

  2. bufferedimage 轉換成 inputstream並保存文件

    BufferedImage img = removeBackgroud(file);//去除重影 //bufferedimage 轉換成 inputstream ByteArrayOutputStre ...

  3. java 學習筆記——網絡(Socket)

    閱讀方法:將網頁放大到200%. 如果你用過用過word應該知道按住ctrl鍵使用鼠標滾輪縮放.

  4. shell expr 文件擴展名判斷 整數判斷

    expr "text.sh" : ".*\.sh" &>/dev/null && echo "yes" ||e ...

  5. How to move the user document folder to D disk[Windows 7]

    when you install windows 7 OS, the system ask for you enter username and password, then you have not ...

  6. Linq查詢出結果集中重復數據

    private List<FMDS_FarmPlotNewInfo> GetSame(List<FMDS_FarmPlotNewInfo> lst) { List<FMD ...

  7. 我眼中的 Oracle 性能優化

    恆生技術之眼 作者 林景忠 大家對於一個業務系統的運行關心有如下幾個方面:功能性.穩定性.效率.安全性.而一個系統的性能有包含了網絡性能.應用性能.中間件性能.數據庫性能等等. 今天從數據庫性能的角度 ...

  8. WPF之路一:相對路徑圖片顯示

    由於公司項目的需要,改為WPF開發,因此需要學習WPF,遇到的第一個問題就是在顯示的圖片的時候,寫絕對路徑,圖片顯示沒有問題,但是寫相對路徑的時候,發現圖片無法正常顯示,在網上搜了一下,得到的答案是需 ...

  9. Ubuntu徹底刪除/卸載mysql,php,apache

    一.卸載刪除 mysql 1 sudo apt-get autoremove --purge mysql-server-5.02 sudo apt-get remove mysql-server3 s ...

  10. VxWorks嵌入式系統幾種常用的延時方法

    1 taskDelay     taskDelay(n)使調用該函數的任務延時n個tick(內核時鐘周期).該任務在指定的時間內主動放棄CPU,除了taskDelay(0)專用 於任務調度(將CPU交 ...


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved