2012-03-18 5 views
1

Таким образом, у меня есть эти данныеMatlab cftool производить неправильные коэффициенты

x 
1.0423 
2.8249 
3.2016 
2.0851 
1.0299 
4.7397 
0.4104 
0.5285 
0.7102 
0.8323 
3.1048 
2.8685 
0.2604 
4.6560 
3.6433 
3.6892 
0.3170 
4.3022 
4.6720 
4.9220 
y 
    2.0529 
    -3.0669 
    -2.3631 
    -0.7300 
    1.4354 
    2.0260 
    0.5980 
    0.5296 
    1.3405 
    1.7361 
    -1.5876 
    -2.7872 
    1.0788 
    1.3677 
    -0.1355 
    -1.5755 
    0.7811 
    -0.8328 
    -0.0592 
    2.0927 

И я попытался уместить полином 8-го порядка к данным с использованием cftool.

Таковы результаты, которые я получаю, которые неправильно

Linear model Poly8: 
    f(x) = p1*x^8 + p2*x^7 + p3*x^6 + p4*x^5 + 
        p5*x^4 + p6*x^3 + p7*x^2 + p8*x + p9 
Coefficients (with 95% confidence bounds): 
     p1 = -0.05446 (-0.126, 0.01711) 
     p2 =  1.088 (-0.3839, 2.561) 
     p3 =  -8.762 (-21.23, 3.706) 
     p4 =  36.2 (-19.89, 92.3) 
     p5 =  -80.85 (-225.3, 63.62) 
     p6 =  94.32 (-119.9, 308.6) 
     p7 =  -52.21 (-227.5, 123.1) 
     p8 =  12.21 (-59.01, 83.42) 
     p9 = -0.05814 (-10.72, 10.61) 

Goodness of fit: 
    SSE: 4.083 
    R-square: 0.9225 
    Adjusted R-square: 0.8661 
    RMSE: 0.6092 

Это является cftool участок припадка, который выглядит тонкой Cftool plot of the fit which looks fine

и это то, что построение коэффициентов на самом деле выглядит. What plotting the coefficients actually looks like

Код для построения коэффициентов:

xx = 0:1/100:5; 
yy = -0.05446*xx.^8 +1.088*xx.^7 -8.762*xx.^6 +36.2*xx.^5 -80.85*xx.^4 +94.32*xx.^3 -52.21*xx.^2 +12.21*xx -0.05814; 
plot(xx,yy) 

Кто-нибудь знает, что происходит и как получить правильные коэффициенты сюжета, что cftool производит?

+0

Можем ли мы увидеть код для построения кривой от коэффициентов? –

+0

@MattEsch Конечно, я редактировал OP. – Michael

+0

Ваши данные 'x' и/или' y' неверны (они идентичны). – Egon

ответ

4

Я подозреваю, что, усекая коэффициенты, вы слишком много изменили многочлен.

Вы можете увидеть эффект самостоятельно, изучив следующий код (если у вас уже есть x и y в вашем рабочем пространстве).

P = polyfit(x,y,8); % fitted polynomial 
P2 = [-0.05446 1.088 -8.762 36.2 -80.85 94.32 -52.21 12.21 -0.0814]; % your coefficients 

toString = @(x,pat)(sprintf(pat,x)); 
fix = @(x,pat)(str2double(toString(x,pat))); 

P3 = arrayfun(@(x)(fix(x,'%3.4f')), P); % artificially truncate the coefficients 

X = linspace(min(x),max(x),100); 
Y = polyval(P ,X); 
Y2 = polyval(P2,X); 
Y3 = polyval(P3,X); 

figure; 
[x,i] = sort(x); 
y = y(i); 
plot(x,y ,'or'); hold on; 
plot(X,Y ,'-b'); 
plot(X,Y2,'--g'); 
plot(X,Y3,'-c'); 
hold off; 

То, что я сделал, годился многочлен восьмого порядка к данным, я также усечена коэффициенты искусственно (я не знаю точную стратегию округления cftool, это кажется немного более сложным, чем то, что я сделал).

На рисунке ниже вы можете увидеть результат. Красные точки - это данные, синяя линия - это точный полином, который соответствует polyfit (и, вероятно, cftool). Пунктирная зеленая линия изображает ваш многочлен с укороченными коэффициентами), а голубая линия показывает мой усеченный многочлен. Таким образом, вы видите, что путем усечения вы слишком много меняете полином, чтобы его можно было использовать.

Comparison of data and polynomials

+0

А, спасибо, так много. Эти усеченные коэффициенты были тем, что cftool давал мне в графическом интерфейсе, поэтому я, вероятно, буду использовать polyfit, если нет способа получить более точные коэффициенты из cftool. – Michael

+1

@ Майкл: Лично я был бы очень осторожен, используя любой из них. Я не знаю, что вы пытаетесь моделировать, но он очень похож на то, что вы перерабатываете свои данные. Моя интуиция говорит, что ваш сигнал больше похож на пилообразный, чем на полином восьмого порядка. И вы также можете видеть, что ни один коэффициент не определяется хорошо из стандартных отклонений, заданных 'cftool' (например, многочлен y (x) = 0 находится в пределах 95% -ной неопределенности). – Egon

0

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