【问题标题】:Optimize with variable number of input functions in MATLAB在 MATLAB 中使用可变数量的输入函数进行优化
【发布时间】:2015-11-20 19:35:46
【问题描述】:

我从以下简单的优化问题开始:

F=@(L) max(-[log(L(1)/(L(1)+1)) log(L(2)/(L(2)+1))+log(1-L(1)) log(L(3)/(L(3)+1))+log(1-L(1))+log(1-L(2))]); [L,fval]=fmincon(F,[0.5 0.5 0.5],[],[],[],[],[0;0;0],[1;1;1])

这给出了答案:L = 0.2554 0.3759 0.7785fval = 1.5925

但是,我需要在max(-[Obj]) 中为Obj 提供可变数量的输入函数。在上面的例子中,我有三个函数,即

Obj=log(L(1)/(L(1)+1)) log(L(2)/(L(2)+1))+log(1-L(1)) log(L(3)/(L(3)+1))+log(1-L(1))+log(1-L(2))

我使用以下代码生成Obj,其中函数的数量取决于M

M = 3;
for i = 1:M
    L(i) = sym(['L(' num2str(i) ')'])
end

tempL = log(1-L);
for m=1:M 
Obj(1,m) =  log((L(m))/(1+L(m))) + sum(tempL(1:m-1));
end
Obj

这与上面的示例完全相同的Obj,但是当我将这个Obj 传递给以下优化函数时,它不支持。

F=@(L) max(-[Obj]);
[L,fval]=fmincon(F,[0.5 0.5 0.5],[],[],[],[],[0;0;0],[1;1;1])

有人可以帮我解决这个问题吗?因为M可以变化20多个。很难手动输入所有功能。

【问题讨论】:

    标签: matlab convex-optimization


    【解决方案1】:

    我更喜欢这样写一些函数:

    相反,您应该编写一些 MATLAB 函数,该函数接受一个向量并返回一个标量,其中返回的标量的值就是您的函数的值。创建一个单独的 matlab 文件(例如 myfunction.m)并执行以下操作:

    function result = myfunction(L)
    
    M = length(L);
    
    log_one_minus_L = log(1 - L);
    log_L           = log(L);
    log_one_plus_L  = log(1 + L);
    
    
    sumsum_templ    = (M-1:-1:1) * log_one_minus_L(1:end-1);
    result = sum(log_L - log_one_plus_L) + sumsum_templ;
    

    通过测试各种值来确保您的函数 myfunction 正常工作。例如。 myfunction([0; 1]) 看看它是否返回正确的值。

    要进行优化,您可以调用fmincon(myfunction, ...) fmincon 需要一个指向函数的指针,该函数接收一个向量并返回一个标量。

    【讨论】:

    • 由于我有变量M,您能否告诉我(直接)如何将其应用于我的案例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多