Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 变量或函数未定义_Matlab_Optimization - Fatal编程技术网

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=[];

我试图在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

我无法运行您的代码行,但我认为您必须

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删除了那一行。回滚到原来的代码,因为似乎是意外删除了一半代码。(甚至把格式弄乱了一点)回滚到原始版本,因为似乎有一半代码被意外删除。(甚至把格式弄乱了一点)