matlab:
function y=fs2steep(f,e,a,b) %返回的是点坐标的2个分量 % fs2steep函数 最速下降法 % x=fs2steep(f,e,a,b)为输入函数 f为函数 e为允许误差 (a,b)为初始点; % fsx TJPU 2008.6.15 x1=a;x2=b; Q=fs2hesse(f,x1,x2); x0=[x1 x2]'; fx1=diff(f,'x1'); %对x1求偏导数 fx2=diff(f,'x2'); %对x2求偏导数 g=[fx1 fx2]'; %梯度 g1=subs(g); %把符号变量转为数值 d=-g1;%d为搜索方向 while (abs(norm(g1))>=e) %norm(g1)为g1的2范数,即sqrt(x1^2+x2^2),因为梯度其各分量=0,所以其梯度幅值=0 t=(-d)'*d/((-d)'*Q*d);%求搜索步长,方法是? x0=x0-t*g1; %搜索到的点 v=x0; a=[1 0]*x0; b=[0 1]*x0; x1=a; x2=b; Q=fs2hesse(f,x1,x2); x0=[x1 x2]'; fx1=diff(f,'x1'); %对x1求偏导数 fx2=diff(f,'x2'); %对x2求偏导数 g=[fx1 fx2]'; %梯度 g1=subs(g); d=-g1; end; y=v; function x=fs2hesse(f,a,b) % fs2hesse函数 求函数的hesse矩阵; % 本程序仅是简单的求二次函数的hesse矩阵!; % x=fs2hesse(f)为输入函数 f为二次函数 x1,x2为自变量; % fsx TJPU 2008.6.15 x1=a;x2=b; fx=diff(f,'x1'); %求f对x1偏导数 fy=diff(f,'x2'); %求f对x2偏导数 fxx=diff(fx,'x1'); %求二阶偏导数 对x1再对x1 fxy=diff(fx,'x2'); %求二阶偏导数 对x1再对x2 fyx=diff(fy,'x1'); %求二阶偏导数 对x2再对x1 fyy=diff(fy,'x2'); %求二阶偏导数 对x2再对x2 fxx=subs(fxx); %将符号变量转化为数值 fxy=subs(fxy); fyx=subs(fyx); fyy=subs(fyy); x=[fxx,fxy;fyx,fyy]; %求hesse矩阵
c++:
/* * @author:郑海波 * blog.csdn.net/nuptboyzhb/ * 2012-12-11 */ #include <iostream> #include <math.h> using namespace std; int main() { double e=0.00001;//定义迭代精度 double alpha=0.5;//定义迭代步长 double x=0;//初始化x double y0=x*x-3*x+2;//与初始化x对应的y值 double y1=0;//定义变量,用于保存当前值 while (true) { x=x-alpha*(2.0*x-3.0); y1=x*x-3*x+2; if (abs(y1-y0)<e)//如果2次迭代的结果变化很小,结束迭代 { break; } y0=y1;//更新迭代的结果 } cout<<"Min(f(x))="<<y0<<endl; cout<<"minx="<<x<<endl; return 0; } //运行结果 //Min(f(x))=-0.25 //minx=1.5 //Press any key to continue
近期评论