【MATLAB】二维搜索之共轭梯度法

clc;clear;

syms x1x2 v

f = x1^2+2*x2^2-4*x1-2*x1*x2;

% f =x1^3+x2^3-3*x1*x2; %测试函数

x =[2,2]; %设置初始点

afx =[diff(f,x1),diff(f,x2)];  %求出一阶偏导

a2fx=[diff(afx(1),x1),diff(afx(1),x2);diff(afx(2),x1),diff(afx(2),x2)];  %求出二阶偏导

g =subs(afx,[x1,x2],x);  %计算一阶偏导在x处的值

s = -g;

while(1)

    if sum(g.^2)<0.01 %迭代终止条件

        disp('共轭梯度法求函数极小点为:')

        x = double(x); %将sym型转化为double型

        disp(sprintf('(%f,%f)',x(1),x(2))) %打印计算结果

        break;

    end

    ff = subs(f,[x1,x2],x+v*s);   %将f用v表示

    dfv = diff(ff,v); %将ff对v求导

    if diff(dfv,v)==0

        disp('无最优解');break;

    else

        vv = solve(dfv == 0);

        fff = subs(ff,v,vv);

        vv0 = find(vv>0);

        vv = vv(find(fff == min(fff(vv0)))); %求出使得fff最小的非负vv值

    end

    x = x+vv*s; %求出新的x的值

    y1 = subs(ff,v,vv);

    g1 = subs(afx,[x1,x2],subs(x,v,vv));  %求出一阶偏导的值

    v1 = sum(g1.^2)/sum(g.^2);

    s = -g1+v1*s;

    g = g1;

end

程序输出结果:

共轭梯度法求函数极小点为:

(4.000000,2.000000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值