Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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_Octave - Fatal编程技术网

Matlab 倍频程:未找到函数和方法错误

Matlab 倍频程:未找到函数和方法错误,matlab,octave,Matlab,Octave,我在尝试求解八度非线性系统时遇到以下错误: 错误:@Jfun:找不到函数和方法 错误:从 第4行第13列的voc 我正在使用4个脚本,但找不到错误的来源。ffun、jfun和newtonsys文件之前已经过测试,我几乎可以肯定问题不在那里(虽然我不知道这是否可能是变量命名的问题),但为了以防万一,我将它们全部包含在下面 文件voc.m x0=[9;8;0.5]; tol=10^-3; nmax=1000; [z,res,niter]=newtonsys(@Ffun,@Jfun,x0,tol,nm

我在尝试求解八度非线性系统时遇到以下错误:

错误:@Jfun:找不到函数和方法
错误:从
第4行第13列的voc

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

文件voc.m

x0=[9;8;0.5];
tol=10^-3;
nmax=1000;
[z,res,niter]=newtonsys(@Ffun,@Jfun,x0,tol,nmax)
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
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
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
文件Ffun.m

x0=[9;8;0.5];
tol=10^-3;
nmax=1000;
[z,res,niter]=newtonsys(@Ffun,@Jfun,x0,tol,nmax)
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
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
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
文件JFun.m

x0=[9;8;0.5];
tol=10^-3;
nmax=1000;
[z,res,niter]=newtonsys(@Ffun,@Jfun,x0,tol,nmax)
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
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
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
文件newtonsys.m

x0=[9;8;0.5];
tol=10^-3;
nmax=1000;
[z,res,niter]=newtonsys(@Ffun,@Jfun,x0,tol,nmax)
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
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
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
函数[x,res,niter]=newtonsys(Ffun,Jfun,x0,tol,。。。
nmax,varargin)
硝酸盐=0;
err=tol+1;
x=x0;
而err>=tol&nitertol)
fprintf(['Il metodo non converge nel massimo',。。。
“数字迭代”,。。。
“calcolata ha residuo relatio pari a%e\n'],F);
其他的
fprintf(['Il metodo在%i iterazioni'中收敛,。。。
'剩余部分a%e\n'],单位,F);
结束
返回

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

在您的情况下,解决方案是将所有这些变量定义移动到函数块中,使其成为一个适当的“函数文件”,然后可以从voc访问它(只要它位于同一目录/八度路径中)

或者,如果您仍然喜欢将
JFun.m
作为脚本(例如,可能您确实希望所有这些变量最终都在全局范围内定义),那么只需确保首先将其作为脚本运行,这样它就可以首先定义您需要的函数;但是,在这种情况下,最好将脚本的名称更改为其他名称,这样它的名称就不会与其中定义的就地函数冲突


快速查看手册中的,尤其是特定部分。

我认为这是一个很好的例子,一个简单的例子会有所帮助。尽可能多地去除污垢,直到你用几条线来解决问题。在大多数情况下,你会发现你自己的问题,同样的道理也适用于Ffun;您没有收到该错误的原因可能是您意外地在voc之前“运行”了Ffun,所以现在定义了它。