октава: функция не найдена, метод не найден - PullRequest
0 голосов
/ 12 сентября 2018

Я получаю следующую ошибку при попытке решить нелинейную систему в Octave:

ошибка: @Jfun: нет функции и метод не найден
ошибка: вызывается из
voc atстрока 4 столбец 13

Я использую 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)

Файл Ffun.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 голосов
/ 13 сентября 2018

Проблема в том, что ваш JFun.m файл НЕ является функциональным файлом, это файл сценария, который определяет '* на месте' функцию JFun внутри него.Если случается, что сценарий voc.m вызывает эту функцию до , она была определена (т. Е. До того, как сценарий JFun.m был запущен и, следовательно, в конечном итоге определял эту функцию в текущей среде), тогдаон будет жаловаться, что его там нет.

Решение в вашем случае состоит в том, чтобы переместить все эти определения переменных в функциональный блок, превратив его в «функциональный файл», который затем будет доступен из voc (до тех пор, покаон находится в том же каталоге / в пути октавы).

В качестве альтернативы, если вы по-прежнему предпочитаете JFun.m как сценарий (например, возможно, вы do хотите, чтобы все эти переменные заканчивалисьбудучи определенным в глобальной области видимости), просто убедитесь, что вы запускаете его как скрипт first , чтобы он сначала определял нужную вам функцию;однако в этом случае хорошей идеей будет изменить имя вашего скрипта на другое, чтобы его имя не конфликтовало с определенной на нем функцией «на месте».

Иметьбыстрый взгляд на соответствующий раздел в руководстве, и в частности это часть.

...