所以我有这个数据
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
我尝试使用cftool将8阶多项式拟合到数据中。
这些是我得到的错误结果
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图
这就是绘制系数实际看起来的样子。
绘制系数的代码:
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 :(得分: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
)。绿色虚线表示带截断系数的多项式,青色线表示截断的多项式。所以你看到通过截断,你正在改变多项式太多而无法使用。
答案 1 :(得分:0)
我认为您使用了x center和scale复选框,因此您已将x标准化,并且在您自己编写时有不同的答案