找回密码
 欢迎注册
楼主: kastin

[转载] 一个代数不等式

[复制链接]
发表于 2014-7-2 13:30:41 来自手机 | 显示全部楼层
由于22楼的分析对于一般k也成立,我们也总是只需要分析最大和最小的r
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-2 13:44:00 来自手机 | 显示全部楼层
其中最大小的r贡献的乘积对于充分大的t同$k^(-{t(t+1)}/2)$正比,所以说明对充分大的t以后,必然是拆封成较小若干段乘积绝对值更大,也就是太大的t不用考虑。而其中最大的r接近-1,可以看出t趋向无穷时乘积将收敛。所以如果对所有的t,部分乘积绝对值都小于1,拆分就没有好处了,不然,对于充分大的t,我们总可以拆分一部分出来使得乘积变大。而这个k的分界数值计算大概在6.314473,也就是k小于这个数时,无论n多大,都只需要分析有限个t。但是如果k大于这个界以后可能就需要分析所有的t
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 06:03:39 | 显示全部楼层
如同17#设一般情况$T=\prod_{i=1}^n(kx_{i-1}-x_i)$
偏导数为\(\frac{\partial T}{\partial x_i}=T(\frac{k}{kx_i-x_{i+1}}-\frac{1}{kx_{i-1}-x_i})\)
于是T取极值时对于所有的i,差值\(\frac{k}{kx_i-x_{i+1}}-\frac{1}{kx_{i-1}-x_i}\)相等,设这个差值为\((k-1)K\)其中K为参数
同样设\(Y_i=\frac{1}{kx_{i-1}-x_i}\),于是\(k(Y_{i+1}-K)=Y_i-K\).于是同样得出全局极值点只能所有$x_i$相等。
而对于边界情况中长度为t的不含0的部分,同样设
$Y_1-K=k(Y_2-K)=...=k^t(Y_{t+1}-K)=S$,得出
$Y_i=k^{-(i-1)}S+K,kx_{i-1}-x_i=\frac{1}{k^{-(i-1)}S+K}$
所以
$\frac{x_{i-1}}{k^{i-2}}-frac{x_i}{k^{i-1}}=\frac{1}{S+k^{i-1}K}$
累加得出参数$S/K$满足方程$0=\sum_{i=0}^t\frac{1}{x+k^i}$
而根据上面等式我们还可以得出$t+1=\sum_{i=0}^t\frac{x+k^i}{x+k^i}=\sum_{i=0}^t\frac{k^i}{x+k^i}$
也即是$t+1=K^{t+1}\sum_{i=0}^t\frac{1}{k^{-i}S+K}=K^{t+1}\sum_{i=0}^t(kx_i-x_{i+1})=K^{t+1}(k-1)\sum_{i=1}^tx_i$
所以也就是说如果我们取n个数的和为$n/{k-1}$,那么这时$K=1,S=x$,而其中长为t的一段最大连续非零数和为${t+1}/{k-1}$
而这时,这一段数对目标函数贡献的乘积为$\prod_{i=0}^t(kx_i-x_{i+1})=\prod_{i=0}^t\frac{1}{k^{-i}S+K}=\prod_{i=0}^t\frac{k^i}{x+k^i}$
而全局极值点在$\sum_{i=1}^tx_i=n/{k-1}$时目标函数$T=1$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 06:11:53 | 显示全部楼层
方程$0=\sum_{i=0}^t\frac{1}{x+k^i}$最大根(绝对值最小)在$(-k,-1)$,而且随着t趋向无穷,这个根收敛到一个这个区间中一个数(但不在边界)
而对应目标函数乘积$\prod_{i=0}^t\frac{k^i}{x+k^i}=\Pi_{i=0}^t\frac{1}{1+k^{-i}x}$在t趋向无穷时绝对收敛
而方程最小根在$(-k^t,-k^{t-1})$上,同样可以设这个根为$-k^t*\lambda_t$,同样可以知道在t趋向无穷时$\lambda_t$趋向$(-1,-1/k)$中间一个数$\lambda$,而对应目标函数乘积为
$\prod_{i=0}^t\frac{1}{1-k^{t-i}\lambda_t}=\prod_{i=0}^t\frac{1}{1-k^i\lambda_t}$,所以t趋向无穷时收敛到$\prod_{i=0}^{+infty}\frac{1}{1-k^i\lambda}=0$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 21:09:44 来自手机 | 显示全部楼层
根据上面分析,在k比较大时,最值应该会比较简单,最大是全部相等时取到,最小在只有一个0时取到,比如k=7.
而k比较小时,好像不会在全局极值点取到最大值(唯一例外可能在中间一小段对于比较小的n有可能会取到全局极大值)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-4 08:55:59 来自手机 | 显示全部楼层
现在我们可以数值计算分析一下对于较小的n极值所采用的模式,类似前面的记号,全局极值点的取值为G=1,而t个连续非零数对应乘积的两个极值为$A_{t+1},B_{t+1}$,数值计算n=3时最小值为A3,最大值在k小于2.61时为B3,大于2.62为G.n=4时最小值为A4,最大值为A2^2和1,分界约5.82。n=5时,最小值为A2B3和A5,分界约2.32,最大值为A2A3和G,分界为6.03。n=6时最小值为A2^3和A6,分界约5.56,最大值为A3^2和G,分界约6.24。n=7时最小值为A2^2A3和A7,分界约5.78,最大值为A2^2B3,A3A4和G,分界在约2.12,6.27(这时开始有三段)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-4 10:24:24 来自手机 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <vector>
  6. using namespace std;
  7. #define MAXC 100
  8. #define MIN_ERR 1E-10
  9. double f(double k, double x, int t){
  10.     double s=0.0;
  11.     double ki=pow(k,(double)t);
  12.     int i;
  13.     for(i=t;i>=0;i--){
  14.       s+=1./(x+ki);
  15.       ki/=k;
  16.     }
  17.     return s;
  18. }

  19. double df(double k, double x, int t){
  20.     double s=0.0;
  21.     double ki=pow(k,(double)t);
  22.     int i;
  23.     for(i=t;i>=0;i--){
  24.       s-=1./((x+ki)*(x+ki));
  25.       ki/=k;
  26.     }
  27.     return s;
  28. }

  29. double find_max_root(double k, int t){
  30.     double x0;
  31.     int c=0;
  32.     x0=-(k+1.0)/2.0;
  33.     while(c<MAXC){
  34.        double err=f(k,x0,t)/df(k,x0,t);
  35.        x0-=err;
  36.        if(err/x0<MIN_ERR)
  37.           break;
  38.     }
  39.     if(c==MAXC){
  40.        fprintf(stderr,"too much error find max root for %f,%d\n",k,t);
  41.     }
  42.     return x0;
  43. }

  44. double find_min_root(double k, int t){
  45.     double x0;
  46.     double kp;
  47.     int c;
  48.     kp=pow(k,(double)t);
  49.     x0=-(k+1.0)/2.0*kp/k;
  50.     while(c<MAXC){
  51.        double err=f(k,x0,t)/df(k,x0,t);
  52.        x0-=err;
  53.        if(err/x0<MIN_ERR)
  54.           break;
  55.     }
  56.     if(c==MAXC){
  57.        fprintf(stderr,"too much error find min root for %f,%d\n",k,t);
  58.     }
  59.     return x0;
  60. }

  61. double find_root_target(double k, int t, double r){
  62.     double p=1.0;
  63.     double kp=1.0;
  64.     int i;
  65.     for(i=0;i<=t;i++){
  66.        p/=(1.0+kp*r);
  67.        kp/=k;
  68.     }
  69.     return p;
  70. }

  71. #define TYPE_A   0
  72. #define TYPE_B   1
  73. typedef struct _rtype_t{
  74.     double d;
  75.     int c;
  76.     int t;
  77. }rtype_t;

  78. vector<rtype_t> v;
  79. #define MAXN 40
  80. #define MINK 1.01
  81. #define MAXK 10.0
  82. #define STEPK 0.01

  83. typedef struct _item_t{
  84.     short index;
  85.     short count;
  86. }item_t;
  87. item_t cur_max[MAXN];
  88. int cur_max_count;
  89. double cur_max_value;
  90. item_t cur_min[MAXN];
  91. int cur_min_count;
  92. double cur_min_value;
  93. item_t cur_stack[MAXN];
  94. int cur_stack_count;
  95. int csum;
  96. double mprod[MAXN];

  97. void dump_items(const item_t items[MAXN], int c, double value){
  98.     printf("%.3g\t",value);
  99.     if(c==0){
  100.         printf("G");
  101.     }else{
  102.         int i;
  103.         for(i=0;i<c;i++){
  104.             int index=items[i].index;
  105.             if(v[index].t==TYPE_A){
  106.                 printf("A%d",v[index].c);
  107.             }else{
  108.                 printf("B%d",v[index].c);
  109.             }
  110.             if(items[i].count>1){
  111.                printf("^%d",items[i].count);
  112.             }
  113.         }
  114.     }
  115. }

  116. void find_recursive(double k, int n, int t)
  117. {
  118.     int i,j;
  119.     int ic=v[t].c;
  120.     double d=1.0;
  121.     for(i=1;i*ic<=n-csum;i++){//try to use i times v[t].d
  122.        d*=v[t].d;
  123.        if(cur_stack_count==0){
  124.            mprod[cur_stack_count]=d;
  125.        }else{
  126.            mprod[cur_stack_count]=mprod[cur_stack_count-1]*d;
  127.        }
  128.        cur_stack[cur_stack_count].index=t;
  129.        cur_stack[cur_stack_count].count=i;
  130.        csum+=i*ic;
  131.       
  132.        if(csum==n){
  133.            if(mprod[cur_stack_count]<cur_min_value){
  134.                cur_min_value=mprod[cur_stack_count];
  135.                cur_min_count = cur_stack_count+1;
  136.                memcpy(&cur_min, &cur_stack, sizeof(cur_min[0])*cur_min_count);
  137.            }else if(mprod[cur_stack_count]>cur_max_value){
  138.                cur_max_value=mprod[cur_stack_count];
  139.                cur_max_count = cur_stack_count+1;
  140.                memcpy(&cur_max, &cur_stack, sizeof(cur_max[0])*cur_max_count);
  141.            }
  142.        }else{
  143.            cur_stack_count++;
  144.            for(j=t+1;j<v.size();j++){
  145.                 find_recursive(k,n,j);
  146.            }
  147.            cur_stack_count--;
  148.        }
  149.        csum-=i*ic;
  150.     }
  151. }

  152. void find_min_max(double k,int n)
  153. {
  154.     cur_max_count=cur_min_count=0;
  155.     cur_max_value=cur_min_value=1.0;
  156.     cur_stack_count=0;csum=0;mprod[0]=1.0;
  157.     int i;
  158.     for(i=0;i<v.size();++i){
  159.         find_recursive(k,n,i);
  160.     }
  161.     printf("min%d\t",n);
  162.     dump_items(cur_min,cur_min_count,cur_min_value);
  163.     printf("\tmax%d\t",n);
  164.     dump_items(cur_max,cur_max_count,cur_max_value);
  165.     printf("\t");
  166. }

  167. void try_add_value(const rtype_t& rt)
  168. {
  169.     int size=v.size();
  170.     int i,j;
  171.     for(i=0;i<size;i++){
  172.        for(j=i;j<size;j++){
  173.          if(v[i].c+v[j].c!=rt.c)continue;
  174.          double t=v[i].d*v[j].d;
  175.          if(t*rt.d>0){//must same sign
  176.              if(fabs(rt.d)<=fabs(t)){//we could remove it
  177.                  return;
  178.              }
  179.          }
  180.        }
  181.     }
  182.     v.push_back(rt);
  183. }

  184. int main()
  185. {
  186.    double k;
  187.    int n;
  188.    
  189.    for(k=MINK;k<MAXK;k+=STEPK){
  190.        v.clear();
  191.        double r=find_min_root(k,1);//r1
  192.        double A2=find_root_target(k,1,r);
  193.        printf("k=%.3g\t",k);
  194.        rtype_t rt;
  195.        rt.d=A2;rt.c=2;rt.t=TYPE_A;
  196.        v.push_back(rt);
  197.        for(n=3;n<=MAXN;n++){
  198.            r=find_min_root(k,n-1);
  199.            double B = find_root_target(k,n-1,r);
  200.            r=find_max_root(k,n-1);
  201.            double A = find_root_target(k,n-1,r);
  202.            if(n&1){
  203.               rt.d=B;rt.c=n;rt.t=TYPE_B;
  204.               try_add_value(rt);
  205.               rt.d=A;rt.t=TYPE_A;
  206.               try_add_value(rt);
  207.            }else{
  208.               if(fabs(A)>=fabs(B)){
  209.                  rt.d=A;rt.c=n;rt.t=TYPE_A;
  210.               }else{
  211.                  rt.d=B;rt.c=n;rt.t=TYPE_B;
  212.               }
  213.               try_add_value(rt);
  214.            }
  215.            find_min_max(k,n);
  216.        }
  217.        printf("\n");
  218.    }
  219. }

