Проблема с оптимизацией функции, которая содержит "for-l oop" - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь оптимизировать функцию в MATLAB, в которой есть for -l oop. Я пробовал разные коды, но не получил никаких результатов и не могу понять, в чем проблема.

вот функция:

function U2 = least1(ydata,xdata,x,y1,w,A,sz,yprime,y) 
for i=1:1:1000 
    U2(1,i) = sum((sqrt(1+yprime.^2)).*(A(1) * exp(-y/A(2))*(1 - exp(-ydata(i)/A(2)))...
           + A(3) * exp(-y/A(4))*(exp(-ydata(i)/A(4))-1)).*w);     
 end
end

Все переменные доступны, мне просто нужно оптимизировать его, чтобы получить идеальное совпадение A. Я попытался решить проблему с помощью проблемной оптимизации, как показано ниже: вместо четырех значений A я получаю -Inf -Inf -Inf -Inf

A = optimvar('A',4);
potential = fcn2optimexpr(@least1,A);
obj = sum((potential - u1).^2);
prob = optimproblem('Objective',obj);
x0.A = [11.959,0.069,3.53,4.118*10^(-3)];
show(prob)
sol =  solve(prob,x0)

, пожалуйста, дайте мне знать, если ничего не хватает

1 Ответ

0 голосов
/ 03 апреля 2020

Оптимизатор теперь не делает, что делать с другими входными данными least1(ydata,xdata,x,y1,w,A,sz,yprime,y).

Вам необходимо указать значения, когда вы назначаете его как функцию стоимости, то есть

@(A) least1(ydata,xdata,x,y1,w,A,sz,yprime,y) 

Ключевое слово: дескриптор анонимной функции (то, что у вас есть, это просто дескриптор функции .

Меня очень раздражает то, как вы настраиваете оптимизацию проблема (может быть, это новый путь?).

Я бы сделал это прямо так:

% anonymous function handle to original function
fnc_ogl = @(A) least1(ydata,xdata,x,y1,w,A,sz,yprime,y) -u1;
% create least-squares cost function (you need to have a single cost value
% for fminsearch)
fnc_cst = @(A) sum( fnc_ogl.^2 );
% initial guess
A0 = [11.959,0.069,3.53,4.118*10^(-3)]
% call unconstrained local optimization
[A_opt, fval, exitflag] = fminsearch(fnc,A0)

BTW

  1. Вы должны выделить размер U2 заранее с U2 = NaN(1,1000) для ускорения функции стоимости
  2. Ваш пример не работает, так как отсутствуют все входные данные для least1
  3. least1 не использует переменные xdata, x, y1 и sz

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...