2016-04-17 2 views
0

Мне нужно, чтобы соответствовать линии к набору около 100 точек данных, набор данных следует формула Pacejka, которая выглядит следующим образом:Подгонка кривой к набору данных с несколькими различными коэффициентами в MATLAB

Fy = Dy sin [Cy arctan {By x - Ey (By x - arctan (Byx))}] + Svy

где Dy, Cy, By, Ey и Svy - решаемые коэффициенты.

Я могу получить его, чтобы начертить строку с этим кодом, но это не так близко к данным.

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

x = SA; 
y = Fy; 
expr = 'D * sin(C * atan(B*x - E*(B* x - atan(B*x)))) + A'; 
ft = fittype(expr, 'independent', 'x'); 
opts = fitoptions('Method', 'NonlinearLeastSquares'); 
opts.StartPoint = ones(1,5); 
[fitresult, gof] = fit(x, y, ft, opts) 
plot(fitresult, x, y) 

это то, что мой код возвращается в настоящее время enter image description here enter image description here

+0

http://www.mathworks.com/help/curvefit/custom-nonlinear-models.html – Amro

+0

@Amro Как мне получить доступ к графическому аппроксимации приложения в Matlab? – Vbasic4now

+0

вы можете запустить приложение, используя 'cftool' – Amro

ответ

3

Так же, как ты, просто записать эту формулу:

expr = 'D * sin(C * atan(B*x - E*(B* x - atan(B*x)))) + A'; 
ft = fittype(expr, 'independent', 'x'); 
opts = fitoptions('Method', 'NonlinearLeastSquares'); 
opts.StartPoint = ones(1,5); % [A,B,C,D,E] 
[fitresult, gof] = fit(x, y, ft, opts) 
plot(fitresult, x, y) 

EDIT:

Основываясь на Wikipedia article, вот небольшой пример:

% some data based on equation 
B = 0.714; 
C = 1.4; 
D = 800; 
E = -0.2; 
f = @(x) D * sin(C * atan(B*(1-E)*x + E*atan(B*x))); 
x = linspace(0,10,200)'; %' 
y = f(x); 

% add noise 
yy = y + randn(size(x))*16; 

% fit 
%expr = 'D * sin(C * atan(B*(1-E)*x + E*atan(B*x)))'; 
expr = 'D * sin(C * atan(B*x - E*(B* x - atan(B*x))))'; 
ft = fittype(expr, 'independent', 'x', 'dependent','y'); 
opts = fitoptions('Method', 'NonlinearLeastSquares'); 
opts.StartPoint = [1 1 1000 1]; % [B C D E] 
[fitresult, gof] = fit(x, y, ft, opts) 

% plot 
yhat = feval(fitresult, x); 
h = plot(x,y,'b-', x,yhat,'r-', x,yy,'g.'); 
set(h, 'LineWidth',2) 
legend({'y', 'yhat', 'y+noise'}, 'Location','SouthEast') 
grid on 

fit

Результат:

fitresult = 
    General model: 
    fitresult(x) = D * sin(C * atan(B*x - E*(B* x - atan(B*x)))) 
    Coefficients (with 95% confidence bounds): 
     B =  0.5916 (0.5269, 0.6563) 
     C =  1.899 (1.71, 2.089) 
     D =  783.7 (770.5, 796.9) 
     E =  1.172 (1.136, 1.207) 
gof = 
      sse: 6.6568e+04 
     rsquare: 0.9834 
      dfe: 196 
    adjrsquare: 0.9832 
      rmse: 18.4291 

Обратите внимание, что, используя отправную точку, как [1 1 1 1] далеко от истинного решения, так фитинга остановится без схождения (масштаб D параметр сильно отличается от других параметров B, C и E) ... Вместо этого мне пришлось начинать куда-то ближе [1 1 1000 1].

+0

ive обновленный вопрос. этот код работает, чтобы дать мне строку, но линия не находится где-то близко к данным. Что я делаю не так? – Vbasic4now

+0

ваше решение, вероятно, не сходилось. Либо увеличивайте максимальное количество итераций, либо обеспечите лучшую отправную точку – Amro

+0

@SamQL. Я добавил пример, который выглядит как ваши данные. – Amro

Смежные вопросы