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

本文通过MATLAB代码实现阻尼牛顿法,用于寻找多元函数的极小点。采用一阶和二阶偏导数进行迭代计算,并通过设定迭代终止条件确保算法收敛。

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)

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值