Matlab 编写一个函数,使其可以应用于网格

Matlab 编写一个函数,使其可以应用于网格,matlab,Matlab,我想重写以下函数,以便将其应用于网格: function [ PNE ] = generatevalues( a1, a2, b1, b2 ) function [F]=FOC(p) F=[0 0]; F(1)=-(1+exp(-p(2)))*(p(1)-a1)+1+exp(-p(1))+(1-b1)*exp(-p(2)); F(2)=-(1+exp(-p(1)))*(p(2)-a2)+1+exp(-p(2))+(1-b2)*exp(-p(1)); end P0=[0.1 0.1]; PNE=f

我想重写以下函数,以便将其应用于网格:

function [ PNE ] = generatevalues( a1, a2, b1, b2 )
function [F]=FOC(p)
F=[0 0];
F(1)=-(1+exp(-p(2)))*(p(1)-a1)+1+exp(-p(1))+(1-b1)*exp(-p(2));
F(2)=-(1+exp(-p(1)))*(p(2)-a2)+1+exp(-p(2))+(1-b2)*exp(-p(1));
end
P0=[0.1 0.1];
PNE=fsolve(@FOC,P0);
end
当我将函数应用于网格时,例如

x1gv = 0:0.1:0.1;
x2gv = 0:0.1:0.1;
x3gv = 0:0.1:0.1;
x4gv = 0:0.1:0.1;
[X1,X2,X3,X4] = ndgrid(x1gv, x2gv, x3gv, x4gv);
出现以下消息:

    generatevalues([X1,X2,X3,X4])

Error using generatevalues/FOC (line 4)
Not enough input arguments.

Error in fsolve (line 241)
            fuser = feval(funfcn{3},x,varargin{:});

Error in generatevalues (line 8)
PNE=fsolve(@FOC,P0);

Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.

出现错误的原因是,用于调用
generatevalues
的语法错误。通过运行
generatevalues([X1,X2,X3,X4])
,您可以使用单个输入参数(即
a1=[X1,X2,X3,X4]
)进行调用。删除方括号以指定四个输入参数,否则您只需执行
X1
X2
X3
X4
的水平串联

获得正确语法后:

generatevalues(X1,X2,X3,X4)
由于不再只有一个方程组,因此在使用FOC时会遇到麻烦。如果您试图求解多个方程组,则可能需要在循环中或使用
arrayfun
多次调用
fsolve
。比如说,

function [ PNE ] = generatevalues( a1, a2, b1, b2 )
function [F]=FOC(p,ii)
F=[0 0];
F(1)=-(1+exp(-p(2)))*(p(1)-a1(ii))+1+exp(-p(1))+(1-b1(ii))*exp(-p(2));
F(2)=-(1+exp(-p(1)))*(p(2)-a2(ii))+1+exp(-p(2))+(1-b2(ii))*exp(-p(1));
end
P0=[0.1 0.1];
PNEc = arrayfun(@(ii)fsolve(@FOC,P0,[],ii),1:numel(a1),'uni',0);
PNE = vertcat(PNEc{:});
end

我很少使用
fsolve
,所以我不能说是否有一种方法可以不用循环求解多个系统(如果你想这么做的话)。

是的,我尝试用fsolve不用循环求解多个方程组,网格中的每个点对应一个方程组。我的目标是修改“generatevalues”,使其返回值网格的方式与写入“sin([X1,X2,X3,X4])时“sin”返回值网格的方式相同。在网格的每一点上,通过将“sin”应用于该点处的“[X1,X2,X3,X4]”值来获得“sin”([X1,X2,X3,X4])。类似地,我希望“generatevalues”按点操作。好的,
sin
只接受一个输入参数,而
generatevalues
接受4个输入参数。因此,以这种方式使用方括号时会出现错误。然后,要为输入数组中的所有值求解每个系统,需要在循环中调用
fsolve
(或使用
arrayfun
)来求解每个系统。对不起,
sin
不是正确的类比。在网格上按点操作的函数示例是
F=@(A1,A2,B1,B2)A1.*B1+A2.*B2
。这里
F(X1,X2,X3,X4)
给出了一个网格。