共轭梯度法的算法介绍

共轭梯度法的算法介绍,第1张

又称共轭斜量法,是解线性代数方程组和非线性方程组的一种数值方法,例如对线性代数方程组 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中,运用共轭梯度求二次函数极小点,程序老是会出现以下状况,请大仙帮我看看,哪边错了感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9338689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存