如何解决这样一个比例函数?

时间:2015-06-07 20:01:27

标签: matlab math linear-programming

假设W是一个已知的向量,在这里我想找到唯一的解决方案a,例如:

  

Sum(min(1,W(i)/a))=M (M is known)

这种功能有没有具体名称?如果你们能给我一些指示链接,那就太好了。

感谢。

1 个答案:

答案 0 :(得分:0)

我假设W的条目是正面的;在你的问题的上下文中,负数没有多大意义(因为你在1处而不是-1处截断),而零没有贡献,可以用nonzeros命令删除。

以下是解决问题的方法:

  1. 将W从最小到最大排序
  2. 对于每个i,使用a = W(i)计算得到的总和。
  3. 选择仍然给出总和> = M的最大i。这告诉你a在W(i)和W(i + 1)之间
  4. 根据需要增加a得到sum = M.这是一个简单的代数问题,因为你知道索引>元素的贡献。我将被截断为1.
  5. 这是一个实现。 candidates是a = W(i)得到的总和的各种值,如上所述。

    W = [3 1 4 1 5 9 2 6 5 3];  M = 7;    % test data
    
    n = numel(W);
    sorted = sort(W);
    cs = cumsum(sorted);
    candidates = cs./sorted+(n-1:-1:0);    % what you get with a = sorted(i)
    i = find(candidates>=M, 1, 'last');    
    if (numel(i)==0)
        disp('No solution');                % M is too big
    else
        a = cs(i)/(M-(n-i))         % from the equation  cs(i)/a + (n-i) = M
        disp(min(W/a,1));           % for confirmation of correctness
        disp(sum(min(W/a,1)));      % for confirmation of correctness
    end
    

    返回

    a = 4.6667
    
    0.6429    0.2143    0.8571    0.2143    1.0000    1.0000    0.4286    1.0000    1.0000    0.6429
    
     7