最小二乘

x = (2+(0:10)/5)';
y = 1+x+x.^2+x.^3+x.^4+x.^5+x.^6+x.^7;
A = [x.^0 x x.^2 x.^3 x.^4 x.^5 x.^6 x.^7];
c = (A'*A)\(A'*y);

[Q R] = qr(A);
b = Q' *y;

由于c其实是有真实解的,就是[1 1 1 1 1 1 1 1]。但是在matlab中使用最小二乘求出来的c却是:

c =

5.2331
-9.4504
11.9452
-5.3051
3.1580
0.5611
1.0491
0.9977

这是因为常规方程中条件数很大导致的,原因是A'*A不满秩,导致求逆时候会出现异常。

修改c的式子为c=(A'*A+a*I)\(A'*y) ,并且把a赋为一个很小的值,得到系数c可以非常接近真实值。

>> c=(A'*A+a*I)\(A'*y)

c =

0.9336
1.0385
1.0311
0.9750
0.9998
1.0039
0.9989
1.0001

 

posted @ 2016-12-16 00:30  PACHEL35  阅读(206)  评论(0编辑  收藏  举报