Функция минимизации задачи в Matlab (fmincon) - PullRequest
2 голосов
/ 15 декабря 2010

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

Для этого я пытаюсь использовать функцию Matlab fmincon, чтобы минимизировать следующую функцию:

function f = myfun(x)

TS_krm = KRM(normrnd(x(1),x(2),100,1), L);
f = sum((TS_insitu - TS_krm).^2);

Итак, эта функция вычисляет сумму квадратов невязок, которую я хочу минимизировать. Для этого я пытаюсь использовать fmincon:

x = fmincon(@myfun, [65;8], [], [], [], [], [0;0], [90;20], [], options);

Таким образом, я использую начальную ориентацию со средним значением 65 градусов и стандартным отклонением 8. Я также устанавливаю границы среднего угла от 0 до 90 градусов, а границы стандартного отклонения - от 0 до 20 градусов.

Тем не менее, он, похоже, неправильно находит средние и стандартные углы отклонения, которые минимизируют функцию. Обычно он выдает что-то прямо около N (65,8), почти как если бы он на самом деле не пробовал многие другие значения вдали от начальных точек.

Любые идеи о том, что я могу сделать, чтобы сделать эту работу? Я знаю, что могу установить настройки TolX и TolFun, но я не совсем уверен, что они делают и какой эффект они будут иметь. Если это помогает, типичные значения, с которыми я имею дело, обычно составляют -45 дБ.

Спасибо!

1 Ответ

1 голос
/ 16 декабря 2010

Вы должны посмотреть на порядок значений f для разных входов. это может повлиять на значения, которые вы должны поместить в TolFun (устойчивость алгоритма минимизации к изменениям в f). например, если TolFun = 1e-6 и разница между f (45) и f (64) равна 1e-7, алгоритм может остановиться на 65. Кроме того, я думаю, что используемый вами алгоритм предполагает, что функции дифференцируемы (он использует производные, чтобы найти «куда идти дальше»), но не уверен, что это так в вашей функции. если это не так, вы должны использовать симплекс, чтобы найти минимум.

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