Как найти коэффициенты для возможного экспоненциального приближения

У меня есть такие данные:

y = [0.001
     0.0042222222
     0.0074444444
     0.0106666667
     0.0138888889
     0.0171111111
     0.0203333333
     0.0235555556
     0.0267777778
     0.03]

а также

x = [3.52E-06
     9.72E-05
     0.0002822918
     0.0004929136
     0.0006759156
     0.0008199029
     0.0009092797
     0.0009458332
     0.0009749509
     0.0009892005]

и я хочу, чтобы y было функцией x с y = a(0,01 − b*n^−cx).

Каков наилучший и самый простой вычислительный подход для поиска наилучшей комбинации коэффициентов a, b и c, соответствующих данным?

Могу ли я использовать Октаву?


person David    schedule 14.05.2015    source источник
comment
(1) является ли n константой? Вы можете подобрать кривую OLS.   -  person Dan    schedule 14.05.2015
comment
да! n является константой. На самом деле, игнорировать б. Как найти а и с?   -  person David    schedule 14.05.2015
comment
Обычные наименьшие квадраты. В вашем случае вам придется сначала взять журналы, чтобы сделать вашу функцию линейной (линейной по коэффициентам). Затем вы можете использовать эту функцию: octave.sourceforge.net/octave/function/ols. html   -  person Dan    schedule 14.05.2015
comment
А как это сделать в матлабе?   -  person David    schedule 14.05.2015
comment
Хотя этот 0.01 термин будет надоедливым... может быть, вам просто придется не брать журналы   -  person Dan    schedule 14.05.2015
comment
Матлаб или Октава? Если Matlab, какие наборы инструментов у вас есть?   -  person Dan    schedule 14.05.2015
comment
Я могу установить Matlab 2015 с вещами по умолчанию...   -  person David    schedule 14.05.2015


Ответы (1)


Ваша функция

у = а(0,01 - b*n-cx)

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

у = β1 + β2β3x

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

В Matlab по умолчанию вы можете использовать fminsearch, чтобы найти эти параметры β (давайте вызовем это наш вектор параметров, β), а затем вы можете использовать простую алгебру, чтобы вернуться к своим a, b, c и n (при условии, что вы знаете b или n заранее ). Я уверен, что в Octave вы можете найти эквивалентную функцию, я бы начал с поиска здесь: http://octave.sourceforge.net/optim/index.html.

Мы собираемся вызвать fminsearch, но нам нужно каким-то образом передать ваши наблюдения (т.е. x и y), и мы сделаем это с помощью анонимных функций, как в примере 2 из документации:

beta = fminsearch(@(x,y) objfun(x,y,beta), beta0) %// beta0 are your initial guesses for beta, e.g. [0,0,0] or [1,1,1]. You need to pick these to be somewhat close to the correct values.

И мы определяем нашу целевую функцию следующим образом:

function sse = objfun(x, y, beta)
    f = beta(1) + beta(2).^(beta(3).*x);
    err = sum((y-f).^2); %// this is the sum of square errors, often called SSE and it is what we are trying to minimise!
end

Итак, собираем все вместе:

y= [0.001; 0.0042222222; 0.0074444444; 0.0106666667; 0.0138888889; 0.0171111111; 0.0203333333; 0.0235555556; 0.0267777778; 0.03];
x= [3.52E-06; 9.72E-05; 0.0002822918; 0.0004929136; 0.0006759156; 0.0008199029; 0.0009092797; 0.0009458332; 0.0009749509; 0.0009892005];
beta0 = [0,0,0];

beta = fminsearch(@(x,y) objfun(x,y,beta), beta0)

Теперь вам нужно решить a, b и c через beta(1), beta(2) и beta(3), что вы можете сделать на бумаге.

person Dan    schedule 14.05.2015
comment
Я обнаружил, что возможным приближением является y = 0,001 -ae^-bx. Могу ли я применить тот же метод? - person David; 14.05.2015
comment
конечно, просто измените одну строку: f = 0.001 - beta(1).*exp(-beta(2).*x)); Лично, если ваши a или b не являются значимыми физическими СКАЛЯРНЫМИ величинами, я бы предпочел использовать f = 0.001 + beta(1).*exp(beta(2).*x)); и просто иметь отрицательные betas - person Dan; 14.05.2015
comment
Спасибо за ваш ответ. Я не мог вычислить ваш код. но я обнаружил, что могу использовать cftool. - person David; 15.05.2015
comment
cftool будет иметь опцию генерации кода, которая создаст для вас код сценария Matlab, который вы затем сможете сравнить с моим. Кроме того, cftool находится не в Matlab по умолчанию, а в наборе инструментов для подбора кривой. Было бы полезно узнать, что у вас есть доступ к этому набору инструментов для ответа на этот вопрос... - person Dan; 15.05.2015
comment
Спасибо за помощь @Dan! Эта информация была действительно полезной! ;) - person David; 16.05.2015