目标函数极值求解的几种方法
来源:互联网 发布:国美淘宝 编辑:程序博客网 时间:2024/05/15 01:38
目标函数极值求解的几种方法
题目:min(x1-2)2+2(x2-1)2,取初始点x1=(1,3)T,分别用最速下降法,拟牛顿法和共轭梯度法编程实现。
程序:
%精确一维搜索法的子函数,0.618(黄金分割)法,gold.m
%输入的变量x为初始迭代点是二维的向量,d为初始迭代方向是二维的向量
%输出变量是在[0,10]区间上使函数取得极小值点的步长因子
function alfa=gold(x,d)
a=0;b=10;tao=0.618;
lanmda=a+(1-tao)*(b-a);
mu=a+tao*(b-a);alfa=lanmda;%初始化
f=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;%目标函数
m=f;alfa=mu;n=f;
while 1
if m>n
if abs(lanmda-b)<1e-4
alfa=mu; return
else
a=lanmda; lanmda=mu; m=n;
mu=a+tao*(b-a); alfa=mu;
n=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;
end
else
if abs(mu-a)<1e-4
alfa=lanmda; return
else
b=mu; mu=lanmda; n=m;
lanmda=a+(1-tao)*(b-a); alfa=lanmda;
m=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;
end
end
end
%梯度子函数,tidu.m,输入的变量为二维的向量,返回梯度在x处的数值向量
function g=tidu(x)
%待求解的函数
f=(x(1)-2)^2+2*(x(2)-1)^2;
%求函数的梯度表达式
g=[2*(x(1)-2) 4*(x(2)-1)];
x1=x(1); x2=x(2);
%最速下降法极小化函数的通用子函数zuisu.m
%输入变量为初始的迭代点,输出变量为极小值点
function x0=zuisu(x)
%判断梯度范数是否满足计算精度1e-4的要求.是,标志变量设为1,输出结果;
%否,标志变量设为0
if sum(abs(tidu(x)).^2)<1e-4
flag=1; x0=x;
else
flag=0;
end
%循环求解函数的极小点
while flag==0
d=-tidu(x); a=gold(x,d); x=x+a*d
%判断梯度范数是否满足计算精度的要求.是,标志变量设为1,输出结果;
%否,标志变量设为0,继续迭代
if sum(abs(tidu(x)).^2)<1e-4
flag=1; x0=x;
else
flag=0;
end
End
%拟牛顿法极小化函数的通用子函数,gonge.m
%输入变量为初始的迭代点,输出变量为极小值点
function x0=ninewton(x)
%判断梯度范数是否满足计算精度的要求.是,标志变量设为1,输出结果;
%否,标志变量设为0,继续迭代
if sum(abs(tidu(x)).^2)<1e-4
flag=1; x0=x;
else
flag=0;
end
%初始的H矩阵为单位矩阵
h0=eye(2);
%循环求解函数的极小点
while flag==0
%计算新的迭代方向
d=-h0*tidu(x)'; a=gold(x,d);
x1=(x'+a*h0*d)'; s=x1-x;
y=tidu(x1)-tidu(x); v=s*y';
%校正H矩阵
h0=(eye(2)-s'*y./v)*h0*(eye(2)-y'*s./v)+s'*s./v;
%判断下一次和上一次迭代点之差是否满足计算精度的要求.是,标志变量设为1,输出结果;否,标志变量设为0,继续迭代
if sum(abs(x-x1).^2)<1e-4
flag=1; x0=x;
else
flag=0;
end
x=x1
end
%共轭剃度法极小化函数的通用子函数,gonge.m
%输入变量为初始的迭代点,输出变量为极小值点
function x0=gonge(x)
%判断梯度范数是否满足计算精度的要求.是,标志变量设为1,输出结果;
%否,标志变量设为0,继续迭代
if sum(abs(tidu(x)).^2)<1e-4
flag=1; x0=x;
else
flag=0;
end
%第一次的迭代方法为负梯度方向
d1=-tidu(x);a=gold(x,d1);x1=x+a*d1;
%循环求解函数的极小点
while flag==0
g1=tidu(x); g2=tidu(x1);
%利用FR公式求解系数bata
bata=(g2*g2')/(g1*g1');
d2=-g2+bata*d1;
a=gold(x1,d2);
x=x1;
x1=x+a*d2
%判断下一次和上一次迭代点之差是否满足计算精度的要求.是,标志变量设为1,输出结果;否,标志变量设为0,继续迭代
if sum(abs(x1-x).^2)<1e-4
flag=1; x0=x1;
else
flag=0;
end
end
- 目标函数极值求解的几种方法
- 关于几个求解函数极值方法的介绍
- 三分法(Ternary Search)求解凸(凹)函数的极值问题<方法篇>
- 三分法(Ternary Search)求解凸(凹)函数的极值问题<方法篇>
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- Matlab果蝇算法求解Schaffer函数的极值
- 求解逆序对数的几种方法
- 求解极值的数值算法
- 实现性能目标的几种方法
- 遗传算法实例-求解函数极值
- 粒子群算法实例-求解函数极值
- MATLAB求解二元(多元)函数极值
- 求解素数几种方法
- linux module_init
- ORACLE的优化器(二)
- svn 权限精细详解
- svn 权限精细详解
- Linux中的远程连接 SSH and VNC图形模式
- 目标函数极值求解的几种方法
- 帖一篇文章,免得大家失望
- 怎样用matlab插值得到函数表达式
- ORACLE创建用户、角色及权限管理
- C# ArrayList用BinaryFormatter序列化和反序列化进行文件读写的一个简单例子
- web的分页
- 使用ACT(Microsoft Application Center Test) 进行压力测试
- iphone程序的生命周期分析
- 在eclipse中调试ant中的junit测试代码