【MATLAB】二维搜索之阻尼牛顿法

来源:互联网 发布:淘宝保证金怎么解冻 编辑:程序博客网 时间:2024/06/07 13:15

clc;clear;

syms x1x2 v

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

% f =x1^2+2*x2^2-4*x1-2*x1*x2; %测试函数1

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

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)];  %求出二阶偏导

while(1)

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

    if sum(afxx.^2)<1e-3  %迭代终止条件

        disp('阻尼牛顿法求函数极小点为:')

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

        fprintf('(%f,%f)\n',x(1),x(2)) %打印计算结果

        break;

    end

    a2fxx = subs(a2fx,[x1,x2],x); %计算具体数值

    if det(a2fxx)==0  %无最优解的判别条件

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

    end

    s = -inv(a2fxx)*afxx'; 

    y = subs(f,[x1,x2],x+v*s');

    dyv = diff(y,v);

    vv = solve(dyv==0);

    fff = subs(y,v,vv);

    vv0 = find(vv>0);

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

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

end

程序输出结果:

阻尼牛顿法求函数极小点为:

(2.000000,-1.000000)

0 0
原创粉丝点击