我正在尝试在MATLAB中实现以下内容,
n1 = 6;
n2 = 1;
n3=0.1;
global ps
ps=zeros(3,15);
[R,t,d]=model(n1,n2,n3);
ps=R;
[x, fval] = fmincon(@Obj,[1/3,1/3, 1/3],[],[],[],[],[],[],@cons);
function f = Obj(x)
f = x(1)^2+x(2)^3+x(3)^4;
function [c, ceq] = cons(x)
c=[];
ceq(1) = sum(ps(1,:))*x(1)+sum(ps(2,:))*x(2)+sum(ps(3,:))*x(3) - (sum(d(1,:)));
ceq(2) = sum(x) - 4;
我收到了以下错误,这里有什么问题?
variable or function 'ps' undefined
答案 0 :(得分:3)
您不需要为此确定should not use global variables。这是一个非常坏的习惯inefficient to boot。每当您考虑使用global
时,您应该问自己是否有其他方法并搜索它。只有在非常罕见的情况下才需要/有用全局变量(通常在大型代码库中,例如工具箱)。
在您的情况下,您应该通过创建anonymous function将ps
变量作为参数传递。首先像这样定义你的cons
函数,以便它接受一个参数参数:
function [c, ceq] = cons(x,ps)
然后使用一个输入(x
)和一个捕获的参数(变量ps
创建匿名函数,需要在此之前定义):
[x, fval] = fmincon(@Obj,[1/3,1/3, 1/3],[],[],[],[],[],[],@(x)cons(x,ps));
或者,您可以将句柄保存到匿名函数并将其传递到:
cfun = @(x)cons(x,ps);
[x, fval] = fmincon(@Obj,[1/3,1/3, 1/3],[],[],[],[],[],[],cfun);
答案 1 :(得分:1)
我不能运行你的代码行,但我认为你必须把
global ps
在function cons
中通知Matlab您指的是全局ps
。有关全局变量的更多信息,请访问:http://www.mathworks.de/de/help/matlab/ref/global.html
编辑:为了更清洁的设计,你应该考虑到霍希勒的建议:https://stackoverflow.com/a/20721808/3060323