免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

简易等比放缩测试程序

之前在 http://kuing.orzweb.net/redirect ... =4823&pid=22620(13楼)扯过等比放缩的基本套路,正如帖中网友游客所讲的:
如果要第5项开始才能放缩,这样谁还想着去算?早放弃了。
如果是考试,应该杜绝这种方法的题目,思维量不怎样,但能整死人。
还好考试什么的不关我事,既然有套路,计算自然交给软件,这两天玩开编程,顺便把这个也编个测试程序玩玩。

就用之前的实例来说吧。
例1:$1/(2-1)+1/(2^2-1)+\cdots+1/(2^n-1)<5/3$(http://kuing.orzweb.net/viewthread.php?tid=4841
  1. Clear["Global`*"];
  2. testN = 10;(*参与测试的数列项数*)
  3. testm = 5;(*测试的最大m*)

  4. f[n_] = 1/(2^n - 1);
  5. c = 5/3;

  6. q[m_] := 1 - f[m]/(c - Sum[f[i], {i, 1, m - 1}]);
  7. g[k_, m_] := f[m]*q[m]^(k - m);
  8. Do[{
  9.   k = m;
  10.   While[k <= testN,
  11.    If[f[k] > g[k, m], Break[]];
  12.    k++];
  13.   If[k > testN, mm = m; Break[]]
  14.   }, {m, 1, testm}]
  15. Print["m=", mm]
  16. Print["q=", q[mm]]
  17. Print["try: f[n]<=", f[mm], "*", q[mm]^(n - mm), ",n>=", mm]
复制代码
输出:
m=2
q=1/2
try: f[n]<=1/3*2^(2-n),n>=2
也就是链接中的放缩。

例2:开头链接中的题(无法求通项的情形)。
  1. Clear["Global`*"];
  2. testN = 10;(*参与测试的数列项数*)
  3. testm = 5;(*测试的最大m*)

  4. a[1] = 4;
  5. Do[a[n + 1] = a[n]^2 - 2 n a[n] + 1, {n, 1, testN - 1}]
  6. Do[f[n] = 1/(a[n] - 2), {n, 1, testN}]
  7. c = 2/3;

  8. q[m_] := 1 - f[m]/(c - Sum[f[i], {i, 1, m - 1}]);
  9. g[k_, m_] := f[m]*q[m]^(k - m);
  10. Do[{
  11.   k = m;
  12.   While[k <= testN,
  13.    If[f[k] > g[k, m], Break[]];
  14.    k++];
  15.   If[k > testN, mm = m; Break[]]
  16.   }, {m, 1, testm}]
  17. Print["m=", mm]
  18. Print["q=", q[mm]]
  19. Print["try: f[n]<=", f[mm], "*", q[mm]^(n - mm), ",n>=", mm]
复制代码
输出:
m=3
q=1/22
try: f[n]<=1/44*22^(3-n),n>=3
也就是链接中的放缩。

例3,随便在网上搜到的:$a_1=a_2=5$, $a_{n+1}=a_n+6a_{n-1}$,证 $1/a_1+1/a_2+\cdots+1/a_n<1/2$。
求通项易知 $a_n=3^n-(-2)^n$,参考答案是通过证明当 $k$ 为奇数时 $1/a_k+1/a_{k+1}<4/3^{k+1}$ 来得出结果的,这里我们用那个套路,照样可行。
  1. Clear["Global`*"];
  2. testN = 10;(*参与测试的数列项数*)
  3. testm = 5;(*测试的最大m*)

  4. f[n_] = 1/(3^n - (-2)^n);
  5. c = 1/2;

  6. q[m_] := 1 - f[m]/(c - Sum[f[i], {i, 1, m - 1}]);
  7. g[k_, m_] := f[m]*q[m]^(k - m);
  8. Do[{
  9.   k = m;
  10.   While[k <= testN,
  11.    If[f[k] > g[k, m], Break[]];
  12.    k++];
  13.   If[k > testN, mm = m; Break[]]
  14.   }, {m, 1, testm}]
  15. Print["m=", mm]
  16. Print["q=", q[mm]]
  17. Print["try: f[n]<=", f[mm], "*", q[mm]^(n - mm), ",n>=", mm]
复制代码
输出:
m=2
q=1/3
try: f[n]<=1/5*3^(2-n),n>=2
即只需证明 $n\ge2$ 时 $1/(3^n - (-2)^n)\le 3^{2-n}/5$ 即可(化简后为 $3^{n-2}\ge (-2)^{n-2}$)。


要改动的就是 f[n_] 和 c 那部分,其他都是固定的。

注意,测试结果未必一定成立,毕竟这里只取了数列的 10 项来测试,如果你想保险些也可以加大它。

如果测试失败,会输出 m=mm 等一堆没用的东西,如果确认输入没问题,就应考虑放弃,没必要加大 testm,因为保留5项都不行,很可能方向不对。
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
$\href{https://kuingggg.github.io/}{\text{About Me}}$

本帖最后由 isee 于 2017-10-19 22:54 编辑

回复 1# kuing


    有点意思,Mathematica 的确专业

TOP

返回列表 回复 发帖