我开始关注简单的优化问题:
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.5925
中Obj
的可变数量的输入函数。在上面的例子中,我有三个函数,即
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.手动输入所有功能都很困难。
答案 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需要一个指向一个函数的指针,该函数接收一个向量并返回一个标量。