最小二乘法及matlab程序.doc
最小二乘法及matlab程序最小二乘法簡(jiǎn)介:最小二乘法(又稱最小平方法)是一種數(shù)學(xué)優(yōu)化技術(shù)。它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配。利用最小二乘法可以簡(jiǎn)便地求得未知的數(shù)據(jù),并使得這些求得的數(shù)據(jù)與實(shí)際數(shù)據(jù)之間誤差的平方和為最小。最小二乘法還可用于曲線擬合。其他一些優(yōu)化問題也可通過最小化能量或最大化熵用最小二乘法來表達(dá)。最小二乘法的矩陣形式: 若未知量的個(gè)數(shù)大于方程的個(gè)數(shù),則方程無解,但在數(shù)值計(jì)算領(lǐng)域,我們通常是計(jì)算 ,解出其中的x 。比較直觀的做法是求解 ,但通常比較低效。其中一種常見的解法是對(duì) A進(jìn)行QR分解(A=QR),其中Q是正交矩陣(Orthonormal Matrix),R是上三角矩陣(Upper Triangular Matrix),則有:。Matlab命令:一次函數(shù)線性擬合使用polyfit(x,y,1);多項(xiàng)式函數(shù)線性擬合使用 polyfit(x,y,n),n為次數(shù);例如:x=0.5,1.0,1.5,2.0,2.5,3.0;y=1.75,2.45,3.81,4.80,7.00,8.60;p=polyfit(x,y,2)x1=0.5:0.5:3.0;y1=polyval(p,x1);plot(x,y,*r,x1,y1,-b)計(jì)算結(jié)果為:p =0.5614 0.8287 1.1560即所得多項(xiàng)式為y=0.5614x2+0.8287x+1.15560然后可以使用polyval在t處預(yù)測(cè):y_hat=polyval(p,t)非線性函數(shù)使用:lsqcurvefit、nlinfit格式:lsqcurvefit(f,a,x,y)、nlinfit(x,y,f,a)f:符號(hào)函數(shù)句柄,如果是以m文件的形式調(diào)用的時(shí)候,別忘記加.這里需要注意,f函數(shù)的返回值是和y匹對(duì)的,即擬合參數(shù)的標(biāo)準(zhǔn)是(f-y)2取最小值,具體看下面的例子a:最開始預(yù)估的值(預(yù)擬合的未知參數(shù)的估計(jì)值)。如上面的問題如果我們預(yù)估A為1,B為2,則a=1 2x:我們已經(jīng)獲知的x的值y:我們已經(jīng)獲知的x對(duì)應(yīng)的y的值例子1:問題:對(duì)于函數(shù)y=a*sin(x)*exp(x)-b/log(x)我們現(xiàn)在已經(jīng)有多組(x,y)的數(shù)據(jù),我們要求最佳的a,b值%針對(duì)上面的問題,我們可以來演示下如何使用這個(gè)函數(shù)以及看下其效果 x=2:10; y=8*sin(x).*exp(x)-12./log(x);%上面假如是我們事先獲得的值 a=1 2; f=(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);%第一種方法使用lsqcurvefit lsqcurvefit(f,a,x,y)ans = 7.999999999999987 11.999999999988997%和我們預(yù)期的值8和12結(jié)合得非常好%第二種方法使用nlinfit nlinfit(x,y,f,a)ans = 8.000000000000000 11.999999999999998%*%另一種方法,假如我們寫了一個(gè)如下的m文件function f=test(a,x)f=a(1)*sin(x).*exp(x)-a(2)./log(x);end%則在上面lsqcurvefit函數(shù)調(diào)用如下,不要忘記那個(gè)lsqcurvefit(test,a,x,y)例子2:(多元的情況,注意看格式)問題:我們已知z=a*(exp(y)+1)-sin(x)*b且有多組(x,y,z)的值,現(xiàn)在求最佳系數(shù)a,b x=2:10; y=10*sin(x)./log(x); z=4.5*(exp(y)+1)-sin(x)*13.8; f=(a,x)a(1)*(exp(x(2,:)+1)-sin(x(1,:)*a(2);%第一種方法使用lsqcurvefit lsqcurvefit(f,1 2,x;y,z)%注意這里面的x;y,這里的1 2表示我們?cè)O(shè)置f函數(shù)里的初始值a(1)=1,a(2)=2ans = 4.499999999999999 13.800000000000024%第二種方法使用nlinfit nlinfit(x;y,z,f,1 2)ans = 4.500000000000000 13.799999999999956