变量或函数未定义

时间:2013-12-21 15:00:36

标签: matlab optimization

我正在尝试在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

2 个答案:

答案 0 :(得分:3)

您不需要为此确定should not use global variables。这是一个非常坏的习惯inefficient to boot。每当您考虑使用global时,您应该问自己是否有其他方法并搜索它。只有在非常罕见的情况下才需要/有用全局变量(通常在大型代码库中,例如工具箱)。

在您的情况下,您应该通过创建anonymous functionps变量作为参数传递。首先像这样定义你的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);

这是blog post from The MathWorks with other bad habits

答案 1 :(得分:1)

我不能运行你的代码行,但我认为你必须把

global ps

function cons中通知Matlab您指的是全局ps。有关全局变量的更多信息,请访问:http://www.mathworks.de/de/help/matlab/ref/global.html

编辑:为了更清洁的设计,你应该考虑到霍希勒的建议:https://stackoverflow.com/a/20721808/3060323