悠闲数学娱乐论坛(第2版)'s Archiver

kuing 发表于 2017-9-7 14:48

简易等比放缩测试程序

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

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

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

q[m_] := 1 - f[m]/(c - Sum[f[i], {i, 1, m - 1}]);
g[k_, m_] := f[m]*q[m]^(k - m);
Do[{
  k = m;
  While[k <= testN,
   If[f[k] > g[k, m], Break[]];
   k++];
  If[k > testN, mm = m; Break[]]
  }, {m, 1, testm}]
Print["m=", mm]
Print["q=", q[mm]]
Print["try: f[n]<=", f[mm], "*", q[mm]^(n - mm), ",n>=", mm][/code]输出:
m=2
q=1/2
try: f[n]<=1/3*2^(2-n),n>=2
也就是链接中的放缩。

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

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

q[m_] := 1 - f[m]/(c - Sum[f[i], {i, 1, m - 1}]);
g[k_, m_] := f[m]*q[m]^(k - m);
Do[{
  k = m;
  While[k <= testN,
   If[f[k] > g[k, m], Break[]];
   k++];
  If[k > testN, mm = m; Break[]]
  }, {m, 1, testm}]
Print["m=", mm]
Print["q=", q[mm]]
Print["try: f[n]<=", f[mm], "*", q[mm]^(n - mm), ",n>=", mm][/code]输出:
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}$ 来得出结果的,这里我们用那个套路,照样可行。[code]Clear["Global`*"];
testN = 10;(*参与测试的数列项数*)
testm = 5;(*测试的最大m*)

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

q[m_] := 1 - f[m]/(c - Sum[f[i], {i, 1, m - 1}]);
g[k_, m_] := f[m]*q[m]^(k - m);
Do[{
  k = m;
  While[k <= testN,
   If[f[k] > g[k, m], Break[]];
   k++];
  If[k > testN, mm = m; Break[]]
  }, {m, 1, testm}]
Print["m=", mm]
Print["q=", q[mm]]
Print["try: f[n]<=", f[mm], "*", q[mm]^(n - mm), ",n>=", mm][/code]输出:
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项都不行,很可能方向不对。

isee 发表于 2017-9-7 15:42

[i=s] 本帖最后由 isee 于 2017-10-19 22:54 编辑 [/i]

[b]回复 [url=http://kuing.orzweb.net/redirect.php?goto=findpost&pid=22735&ptid=4861]1#[/url] [i]kuing[/i] [/b]


    有点意思,Mathematica 的确专业

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.