【數學建模】一筐雞蛋問題,數學建模方法解決

有學生在群里提問這樣一個趣味問題:

一筐雞蛋

1個1個拿,正好拿完。

2個2個拿,還剩1個。

3個3個拿,正好拿完。

4個4個拿,還剩1個。

5個5個拿,還差1個。

6個6個拿,還剩3個。

7個7個拿,正好拿完。

8個8個拿,還剩1個。

9個9個拿,正好拿完。

這是多少個?nn

——————————————————————

從數學建模的角度來看,這是一個整數規劃問題,最適合用Lingo求解,代碼(也即思路):

model:nnmin=k1+k2+k3+k4+k5+k6+k7+k8;nnx=2*k1+1;nnx=3*k2;nnx=4*k3+1;nnx=5*k4+4;nnx=6*k5+3;nnx=7*k6;nnx=8*k7+1;nnx=9*k8;nn@gin(x);nn@gin(k1);nn@gin(k2);nn@gin(k3);nn@gin(k4);nn@gin(k5);nn@gin(k6);nn@gin(k7);nn@gin(k8);nnendn

說明:因為是求滿足條件的最小的整數,所以目標是讓這些倍數之和最小;@ gin()用來限定變數是整數。nn

當然這個代碼太啰嗦了,改進一下,用數組表示k:

model:nnsets:nnparms/1..8/:k;nnendsetsnnmin=@sum(parms(i):k(i));nnx=2*k(1)+1;nnx=3*k(2);nnx=4*k(3)+1;nnx=5*k(4)+4;nnx=6*k(5)+3;nnx=7*k(6);nnx=8*k(7)+1;nnx=9*k(8);nn@gin(x);nn@for(parms:@gin(k));nnendn

運行結果:nn

Global optimal solution found.

Objective value: 2648.000

Variable Value

X 1449.000

K( 1) 724.0000

K( 2) 483.0000

K( 3) 362.0000

K( 4) 289.0000

K( 5) 241.0000

K( 6) 207.0000

K( 7) 181.0000

K( 8) 161.0000

因此,該問題的最小整數解為1449.

進一步,分析該問題的通解,很顯然:1449再加上「任意倍數的2-9的最小公倍數「,肯定是不影響題目中的各條件的。

接著求2-9的最小公倍數,這次用Matlab解決,因為它自帶函數 lcm(a,b) 返回兩個數a和b的最小公倍數。自編一個可以求任意個數的最小公倍數(其實就是個遞歸,這裡就不考慮複雜度了):

function y=mylcm(x)nn=length(x);ny=x(1);nfor i=2:nn y=lcm(y,x(i));nendnnn然後,命令窗口,執行nx=2:9;nmylcm(x)nn運行結果:nnans =nn 2520n

因此,得到該問題的通解:1449+2520*n,其中n可以是任意自然數。

後記:雖然是很小的一個問題,但是希望能鍛煉學生,用數學建模的思維解決問題,學習藉助軟體工具解決問題,而不是只習慣用筆。

作者:張敬信n著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


推薦閱讀:

comsol中熱-流耦合的問題?
50 以最小精度 0.1 隨機分成 10 份,每份四捨五入後加和仍是 50 的概率為多少?
一個半徑為R的空心球,如果用半徑為r的小球體填充,至少需要多少個小球體?

TAG:lingo | 数学建模 | 鸡蛋 |