Matlab 变量或函数未定义
我试图在MATLAB中实现以下内容:Matlab 变量或函数未定义,matlab,optimization,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=[];
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
我无法运行您的代码行,但我认为您必须
global ps
在函数中,cons
通知Matlab您指的是全局ps
。有关全局变量的更多信息,请参见:
编辑:为了更简洁的设计,您应该考虑horchler的建议:我无法运行您的代码行,但我认为您必须
global ps
在函数中,cons
通知Matlab您指的是全局ps
。有关全局变量的更多信息,请参见:
编辑:为了更简洁的设计,你应该考虑霍奇勒的建议:你不需要为这个定义和定义。这是一个非常坏的习惯和习惯。每当你考虑使用
global
时,你应该问问自己是否还有其他方法并搜索它。只有在非常罕见的情况下,全局变量才是必需的/有用的(通常在大型代码库中,如工具箱中)
在您的情况下,您应该通过创建一个。首先像这样定义cons
函数,以便它接受一个参数参数:
function [c, ceq] = cons(x,ps)
然后使用一个输入(x
)和一个捕获的参数(变量ps
,在此之前需要定义)创建匿名函数:
或者,您可以保存匿名函数的句柄并将其传入:
cfun = @(x)cons(x,ps);
[x, fval] = fmincon(@Obj,[1/3,1/3, 1/3],[],[],[],[],[],[],cfun);
这里有一个。你不需要为这个定义。这是一个非常坏的习惯和习惯。每当你考虑使用
global
时,你应该问问自己是否还有其他方法并搜索它。只有在非常罕见的情况下,全局变量才是必需的/有用的(通常在大型代码库中,如工具箱中)
在您的情况下,您应该通过创建一个。首先像这样定义cons
函数,以便它接受一个参数参数:
function [c, ceq] = cons(x,ps)
然后使用一个输入(x
)和一个捕获的参数(变量ps
,在此之前需要定义)创建匿名函数:
或者,您可以保存匿名函数的句柄并将其传入:
cfun = @(x)cons(x,ps);
[x, fval] = fmincon(@Obj,[1/3,1/3, 1/3],[],[],[],[],[],[],cfun);
这是一个。我已将全局ps添加到我的主脚本中。你的意思是我也需要将其添加到约束文件中吗?@user312589,是的,必须在要访问全局变量的每个工作区中发出
global
命令。我已将全局ps添加到我的主脚本中。你的意思是我也需要将其添加到约束文件中吗?@user312589,是的,必须在您希望访问全局变量的每个工作区中发出全局
命令。我完全同意,但接受的答案仍然是回答所提出问题的答案。@A.Donda:我的答案不是?这个问题没有提到全局变量,即使它提到了,也仍然是一个很容易纠正的坏主意。@horchler在问题的原始版本中,在第一行代码中有一个global ps
,所以我只想给出一个如何从另一个函数中访问该变量的提示。毫无疑问,你的答案更清晰、更具启发性、更完整,应该是被接受的答案。@horchler,正如我所说,我同意你的建议。但问题是“我遇到了以下错误,这里出了什么问题?”,答案是函数中的global
语句缺失。从这个意义上说,不,你没有回答这个问题——没有冒犯的意思。我之所以这么说,是因为你的原文似乎暗示@blackbird的答案被不公正地接受了。“伊莫,情况不是这样的。”黑鸟:谢谢。这就澄清了问题,虽然我不知道为什么OP删除了这一行。我完全同意,但被接受的答案仍然是回答问题的答案。@A.Donda:我的答案不是?这个问题没有提到全局变量,即使它提到了,也仍然是一个很容易纠正的坏主意。@horchler在问题的原始版本中,在第一行代码中有一个global ps
,所以我只想给出一个如何从另一个函数中访问该变量的提示。毫无疑问,你的答案更清晰、更具启发性、更完整,应该是被接受的答案。@horchler,正如我所说,我同意你的建议。但问题是“我遇到了以下错误,这里出了什么问题?”,答案是函数中的global
语句缺失。从这个意义上说,不,你没有回答这个问题——没有冒犯的意思。我之所以这么说,是因为你的原文似乎暗示@blackbird的答案被不公正地接受了。“伊莫,情况不是这样的。”黑鸟:谢谢。这就澄清了问题,虽然我不知道为什么OP删除了那一行。回滚到原来的代码,因为似乎是意外删除了一半代码。(甚至把格式弄乱了一点)回滚到原始版本,因为似乎有一半代码被意外删除。(甚至把格式弄乱了一点)