在MATLAB中使用可变数量的输入函数进行优化

时间:2015-11-20 19:35:47

标签: matlab convex-optimization

我开始关注简单的优化问题:

val set3 = Set("abcd", "defg", "ghij", "fghtre", "dfghdd") set3.getClass //scala.collection.immutable.HashSet$HashTrieSet

这会给出答案: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.7785

但是,我需要fval = 1.5925Obj的可变数量的输入函数。在上面的例子中,我有三个函数,即

max(-[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]) 的变化可能超过20.手动输入所有功能都很困难。

1 个答案:

答案 0 :(得分:0)

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

相反,你应该编写一些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需要一个指向一个函数的指针,该函数接收一个向量并返回一个标量。