如何使用矩阵数据在matlab中创建多变量函数?
但是我想做一个程序,在这个程序中我可以生成一个多变量函数,这个函数依赖于矩阵的行数如何使用矩阵数据在matlab中创建多变量函数?,matlab,function,variables,matrix,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)
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)的值。您可以将矩阵作为参数传递给函数吗
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
我不完全清楚您的问题,但我相信您希望生成一系列函数,其中变量
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
我不确定你到底想做什么函数的输入是矩阵和向量p?如果是这样的话,那么提交的答案就行了。你也可以检查符号变量。我使用了符号方法,得到了正确的成本答案。事实上,我得到了这样的结果:(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)的值。你检查过了吗?这会给出一个错误,因为向量p没有定义,我想他说p要传递给函数,所以可能需要编辑that@mhmsa对我假设所有必要的变量要么在函数中定义,要么作为附加参数传递,要么是全局变量。代码只是用来说明过程,而不是现成的工作。例如,我想要得到的是:f1=(0.004*(p(1)^2))+(5.3*p(1))+500 f2=(0.006*(p(2)^2))+(5.5*p(2))+400 f3=(0.009*(p(3)^2))+(5.8*p(3))+200,然后成本=f1+f2+f3在此之后,我将继续最小化成本