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