八度:无功能,无方法错误

时间:2018-09-12 15:05:50

标签: matlab octave

尝试在Octave中求解非线性系统时出现以下错误:

  

错误:@Jfun:未找到函数且未找到方法
  错误:从
调用      第4行第13列的voc

我正在使用4个脚本,但找不到错误的来源。 ffunjfunnewtonsys文件之前已经过测试,我几乎可以确定问题不存在(我不知道变量命名是否有问题。虽然),但为了防万一,我将它们全部包括在下面。

文件voc.m

x0=[9;8;0.5];
tol=10^-3;
nmax=1000;
[z,res,niter]=newtonsys(@Ffun,@Jfun,x0,tol,nmax)

文件功能.m

q=1.602E-19;
k=1.381E-23;
Ncs=12;
Tc=329.25;
gamma=1.35;
Isc=9.14;
Rsh=94.5;
Vmp=37.8;
Imp=8.74;
function F=Ffun(x)
    F(1,1)=Isc+x(2)*[exp((q*Isc*x(3))/(gamma*k*Tc*Ncs))-1]-(Isc*x(3))/Rsh-x(1);
    F(2,1)=x(2)*[exp(q*(Voc)/(gamma*k*Tc*Ncs))-1]+(Voc/Rsh)-x(1);
    F(3,1)=Imp+x(2)*[exp(q*(Vmp+Imp*x(3))/(gamma*k*Tc*Ncs))-1]+(Vmp+(Imp*x(3)))/Rsh-x(1);
endfunction

文件JFun.m

q=1.602E-19;
k=1.381E-23;
Ncs=12;
Tc=329.25;
gamma=1.35;
Isc=9.14;
Rsh=94.5;
Vmp=37.8;
Imp=8.74;
function J=Jfun(x)
    J(1,1)=-1;
    J(1,2)=exp((q*Isc*x(3))/(gamma*k*Tc*Ncs))-1;
    J(1,3)=x(2)*[exp((q*Isc*x(3))/(gamma*k*Tc*Ncs))]*(q*Isc/(gamma*k*Tc*Ncs))-(Isc/Rsh);
    J(2,1)=-1;
    J(2,2)=exp(q*(Voc)/(gamma*k*Tc*Ncs))-1;
    J(2,3)=0;
    J(3,1)=-1;
    J(3,2)=exp(q*(Vmp+Imp*x(3))/(gamma*k*Tc*Ncs))-1;
    J(3,3)=x(2)*[exp(q*(Vmp+Imp*x(3))/(gamma*k*Tc*Ncs))]*(q*Imp/(gamma*k*Tc*Ncs))+(Imp/Rsh);
endfunction

文件newtonsys.m

function [x,res,niter] = newtonsys(Ffun,Jfun,x0,tol,...
                                nmax, varargin)
    niter = 0;
    err = tol + 1;
    x = x0;
    while err >= tol & niter < nmax
        J = Jfun(x,varargin{:});
        F = Ffun(x,varargin{:});
        delta = - J\F;
        x = x + delta;
        err = norm(delta);
        niter = niter + 1;
    end

    res = norm(Ffun(x,varargin{:}));
    if (niter==nmax & err> tol)
        fprintf(['Il metodo non converge nel massimo ',...
           'numero di iterazioni. L''ultima iterata\n',...
           'calcolata ha residuo relativo pari a %e\n'],F);
    else
        fprintf(['Il metodo converge in %i iterazioni',...
            ' con un residuo pari a %e\n'],niter,F);
    end

    return

1 个答案:

答案 0 :(得分:1)

问题是您的JFun.m文件不是功能文件,它是一个脚本文件,碰巧在其中定义了“现场”功能JFun。如果voc.m脚本恰巧在之前调用了该函数(即JFun.m脚本有机会运行之前,因此最终在当前环境),然后它会抱怨说那里不存在。

您所遇到的解决方案是将所有这些变量定义移到功能块内,使其成为适当的“功能文件”,然后可以从voc中访问它(只要它位于同一目录中/八度音阶路径中) )。

或者,如果您仍然希望将JFun.m用作脚本(例如,也许 do 希望所有这些变量最终在全局范围内定义),那么只需确保您首先将其作为脚本 first 运行,以便它首先定义您需要的功能;但是,在这种情况下,最好将脚本名称更改为其他名称,以使其名称与脚本中定义的现场功能不冲突。

快速浏览手册中的respective section,尤其是this部分。