如何在matlab中用矩阵数据创建多变量函数?

时间:2013-12-05 16:19:12

标签: matlab function variables matrix

但我想制作一个程序,我可以在其中生成多个变量的函数,这些变量取决于矩阵的行数。

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)的值

2 个答案:

答案 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)

我的问题并不完全清楚,但我相信您希望生成一系列函数,其中变量alphabetagamma是常量,每个函数的值都不同函数,向量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