mathe 发表于 2010-5-18 16:18:58

写了个程序计算了一下,7#在10以内数据都是正确的,但是对于15的结果不对,应该为:
28.245565[ 2.000000 0.500000 2.000000 0.500000 2.000000 0.500000 2.000000 0.5000
00 2.000000 0.500000 1.863636 0.500000 0.500000 0.500000 0.500000 ]
同样对于20也可以计算出来如下:
37.875287[ 2.000000 0.500000 2.000000 0.500000 2.000000 0.500000 2.000000 0.5000
00 2.000000 0.500000 2.000000 0.500000 2.000000 0.500000 1.933333 0.500000 0.500
000 0.500000 0.500000 0.500000 ]
所以现在最优的模式可以猜测为前面若干对2,0.5,后面若干连续0.5,中间隔一个待定数

mathe 发表于 2010-5-18 16:21:18

#include <stdio.h>
#include <math.h>
#define N 15
int best_cand;
int best_t;
double maxv=0;

double value;
void lookup(int t)
{
        int i,j;
        double T=N*N/2.0;
        for(i=0;i<1<<N;i++){
                for(j=0;j<N;j++){
                        if(i&(1<<j)){
                                value=2.0;
                        }else{
                                value=0.5;
                        }
                }
                double s=0.0;
                for(j=0;j<N;j++){
                        if(j!=t){
                                s+=value*(j+1);
                        }
                }
                value=s=(T-s)/(t+1);
                if(s>=0.5&&s<=2.0){
                        s=0.0;
                        for(j=0;j<N-1;j++){
                                s+=value/value;
                        }
                        s+=value/value;
                        if(s>maxv){
                                maxv=s;
                                best_t=t;
                                best_cand=i;
                        }
                }
        }
}

void decode()
{
        int j;
        double s=0.0;
        printf("%f[ ",maxv);
        for(j=0;j<N;j++){
                if(best_cand&(1<<j)){
                        value=2.0;
                }else{
                        value=0.5;
                }
                if(j!=best_t){
                        s+=value*(j+1);
                }
        }
        value=(N*N/2.0-s)/(best_t+1);
        for(j=0;j<N;j++){
                printf("%f ",value);
        }
        printf("]\n");
}

int main()
{
        int i;
        for(i=0;i<N;i++){
                lookup(i);
        }
        decode();
        return 0;
}

mathe 发表于 2010-5-18 16:35:12

10#分析了连续两个以上的0.5后面不可以出现连续的2
而同样,如果我们分析0.5 0.5 0.5 2 0.5,可以发现它不是最优的,因为0.5 2.0 0.5 c 0.5 (其中c=0.5+1.5/(k+2))可以替换它得到更好的结果。由此我们可以得到,只要出现连续3个以上0.5以后,后面将不可以出现2.

mathe 发表于 2010-5-18 17:08:19

一个扩展的猜想,如果约束和由${n^2}/2$改成一个任意的正实数,是不是取最大值的地方必然是形如
2,2,...,2,u,2,0.5,2,0.5,...,2,0.5

2,0.5,2,0.5,..,2,0.5,u,0.5,0.5,...,0.5

数学星空 发表于 2010-5-22 23:15:19

根据mathe的结论:
所以现在最优的模式可以猜测为前面若干对2,0.5,后面若干连续0.5,中间隔一个待定数
设待定数u=a_(2k+1)则可以推得u=1/{4(2k+1)}*(n^2-n+2-(6k^2-4k))现在的问题归结于求k值?
根据youyouyou提供的数值解有:
n=4,5 时 k=1
n=6,7 时 k=2
n=8,9,10时 k=3
n=15时 k=5(mathe)
n=20时 k=7(mathe)
谁能给出 k与n的关系? 进而就能求出最大值及对应的a_i(1<=i<=n)值了

数学星空 发表于 2010-5-23 08:05:36

根据上面的结果可以得出最大值:9/4*k+2*u+1/{2*u}+n-2

数学星空 发表于 2010-5-23 13:56:01

现将mathe的更一般猜想整理如下:
    已知c<=a_i<=d (0<c<d,i=1,2,.....,n) ,且满足:a_1+2*a_2+3*a_3+.....+n*a_n=R*n^2
则a_1/a_2+a_2/a_3+a_3/a_4+.....a_(n-1)/a_n+a_n/a_1取得最大值
当且仅当(a_1,a_2,a_3,....,a_n)=(c,c,c,...,c,u,d,...,d)
      或者(a_1,a_2,a_3,....,a_n)=(d,c,...,d,c,u,c,...,c)

按照上面的计算同样可以得到:
设u=a_(2k+1)
则u=1/{2(2k+1)}*((2R-c)n^2-cn+2(c-d)k^2+2(2k+1)c)
最大值为:(d/c+c/d-2)k+(c/u+u/c)+n-2

有谁能提供一些计算数据,得到k与n的关系?那么就解决了这个问题.
注: 1/2 (1/n+1)c<=R<=1/2(1/n+1)d

mathe 发表于 2010-5-23 15:39:17

根据mathe的结论:
所以现在最优的模式可以猜测为前面若干对2,0.5,后面若干连续0.5,中间隔一个待定数
设待定数u=a_(2k+1)则可以推得u=1/{4(2k+1)}*(n^2-n+2-(6k^2-4k))现在的问题归结于求k值?
根据youyouyou提供的 ...
数学星空 发表于 2010-5-22 23:15 http://bbs.emath.ac.cn/images/common/back.gif
这个k的计算其实不难,只要根据前面加权和为${n^2}/2$,而且$1/2<=u<=2$可以得出一个不等式,而这个不等式的整数解会正好唯一存在

数学星空 发表于 2010-5-23 17:19:02

根据mathe的提示:
我们可以算出:
k=[sqrt{1/{2(d-c)} ((2R-c)n^2-nc)} ]
当c=1/2,d=2,R=1/2时 k=[ sqrt{(n^2-n)/6}]
注: 为不大于x的最大整数
页: 1 [2]
查看完整版本: 一个最大值问题