但我想制作一个程序,我可以在其中生成多个变量的函数,这些变量取决于矩阵的行数。
for k = 1:sizel;
f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2));
end
cost=(sum(f))
这是为了优化的目的,所以我需要在最后将变量声明为p(1),p(2),p(3)
...这些将是我的函数的输入。
注意:我不想为变量赋值,因为这将是优化工具箱中的优化算法。
这是完整的代码
function cost = cost(p) ;
clc
clear
costfunctionconstantsmatrix;
sizel=size(CostFormulaconstants);
alpha=CostFormulaconstants(:,1);
beta=CostFormulaconstants(:,2);
gamma=CostFormulaconstants(:,3);
for k = 1:sizel;
f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2));
end
cost=(sum(f))
end
我使用符号方法,我得到了正确的成本答案,我有这样的东西:(53 * p(1))/ 10 +(11 * p(2))/ 2 +(29 * p(3))/ 5 + p(1)^ 2/250 +(3 * p(2)^ 2)/ 500 +(9 * p(3)^ 2)/ 1000 + 1100.但是当我尝试指定我的函数在优化工具箱中进行优化,它告诉我变量p是sym,不能转换为double。问题是如何将此表达式转换为double,以便优化算法可以输入变量p(1),p(2)和p(3)的值
答案 0 :(得分:0)
你能把矩阵作为参数传递给函数吗?
function cost = fcn(my_mat)
[m,n] = size(my_mat);
f = zeros(m,1);
for k = 1:m % for example
f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2));
end
cost = sum(f);
end
答案 1 :(得分:0)
我的问题并不完全清楚,但我相信您希望生成一系列函数,其中变量alpha
,beta
,gamma
是常量,每个函数的值都不同函数,向量p
是一个参数。
在你的问题中让我感到困惑的是你使用索引k
来表示常量和参数,我认为这不是你想写的。假设我了解你的目标,解决方案可能会使用函数句柄。
例如,符号f(k) = @(p) p(1)+p(2)
会生成一个添加p(1)
和p(2)
的函数。将CostFormulaconstants
缩写为cf
,以下内容将生成一系列函数,每个函数对应cf
中的每一行。
for k = 1 : size(cf, 1)
f{k} = @(p) cf(k,1) + cf(k,2)*p(1) + cf(k,3)*p(2)^2;
end
例如,您可以使用f{3}
为优化工具箱向呼叫者提供单独的功能句柄,例如第三个功能。对f{3}
的调用看起来像
a = f{3}([3,4]);
如果你的函数确实都是多项式,那么polyval
也值得一看。
编辑:澄清后,问题似乎有点简单,不需要功能句柄。为什么不简单
function c = cost(p)
c = 0;
cf = [...]; % your coefficients here.
for k = 1 : size(cf, 1)
c = c + cf(k,1) + cf(k,2)*p(k) + cf(k,3)*p(k)^2;
end