Если вы знаете форму функции, которую хотите установить, но не знаете ее параметров, вы можете использовать fminsearch
, чтобы найти параметры, которые соответствуют вашим данным. Если у вас есть данные (возможно, с шумом), которые вы хотите поместить в y=x^a + b
, где a
и b
неизвестны (здесь я буду предполагать, что истинные значения a=1/3
и b=5
), вот как я ' иметь быстрый ответ:
Здесь я генерирую свои данные (вам не нужно было бы делать это в реальной жизни)
>> x = linspace(0,5,10);
>> y = x.^(1/3) + 5;
>> y_noisy = y + 0.1*rand(size(y));
Затем я определяю функцию, которую хочу минимизировать относительно a
и b
, и минимизирую ее с помощью fminsearch
. В этом случае я минимизирую интеграл от квадрата разницы между моими данными и функцией, используемой для подгонки. Ниже я определил две функции, одну с шумными данными, а другую без шума. Вы видите, что при отсутствии шума вы восстанавливаете именно значения a
и b
.
NB: fminsearch
wotks с вектором параметров (v
в моем случае). Я взял a=v(1)
и b=v(2)
. Вы также должны предоставить начальное предположение для v
(здесь [1 1]
).
>> err_noisy = @(v) trapz(x,(y_noisy - x.^v(1)-v(2)).^2);
>> err = @(v) trapz(x,(y - x.^v(1)-v(2)).^2);
>> v_noisy = fminsearch(err_noisy,[1 1])
v_noisy =
0.3345 5.0594
>> v = fminsearch(err,[1 1])
v =
0.3333 5.0000
Последний комментарий, если у вас есть ограничения на значения a
и b
, иногда полезно выполнить некоторое изменение переменной. Например, если вы знаете, что a>0
, вы можете указать log(a)
, а затем преобразовать указанное значение в a
.
Надеюсь, это поможет.
A.