我想重写以下函数,以便它可以应用于网格:
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.
答案 0 :(得分:0)
错误的原因是您用来调用generatevalues
的语法错误。通过运行generatevalues([X1,X2,X3,X4])
,您使用单个输入参数(即a1 = [X1,X2,X3,X4]
)进行调用。 删除方括号以指定四个输入参数,否则您只是在进行X1
,X2
,X3
和X4
的水平连接。< / 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
所以我不能说是否有办法在没有循环的情况下解决多个系统(如果你想做的话)。