又称共轭斜量法,是解线性代数方程组和非线性方程组的一种数值方法,例如对线性代数方程组 Ax=ƒ, (1)式中A为n阶矩阵,x和ƒ为n维列向量,当A对称正定时,可以证明求(1)的解X和求二次泛函
的极小值问题是等价的。此处(x,у)表示向量x和у的内积。由此,给定了初始向量x(0),按某一方向去求(2)式取极小值的点x(1),就得到下一个迭代值x(2),再由x(2)出发,求x(3)等等,这样来逼近x。若取求极小值的方向为F在 x(k=1,2,…)处的负梯度方向就是所谓最速下降法,然而理论和实际计算表明这个方法的收敛速度较慢,共轭梯度法则是在 x(k-1)处的梯度方向r(k-1)和这一步的修正方向p(k-1)所构成的二维平面内,寻找使F减小最快的方向作为下一步的修正方向p(k),即求极小值的方向p(其第一步仍取负梯度方向)。计算公式为
再逐次计算(k=1,2,…)。可以证明当i≠j时,
从而平p(1),p(2)形成一共轭向量组;r(0),r(1),…形成一正交向量组。后者说明若没有舍入误差的话,至多 n次迭代就可得到(1)的精确解。然而在实际计算中,一般都有舍入误差,所以r(0),r(1),…并不真正互相正交,而尣(0)尣(1),…等也只是逐步逼近(1)的真解,故一般将共轭梯度法作为迭代法来使用。
近来在解方程组(1)时,常将共轭梯度法同其他一些迭代法结合作用。特别是对病态方程组这种方法往往能收到比较显著的效果。其方法是选取一对称正定矩阵B并进行三角分解,得B=LLT。将方程组(1)化为 hу=b, (3)
此处y=lTx,b=l-1ƒ,h=l-1Al-T,而
再对(3)用共轭梯度法,计算公式为
k=0,1,2,…)适当选取B,当B很接近A时,h的条件数较之A大大减小,从而可使共轭梯度法的收敛速度大为加快,由一些迭代法的矩阵分裂A=M -N,可选取M 为这里的B,例如对称超松弛迭代(SSOR),强隐式迭代(SIP)等,这类方法常称为广义共轭梯度法或预条件共轭梯度法,它也可用于解代数特征值问题。
fun=@(x1,x2)x1^2+x2^2+x1x2-3x1;
[x,fval]=fminunc(fun,[0 0])
这个更实用,能解决几乎所有求最小值的问题。
你的这个 执行结果是生成二维元胞数组 r_{2}=[fx1_2;fx2_2];
我猜你用这个的本意是由可做下标的r_{k},其实循环中不用这样做做下标,只要找个中间变量循环更新一次变量值就可以了 ,帮你改好了,自己编程序要学会调试找错哦
syms x1 x2 k
f=(3/2)(x1^2)+(1/2)(x2^2)-x1x2-2x1;
A=[3 -1;-1 1];
fx1=diff(f,x1);
fx2=diff(f,x2);
fx11=subs(fx1,{x1,x2}, {-2,4});
fx21=subs(fx2,{x1,x2},{-2,4});
x_1=[-2;4];
r1=[fx11;fx21];
p1=-r1;
t1=-((r1)'p1)/((Ap1)'p1);
x_2=x_1+t1p1;
xx={x_2(1),x_2(2)};
fx12=subs(fx1,{x1,x2}, xx);
fx22=subs(fx2,{x1,x2},xx);
r2=[fx12;fx22];
%M=r_{2};
for k=2:10
while norm(r2)>=001
a1=((r2)'r2)/((r1)'r1);
p2=-(r2)+(a1)(p1);
t2=-((r2)'p2)/((Ap2)'(p2));
x_3=x_2+((t2)(p2));
xx={x_2(1),x_2(2)};
fx12=subs(fx1,{x1,x2},xx);
fx22=subs(fx2,{x1,x2},xx);
r2=[fx12;fx22];
x_2=x_3;
end
end
optx=(x_2)
t = [020711 099391 041643 -074095 -087009]';%% 方法1:直接使用MATLAB的伪逆(eye(5) + diag(-ones(4, 1), 1))\t%% 方法2:自己写最小二乘问题f = @(x)sum((x-circshift(x, -1) - t)^2);x = fsolve(f, zeros(5, 1))
matlab最优化程序包括
无约束一维极值问题 进退法 黄金分割法 斐波那契法 牛顿法基本牛顿法 全局牛顿法 割线法 抛物线法 三次插值法 可接受搜索法 Goidstein法 WolfePowell法
单纯形搜索法 Powell法 最速下降法 共轭梯度法 牛顿法 修正牛顿法 拟牛顿法 信赖域法 显式最速下降法, Rosen梯度投影法 罚函数法 外点罚函数法
内点罚函数法 混合罚函数法 乘子法 G-N法 修正G-N法 L-M法 线性规划 单纯形法 修正单纯形法 大M法 变量有界单纯形法 整数规划 割平面法 分支定界法 0-1规划 二次规划
拉格朗曰法 起作用集算法 路径跟踪法 粒子群优化算法 基本粒子群算法 带压缩因子的粒子群算法 权重改进的粒子群算法 线性递减权重法 自适应权重法 随机权重法
变学习因子的粒子群算法 同步变化的学习因子 异步变化的学习因子 二阶粒子群算法 二阶振荡粒子群算法
Rosenbrock函数
实现代码:
clc,clear all
format long g
x0=[0;0];
fun=@func;
gfun=@gfunc;
[x,val,k]=grad(fun,gfun,x0) %最速下降法(梯度法)
目标函数
function f=func(x)
f=100(x(1)^2-x(2))^2+(1-x(1))^2;
end
梯度函数
function g=gfunc(x)
g=[400x(1)(x(1)^2-x(2))-x(2)+2(x(1)-1);-200(x(1)^2-x(2))];
end
运行结果
如有问题,可以私信于我。
用遗传算法ga()求Rosenbrock函数的结果,与用上述方法的结果相接近。
以上就是关于共轭梯度法的算法介绍全部的内容,包括:共轭梯度法的算法介绍、实用最优化matlab编程问题,急急急!!!!!!、在matlab中,运用共轭梯度求二次函数极小点,程序老是会出现以下状况,请大仙帮我看看,哪边错了感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)