MATLAB подгоняет данные к обратному квадратному уравнению

У меня есть куча данных, и мне нужен фитинг с нужной мне функцией, например, 1/(ax^2+bx+c). Моя цель - получить значения a, b, c.

Есть ли какая-нибудь функция MATLAB, которая помогает в этом? Я проверял функцию fit(), но так и не пришел к выводу. Какой лучший способ?


person Ander Biguri    schedule 19.10.2012    source источник
comment
Обычно вы хотите подогнать функцию к данным, а не наоборот. ;) Что касается функций: Вы можете взглянуть на fminunc и fminsearch.   -  person H.Muster    schedule 19.10.2012


Ответы (3)


Модель, которую вы даете, может быть решена с помощью простых методов:

% model function
f = @(a,b,c,x) 1./(a*x.^2+b*x+c);

% noise function 
noise = @(z) 0.005*randn(size(z));

% parameters to find
a = +3;
b = +4;
c = -8;

% exmample data
x = -2:0.01:2;    x = x + noise(x);
y = f(a,b,c, x);  y = y + noise(y);


% create linear system Ax = b, with 
% A = [x²  x  1]
% x = [a; b; c]
% b = 1/y;
A = bsxfun(@power, x.', 2:-1:0);

A\(1./y.')

Результат:

ans = 
 3.035753123094593e+00  % (a)
 4.029749103502019e+00  % (b)
-8.038644874704120e+00  % (c)

Это возможно, потому что модель, которую вы даете, является линейной, и в этом случае оператор обратной косой черты даст решение (хотя 1./y немного опасен...)

При подборе нелинейных моделей обратите внимание на lsqcurvefit (набор инструментов оптимизации) или вы можете написать свою собственную реализацию, используя fmincon (набор инструментов оптимизации), fminsearch или fminunc.

Кроме того, если у вас есть набор инструментов для подбора кривой, введите help curvefit и начните с него.

person Rody Oldenhuis    schedule 19.10.2012
comment
Эй спасибо! У меня проблема. при использовании моих данных для x и y у меня возникает следующая ошибка, которую я не понимаю: «Неодноэлементные размеры двух входных массивов должны совпадать друг с другом». Кроме того, у меня есть набор инструментов для кривой, но я не могу найти подходящую функцию для того, что мне нужно, только с графическим интерфейсом! (да, графический интерфейс использует другие функции, но я там потерялся...) - person Ander Biguri; 19.10.2012
comment
@AnderBiguri: Хм... кажется, у вас больше данных y, чем данных x (или наоборот). Вам нужно будет посмотреть, есть ли numel(x)==numel(y), и проверить, все ли правильно транспонировано. Если numel(x)~=numel(y), ну... это не то, что я могу решить :) - person Rody Oldenhuis; 19.10.2012
comment
@AnderBiguri, вероятно, это проблема транспонирования с аргументами bsxfun. Первый вектор должен быть вектором-столбцом, второй - вектором-строкой. - person angainor; 19.10.2012
comment
@angainor именно в этом проблема, оба данных являются векторами-строками! Спасибо! Но при переносе одного из них я получаю ошибку в последней строке, A\... Размеры матрицы должны совпадать. - person Ander Biguri; 19.10.2012
comment
ну, я решил это, убрав транспонирование Y в последней строке! спасибо обоим! - person Ander Biguri; 19.10.2012

Для меня это звучит как задача наименьших квадратов.

Я думаю, что lsqcurvefit может быть хорошим местом для начала:

http://www.mathworks.co.uk/help/optim/ug/lsqcurvefit.html

person FakeDIY    schedule 19.10.2012

Я не знаю, полезен ли этот пост спустя 3 месяца или нет. я думаю, cftool может помочь вам проверить это

легко вы можете добавить данные и выбрать метод подгонки ....

person Mohsen    schedule 21.01.2014