MATLAB最速下降法求解函数极小值

  • 1.题目
  • 2.matlab代码
    • 2.1主函数
    • 2.2调用函数
    • 2.3运行结果
  • 3.分析

写在前面:最速下降法求解函数极小值的理论部分已经写在上一篇文章中,这篇文章直接进行具体问题的求解并附上matlab代码。

1.题目


设初始点为[x1 x2]=[-2.5 4.5] ,ε≤0.01,求目标函数的极小值。

2.matlab代码

2.1主函数

syms x1 x2 s; %声明符号变量f1 =  x1^4 - 2*x1^2*x2 - 2*x1*x2 + x1^2 + 2*x2^2 + 4.5*x1 - 4*x2 + 4;%设定目标函数k=steepest_descent(f1,x1,x2,s,[-2.5,4.25],10^(-2));  %设定起始点[x1 x2]=[-2.5,4.25]和精度10^(-2)result_string=sprintf('在 %d 次迭代后求出极小值\n',k);%在迭代多少次之后求出极小值
disp(result_string);

2.2调用函数

function   k = steepest_descent(f,x1,x2,s,start_point,thereshold) k = 0;%迭代次数赋值初始化grad_f = [diff(f,x1) diff(f,x2)]; %计算f的梯度delta = subs(grad_f,[x1,x2],[start_point(1),start_point(2)]);%计算起点的梯度step=1; %设置初始步长为1current_point = start_point;%起点值赋给当前点%最速下降法的主循环,判断条件为:梯度的模与所给精度值进行比较while norm(delta) > thereshold  k = k + 1;%迭代次数+1%一维探索 求最优步长(此时方向已知,步长s为变量)x_next = [current_point(1),current_point(2)] - s* delta/norm(delta);% 计算x(k+1)点,其中步长s为变量 f_val = subs(f,[x1,x2],[x_next(1),x_next(2)]);% 将x值带入目标函数中step = abs(double(solve(diff(f_val,s)))); % 对s求一阶导,并加绝对值符号,得到最优步长的绝对值step = step(1);%更新步长%计算x(k+1)点current_point = double([current_point(1),current_point(2)] - step * delta/norm(delta));%计算x(k+1)点的梯度值delta = subs(grad_f,[x1,x2],[current_point(1),current_point(2)]);%计算函数值f_value = double(subs(f,[x1,x2],[current_point(1),current_point(2)]));%输出迭代计算过程result_string=sprintf('k=%d, x1=%.6f, x2=%.6f, step=%.6f f(x1,x2)=%.6f',...k,current_point(1),current_point(2),step,f_value);disp(result_string);end
end

(使用代码时,只需要把主函数中目标函数 ;起始点; 精度,重新设置成你所需要的就可运行。)

2.3运行结果

3.分析

将收敛条件由ε≤0.01改为ε≤10^(-6),运行结果如下:

可以看出,利用最速下降法求函数极小值时,在最初几步迭代中函数值下降很快,但当函数值越接近理论极小值时,函数值下降的越慢,同时,越接近理论极小值时,步长也越小,因此最速下降法的收敛速度并不快,这是因为函数在x(k)点处的负梯度方向为其最速下降方向仅仅是针对该点处而言,,一旦离开该点,原先方向就不是最速下降方向了。

最速下降方向只是针对当前的计算点而言,并非是全局的最速下降方向

最速下降法优点:对初始点选择要求低,远离极值点时收敛速度快
     缺点:越逼近理论极小值,收敛速度越慢

