Криволинейный фитинг без ящика для инструментов - PullRequest
5 голосов
/ 21 декабря 2010

Без набора инструментов для подбора кривой, как вы подгоняете функцию к данным в MATLAB?

В частности, как вы подгоняете функцию, которая не является полиномом, например, если я хочу подогнать функциюкак у = х ^ (1/3) + 5, где это не целое число?

Ответы [ 3 ]

9 голосов
/ 21 декабря 2010

Если вы знаете форму функции, которую хотите установить, но не знаете ее параметров, вы можете использовать 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.

3 голосов
/ 25 декабря 2010

immoptibox - это бесплатный набор инструментов для оптимизации и подбора данных . Взяв ту же функцию выборки, что и @Adrien y = x^a + b, a и b, определяются с использованием marquardt наименьших квадратов из immoptibox

Для решения задачи требуются два файла. sofit возвращает остаток r, а также якобиан j.

function [r, j] = sofit(x, fitData)
t = fitData(:,1);
y = fitData(:,2);
r = y - (t.^x(1) + x(2));
j = -[t.^x(1).*log(t), ones(length(t),1)];
end

Следующий скрипт runner используется для генерации точек данных для образца функции и вызывает marquardt для подбора данных.

%% function template
f = @(t, p1, p2) t.^p1 + p2;

%% sample function
a = 1/3;
b = 5;
t= linspace(1,100)';
y = f(t, a, b);

%% packaging fit data for @sofit
fitData(:,1) = t;
fitData(:,2) = y;

%% marquardt
[xfit, info, perf] = marquardt(@sofit, [1, 1], [], fitData);

%% presentation
figure;
plot(y);
hold all
plot(f(t, xfit(1,end), xfit(2,end)), 'ro');
grid;
legend('sample function', 'fitted function', 'Location','East')

Сгенерированные точки данных (синий) и расчетные (красный) на следующем рисунке.

sample function and fitted function using marquardt

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

Существует два способа реализации Curve Fitting без ToolBox, они

  1. В случае равномерно разнесенных выборок, а затем хотите выполнить подбор кривой, используя некоторую линейную комбинацию сдвинутых ядер (например, B-сплайны), вам поможет следующий инструмент:

http://www.mathworks.com/matlabcentral/fileexchange/26292-regular-control-point-interpolation-matrix-with-boundary-conditions

2.Используйте polyfit, для создания собственного набора инструментов с нуля ... с помощью этого вы можете приспособить функцию к данным в MATLAB,

док полифит.

например,

 help polyfit;
 help slash;

% ...

Подробнее о полифите см. Здесь http://www.mathworks.com/help/techdoc/ref/polyfit.html

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