почему я получаю ошибку неопределенной функции fminsearch

Я пытаюсь оптимизировать функцию с двумя входами. Пытаюсь использовать fminsearch, но он продолжает говорить о неопределенной функции или переменной, хотя она уже определена.

Я уже определил функцию в отдельном скрипте, который находится в том же каталоге, что и мой основной скрипт. У меня есть классная лицензия, которая включает набор инструментов для оптимизации, и при вызове функции нет орфографической ошибки.

function o=u(x,y)  
%some code here
end

%in a second script

init=[0.1,0.1];

b=fminsearch(o,init);

Ошибка:

Неопределенная функция или переменная 'o'.


person neoborg    schedule 16.07.2019    source источник
comment
Определите o перед его использованием. Он нигде не определен в коде, который вы показали здесь. Вы определили функцию u, хотя   -  person Sardar Usama    schedule 16.07.2019
comment
@SardarUsama, кроме того, им не хватает дескриптора функции, см. этот мой ответ   -  person Adriaan    schedule 16.07.2019


Ответы (1)


Из документации на fminsearch минимизируемая функция должна иметь один аргумент и доступ к нему осуществляется с помощью дескриптора функции ( см. этот связанный ответ).

Ошибка, которую вы получаете, связана с тем, что вы не можете вызвать o и использовать ее в качестве входных данных для fminsearch(), поскольку o не определено. Чтобы получить o, вы должны сначала получить u(x,y), плюс, как уже упоминалось, fminsearch требуется дескриптор функции в качестве входных данных.

У вас есть несколько вариантов, которые по-прежнему используют вашу автономную функцию, u(x,y).

<сильный>1. Создайте дескриптор функции
Определите дескриптор функции, который вызывает u(x,y), но имеет единственный аргумент, который представляет собой вектор 2 x 1, z = [x; y].

fh =@(z) u(z(1),z(2));
z0 = [1; 2];                         % Initial Guess for z = [x; y]
[z,TC] = fminsearch(fh,z0)     

<сильный>2. Измените функцию и вызовите ее напрямую

Тот же результат возможен с

[z,TC] = fminsearch(@u,z0)

если вы переопределите u(x,y) следующим образом:

function o=u(z) 
   x = z(1);
   y = z(2); 
   % your function code here
end
person SecretAgentMan    schedule 17.07.2019