end4.1预备知识:零点、极值和最小二乘法•方程的根若对于数有f()=0,则称为方程的解或根,也称为函数f(x)的零点;若f()=0,f’()0则称为单根。若有k1,f()=f’()=…=f(k-1)()=0,但f(k)()0,称为k重根end如果对于包含x=a的某个邻域,有f(a)f(x)(f(a)f(x))对任意x成立,则称a为f(x)的一个局部极小(大)值点。如果对任意xD,有f(a)f(x)(f(a)f(x))成立,则称a为f(x)在区域D上的一个全局极小(大)值点。•函数极值end•最小二乘法假设坐标平面上有一系列离散的点(xi,yi),i=0,1,…,n,要求用一条比较简单的曲线y=f(c,x)去逼近这些点,这样的问题称为曲线拟合。niiixcfy02)),((最小二乘法就是求c使得均方误差Q(c)=达到最小end当f关于c是线性函数,问题转化为一个线性方程组求解,且其解存在唯一。具体可以使用矩阵左除运算求最小二乘解。如果f关于c是非线性函数,问题转化为一个函数极值问题。end4.2函数零点、极值和拟合的MATLAB命令1多项式y=polyval(p,x)求得多项式p在x处的值y,x可以是一个或多个点p3=conv(p1,p2)返回多项式p1和p2的乘积end[p3,r]=deconv(p1,p2)p3返回多项式p1除以p2的商,r返回余项x=roots(p)求得多项式p的所有复根.p=polyfit(x,y,k)用k次多项式拟合向量数据(x,y),返回多项式的降幂系数end注意:MATLAB中一个多项式用系数降幂排列向量来表示。例2用2次多项式拟合下列数据.x:0.10.20.150-0.20.3y:0.950.840.861.061.500.72例1求多项式x3+2x2-5的根»roots([120-5])end2非线性函数的MATLAB表达Fun=inline(‘funstr’,’var’)定义一个Inline函数,其中funstr是函数的表达式,var是变量名Fun=@Mfun定义一个函数句柄,这里Mfun是函数的M文件表达方式Fun=@(var)funstr定义匿名函数,其中var是变量名,funstr是函数的表达式endx=fzero(Fun,x0)返回一元函数Fun的一个零点,其中Fun为函数句柄、内联函数或字符串表达方式。x0为标量时,返回函数在x0附近的零点;x0为向量[a,b]时,返回在[a,b]中的零点3函数零点end[x,f,h]=fsolve(Fun,x0)x返回一元或多元函数Fun在x0附近的一个零点,其中x0为迭代初值;f返回Fun在x的函数值,应该接近0;h返回值如果大于0,说明计算结果可靠,否则计算结果不可靠。end例4求方程组在原点附近的解4110141801212121xxexxxx例3求函数y=xsin(x2-x-1)在(-2,-0.1)内的零点end3函数极值min(y)返回向量y的最小值max(y)返回向量y的最大值[x,f]=fminbnd(fun,a,b)x返回一元函数fun在[a,b]内的局部极小值点,f返回局部极小值fun为函数句柄或inline。[x,f]=fminsearch(fun,x0)x返回多元函数fun在初始值x0附近的局部极小值点,f返回局部极小值。x,x0均为向量。end例5求二元函数f(x,y)=5-x^4-y^4+4xy在原点附近的极大值。注:在使用fsolve,fminsearch等指令时,多变量必须合写成一个向量变量,如用x(1),x(2),…。5非线性最小二乘拟合设函数y=f(c,x),其中c为未知参数向量,有一批有误差的数据.x:x1x2…xny:y1y2…ynendc=lsqnonlin(Fun,c0)使用迭代法搜索最优参数c.其中Fun是以参数c(可以是向量)为自变量的函数,表示误差向量y-f(c,x)(x,y为数据向量),c0为参数c的近似值,作为迭代初值c=lsqcurvefit(Fun2,c0,x,y)从外部输入数据,这里Fun2为两变量函数f(c,x)end•迭代法迭代法是从解的初始近似值x0(简称初值)开始,利用某种迭代格式xk+1=g(xk),求得一近似值序列x1,x2,…,xk,xk+1,…,逐步逼近于所求的解(称为不动点)。最常用的迭代法是牛顿迭代法,其迭代格式为4.3计算实验end例6求方程x^2-3x+e^x=2的正根(要求精度=10-6)解令f(x)=x^2-3x+e^x-2,f(0)=-1,当x2,f(x)0,f’(x)0即f(x)单调上升,所以根在[0,2]内。先用图解法找初值,再用牛顿法程序newton.m求解。xxfxfxkkkk1()'()end2线性化拟合线性最小二乘拟合可直接用求解超定线性方程组的方法,计算速度快且唯一。非线性最小二乘拟合的缺点是求解结果依赖于初值的选取,可能会陷于局部极小值而难以求得真解。常常将有些非线性函数拟合问题转化为线性问题求解。见例7end4.4建模实验:购房贷款的利率不难算出,你向银行总共借了25.2万,30年内共要还51.696万,这个案例中贷款年利率是多少呢?例8.下面是《新民晚报》2000年3月30日上的一则房产广告:建筑面积总价30%首付70%按揭月还款85.98m236万10.8万30年1436元end解设xk为第k个月的欠款数,a为月还款数,r为月利率。xk+1=(1+r)xk-a那么xk=(1+r)xk-1-a=(1+r)2xk-2–(1+r)a–a=……=(1+r)kx0–a[1+(1+r)+……+(1+r)k-1]=(1+r)kx0–a[(1+r)k-1]/r根据a=0.1436,x0=25.2,x360=0得到25.2(1+r)360–0.1436[(1+r)360-1]/r=0end常识上,r应比当时活期存款月利率略高一些。我们用活期存款月利率0.0198/12作为迭代初值,用fzero求解clear;fun=inline('25.2*(1+r)^360-((1+r)^360-…1)/r*0.1436','r')r=fzero(fun,0.0198/12);R=12*r得年利率为5.53%