MATLAB最速下降法求解函数极小值相关推荐

  1. 最速下降法求解函数极小值原理

    最速下降法求解函数极小值 1.最速下降法 1.1 原理 1.1.1 探索方向S^(k)^的确定 1.1.2 步长a^(k)^的确定 1.1.3 收敛判别条件 1.1.4最速下降法迭代步骤 1.1.5程 ...

  2. MATLAB编程求解函数零点

    MATLAB 中有很多函数可以帮助你求解函数零点.其中常用的有 fsolve 函数. 使用方法如下: symsx f = x^2 - 3; x0 = 1; x = fsolve(f, x0) 上面的代 ...

  3. 讲解最到位的粒子群算法,附matlab代码求解函数最优值

    文章目录 @[toc] 从鸟群觅食行为到粒子群算法 粒子群算法的核心 例 : 求解函数最小值 粒子群算法的驱动因素 从鸟群觅食行为到粒子群算法 鸟群寻找食物的过程中,鸟与鸟之间存在着信息的交换,每只鸟 ...

  4. 实值遗传算法求解函数极值问题(基于MATLAB)

    实值遗传算法求解函数极值问题(基于MATLAB) 声明: 1.本文源代码来自书目<智能优化算法及其MATLAB实例(第3版)>,目的在于为MATLAB初学者提供更简明的代码解析,方便读者了 ...

  5. MATLAB求解函数极值及函数图像

    MATLAB具有求解函数极值以及函数图像的功能,简单举一个例子. 求解上述函数极值与图像: 1.驻点求解 syms x >> y = (3*x^2 + 4*x +4)/(x^2 + x + ...

  6. 多元函数牛顿法求函数极小值

    多元函数牛顿法求极小值是对一元函数牛顿法的延申,关于一元函数牛顿法,可以看兔兔的<牛顿法(Newton's method)求函数极小值>一文. (一)算法原理 与一元函数形式相似,但是又有 ...

  7. 利用 MATLAB 编程实现最速下降法求解无约束最优化问题

    本文章包含以下内容 1.画出最速下降法的算法流程图: 2.MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件): 3.MATLAB 编写最速下降法求解无约束优化问题的函数,要求采用黄金分割 ...

  8. matlab trapz二重积分函数_如何使用 MATLAB 求解定积分、不定积分和多重积分问题...

    介绍几种 MATLAB 中求解积分的方法,首先是采用符号积分的方法,求解积分的符号函数为 \(int\),使用方法如下: int(f,x,a,b) 例如计算如下积分函数: $$\int \frac{1 ...

  9. matlab pdepe函数边界,科学网-使用MATLAB中pdepe函数求解一维偏微分方程-邓浩鑫的博文...

    由于自己科研水平较低,记录的各种体会更多的是给自己做个小结,错误之处,欢迎大家指正. 使用MATLAB求解偏微分方程或者方程组,大致有三类方法.第一种是使用MATLAB中的PDE Toolbox,PD ...

最新文章

  1. 台式电脑键盘按键错乱_Win7系统键盘数字错乱了应该如何解决?
  2. HBase的Shell操作
  3. vForum 2008系列之七:主题演讲:虚拟化的未来
  4. ImageLoader displayers 之CircleBitmapDisplayer
  5. 图像离群值_什么是离群值?
  6. 无规则弹窗自动点击插件_vscode 插件会了吧,英语不好的赶紧下载 自动分析源码中的陌生单词、点击朗读单词...
  7. aspnet_regsql
  8. Linux 下 Oracle 内核参数优化
  9. 常用加密算法的Java实现(一)
  10. 智能灯控制页面用HTML编写,一种基于STM32的智能灯控制系统的制作方法
  11. Android开发文摘集合1
  12. web项目开发的基本流程
  13. 操作系统 chapter1 操作系统概述
  14. 收藏的关于开发的一些东西
  15. Instagram for Business Instagram商业技巧 Lynda课程中文字幕
  16. 全网可达,交换机和路由器的配置,vlan
  17. Apache Kafka核心组件和流程-协调器(消费者和组协调器)-设计-原理(入门教程轻松学)
  18. python爬取股票最新数据并用excel绘制树状图
  19. 一键打开多个软件 开发工具
  20. 疫情下的网络舆情管控方案

热门文章

  1. 原生JS获取QQ好友列表
  2. Djongo框架+Vue问题总结
  3. Ubuntu系统镜像盘ISO:各版本大全、国内网速下载地址(阿里云)
  4. android studio zbar,Zbar and Zxing in android studio
  5. C++ :线程的暂停、恢复和停止
  6. ROS安装/// rosdep update/the read operation is timed out
  7. SpringCloud:网关getway 路由转发
  8. 人员招聘与培训实务【3】
  9. case语句使用举例
  10. 5.cuBLAS开发指南中文版--cuBLAS中的Create()和Destroy()