Ошибка в print_usage и fzero при запуске скрипта Matlab в октаве - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь запустить inputfile_calrel_example1 FERUM Matlab-скрипты из https://www.sigma-clermont.fr/en/ferum в Octave-5.1.0.0, но сталкиваюсь с ошибками в отношении print_usage и fzero следующим образом:

error: Invalid call to fzero.  Correct usage is:

 -- fzero (FUN, X0)
 -- fzero (FUN, X0, OPTIONS)
 -- [X, FVAL, INFO, OUTPUT] = fzero (...)
error: called from
    print_usage at line 91 column 5
    fzero at line 133 column 5
    drho0_dthetaf_integral at line 75 column 22
    mod_corr_solve at line 99 column 54
    form at line 90 column 58
    ferum at line 129 column 33
>>

При просмотре файла print_usage.m строка 91 выглядит следующим образом:

   error ("Octave:invalid-fun-call", msg);

, а строки 78–92:

    if (at_toplev)
    error ("Octave:invalid-fun-call",
           "Invalid call to %s.  Correct usage is:\n\n%s\n%s",
           name, usage_string, __additional_help_message__ ());
  else
    msg = sprintf ("Invalid call to %s.  Correct usage is:\n\n%s",
                   name, usage_string);
    ## Ensure that the error doesn't end up with a newline, as that disables
    ## backtraces.
    if (msg(end) == "\n")
      msg(end) = " ";
    endif

    error ("Octave:invalid-fun-call", msg);
  endif

и строки fzero с 132 по 134 выглядят следующим образом:

  if (nargin < 2 | nargin > 3)
    print_usage (mfilename ());
  end

Я хотел бы получить подсказки о том, как решить вышеуказанные сообщения об ошибках.

С уважением, Алию Азиз

1 Ответ

0 голосов
/ 20 января 2020

Как указано в комментариях, fzero был вызван со следующими аргументами.

drho0_dthetafi.mu = fzero( ...
    'betadrho0_dthetaf'    ...
    , 0                    ...
    , optimset('fzero')    ...
    , dF_dthetafi.mu       ...
    , PHI2                 ...
    , F                    ...
    , dPHI2_dZi            ...
    , dZi_dthetafi.mu      ...
    , dPHI2_drho0          ...
    , detJ                 ...
    , WIP                  ...
);

Из документации (help fzero) видно, что указанный выше вызов не является действительным fzero call:

-- fzero (FUN, X0, OPTIONS)
     Find a zero of a univariate function

   FUN is a function handle, inline function, or string containing the
     name of the function to evaluate.

    X0 should be a two-element vector specifying two points which
     bracket a zero. If X0 is a single scalar then several nearby and distant
     values are probed in an attempt to obtain a valid bracketing. If this is not
     successful, the function fails.

    OPTIONS is a structure specifying additional options.
     To initialize an options structure with default values for 'fzero'
     use 'options = optimset ("fzero")'.

Итак, как видите, дополнительные аргументы после 'optimset' вызывают ошибку.

Я предполагаю, что дополнительные аргументы были предназначены для быть аргументами функции betadrho0_dthetaf. В общем случае функция FUN ожидает один аргумент (поскольку он одномерный). Если ваша функция betadrho0_dthetaf ожидает ряд других параметров, то вместо использования ее в fzero через строку оберните ее вокруг дескриптора анонимной функции, который делает только один аргумент и использует вашу намеченную функцию внутри себя. чтобы рассчитать ожидаемый результат, например

drho0_dthetafi.mu = fzero(  ...
    @(x) betadrho0_dthetaf( ...
        x                   ...
        , dF_dthetafi.mu    ...
        , PHI2              ...
        , F                 ...
        , dPHI2_dZi         ...
        , dZi_dthetafi.mu   ...
        , dPHI2_drho0       ...
        , detJ              ...
        , WIP               ...
    )                       ...     
    , 0                     ...
    , optimset('fzero')     ...
);

или что-то в том же духе, в зависимости от того, как вы будете вызывать эту бета-функцию.

...