【數學建模】一筐雞蛋問題,數學建模方法解決
有學生在群里提問這樣一個趣味問題:
一筐雞蛋
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的小球體填充,至少需要多少個小球體?