复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-4 13:12:07 来自手机 | 显示全部楼层
现在随便取一个特例$n=10,k=6,S=n/{k-1}=2$的情况 已知$\sum_{h=1}^10x_h=2,x_0=x_10,x_h>=0$,求$\prod_{h=1}^10(6x_{h-1}-x_h)$的最值
我们现在可以得到 $A_3^2A_4=-1.216284499029738978312013981<=\prod_{h=1}^10(6x_{h-1}-x_h)<=1.169884986538096750088324307=A_5^2$
略微修改可以写成一个看上去舒服一点的不等式 $-11/9<\prod_{h=1}^10(6x_{h-1}-x_h)<6/5$
   计算$A_3,A_4,A_5$得出 $A3=-1.061818494455482830466867062$ 由$0,u_1=0.4159268149800571614955459999,u_2=0.1840731850199428385044540000$三个数构成的一段数取到
$A4=-1.078784259169675957317902515$, 由$0,v_1=0.4184646072638971043360394266,v_2=0.2122115263540643604243481800,v_3=0.1693238663820385352396123968$四个数构成一段数取到
$A5=-1.081612216341003033739793319$, 由$0,w_1=0.4188846033465609284019833903,w_2=0.2168394522384006497782939244,w_3=0.1971725276545286129429425117,w_4=0.1671034167605098088767801764$ 五个数构成的数据段取到
所以10个和为2的数$0,u_1,u_2,0,u_1,u_2,0,v_1,v_2,v_3$可以取到最小值$A_3^2A_4$ 10个和为2的数$0,w_1,w_2,w_3,w_4,0,w_1,w_2,w_3,w_4$可以取到最大之$A_5^2$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-5 11:12:22 来自手机 | 显示全部楼层
25#方法对于一切k>=1都成立,而且对于t=4的情况,由于总乘积为正数,同样可以两两合并,也就是Bh在h>=5不用考虑
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-5 11:45:56 来自手机 | 显示全部楼层
数值计算结果表明$B_4$也不用考虑,也就是$B_4$的绝对值必然小于$A_4$的绝对值,但是用这个方法就不行了. 不过可以直接比较两个极值得出$|B_4|<|A_4|$(实际上对于任意$h>3,|B_h|<|A_h|$.)
由此,再加上前面得出对于$h>=5$我们也不需要考虑$B_h$,我们得出只需要考虑$B_3$和$A_h$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-8 19:48 , Processed in 0.173873 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表