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

时间:2014-01-19 19:42:08

标签: 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=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.

1 个答案:

答案 0 :(得分:0)

错误的原因是您用来调用generatevalues的语法错误。通过运行generatevalues([X1,X2,X3,X4]),您使用单个输入参数(即a1 = [X1,X2,X3,X4])进行调用。 删除方括号以指定四个输入参数,否则您只是在进行X1X2X3X4的水平连接。< / p>

获得正确的语法后:

generatevalues(X1,X2,X3,X4)

由于您不再只有一个方程组,因此FOC会遇到问题。如果您正在尝试解决多个系统方程式,则可能需要在循环中或fsolve多次调用arrayfun。例如,

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所以我不能说是否有办法在没有循环的情况下解决多个系统(如果你想做的话)。