Подгонка 2D данных в Matlab - PullRequest
4 голосов
/ 23 июня 2010

Как бы вы поместили 2d кривую, такую ​​как ln (x ^ 2) + 3y, в массив mxn?

Обновление

Я имею в виду, у меня есть массив mxnи хочу подогнать его под 2D кривую.Извините за путаницу.

Ответы [ 2 ]

4 голосов
/ 20 августа 2010

Вы можете начать с использования meshgrid для генерации двух массивов, которые соответствуют индексам вашего массива mxn (который мы для простоты будем называть z). Например:

[x,y] = meshgrid(1:size(z,2),1:size(z,1));

Проследите x и y в вашем командном окне, чтобы увидеть их структуру, это будет иметь смысл.

Тогда вы можете использовать функцию, такую ​​как lsqnonlin (нелинейные наименьшие квадраты), чтобы подогнать 2d кривую к вашей матрице z. Так что, если вам нужна кривая «a log (x ^ 2) + b y», где a и b - свободные параметры, вы можете использовать что-то вроде этого:

%Define a function which returns the residual between your matrix and your fitted curve
myfun = @(params) params(1)*log(x(:).^2) + params(2)*y(:) - z(:)
%Define initial guesses for parameters a, b
params0 = [1,3];
%Add lots of debugging info
opts = optimset('Display','Iter');
%Fit
fitparams = lsqnonlin(myfun,params0,[],[],opts);
2 голосов
/ 23 июня 2010

Я бы порекомендовал запустить cftool. На самом деле он вполне способен на гаджет типа мастера.

Вот пример программного подгонки (мне нравится документация MATLAB) и, возможно, соответствующий отрывок:

s = fitoptions('Method','NonlinearLeastSquares',...
               'Lower',[0,0],...
               'Upper',[Inf,max(cdate)],...
               'Startpoint',[1 1]);
f = fittype('a*(x-b)^n','problem','n','options',s);

Подгонка данных с использованием параметров подгонки и значения n = 2:

[c2,gof2] = fit(cdate,pop,f,'problem',2)
...