本章内容:

介绍了无约束和有约束两种类型的非线性优化

一、无约束优化

无约束优化的一般形式为:

如果要求最大值,则

1.1 fminunc()

介绍:是MATLAB求解无约束优化的主要函数,算法有:信赖域(trust region)算法和拟牛顿法(quasi-Newton),详解如下(对算法有要求的可以看看):

Unconstrained Nonlinear Optimization Algorithms​ww2.mathworks.cn

例1、求Banana function的最小值(因其函数图像形似香蕉得名)

一般优化算法中会用到函数的导数信息,故可以将目标函数的导数以函数的形式输入到fminunc中。若不提供导数信息,fminunc内部会用差分代替导数,由于差分方法计算出的导数值与导数函数计算出的值存在误差,所以,若能为fminunc提供目标函数的导数函数信息,更便于计算。

(1)拟牛顿法

函数

function f = BanaFun(x)
f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2;

主程序

options = optimoptions('fminunc','display','iter');     %显示迭代过程,由于matlab推荐采用新的设置optimoptions替代optimset,所以这里跟以前有点不同
x = [-1.9,2];                                           %初始迭代点
[x,fval,exitflag,output] = fminunc(@BanaFun,x,options)

结果

> In fminunc (line 395)
%迭代次数  目标函数计算次数 函数值      步长            一阶导数值First-order Iteration  Func-count       f(x)        Step-size       optimality0           3           267.62                      1.23e+031           6          214.416    0.000813405            519  2           9          54.2992              1            331  3          15          5.90157       0.482557           1.46  4          21          5.89006             10           2.58  5          24          5.84193              1           6.56  6          36          4.10288         3.3617           15.2  7          42          4.08488       0.115159           19.9  8          48          3.39007             10           11.3  9          51          3.13363              1           20.7  10          54          2.46989              1           3.18  11          60          2.12375       0.680215           8.62  12          63          1.92978              1           8.85  13          66          1.43583              1            2.9  14          72          1.29696       0.424794            6.5  15          75          1.11139              1           5.84  16          78         0.846834              1           2.07  17          84         0.694787       0.355489           5.72  18          87         0.610241              1           3.12  19          93         0.478524       0.655536           5.39  First-order Iteration  Func-count       f(x)        Step-size       optimality20          96         0.343127              1           1.82  21         102          0.28558            0.5            3.9  22         105         0.194608              1           3.02  23         108         0.135004              1           2.02  24         114        0.0854278       0.431816           2.78  25         117        0.0672604              1           2.68  26         120        0.0377243              1           2.42  27         126        0.0157395       0.424018           1.72  28         129        0.0113891              1           1.66  29         132       0.00400353              1           1.11  30         138      0.000778789       0.478349          0.549  31         141      0.000349468              1          0.452  32         144      3.21971e-05              1          0.113  33         147      6.28136e-06              1         0.0865  34         150      4.74855e-08              1       0.000383  Local minimum found.                                %找到了局部最优点Optimization completed because the size of the gradient is less than
the default value of the optimality tolerance.<stopping criteria details>x =                                                 %最优解0.9998    0.9996 fval =                                              %最优函数值4.7485e-08exitflag =1output = 包含以下字段的 struct:iterations: 34funcCount: 150stepsize: 0.0034lssteplength: 1firstorderopt: 3.8341e-04algorithm: 'quasi-newton'               %拟牛顿法        message: 'Local minimum found.…'

(2)信赖域法

函数

function [f,g] = BanaFun(x)
f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
g = [100*(4*x(1)^3-4*x(1)*x(2))+2*x(1)-2;100*(2*x(2)-2*x(1)^2]); %目标函数的偏导数矩阵

主程序

options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
%注意时optimotions不是optimset
%'Algorithm','trust-region'算法选择信赖域法
%调用目标函数导数
x = [-1.9,2];
[x,fval,exitflag,output] = fminunc(@BanaFun,x,options)

1.2fminsearch()函数

算法:可变多面体算法

例2、在例1的基础上用fminsearch()函数

函数

function f = BanaFun(x)
f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2;

主程序

options = optimset('display','iter');
x = [-1.9,2];
[x,fval,exitflag,output] = fminsearch(@BanaFun,x,options)

结果

优化已终止:当前的 x 满足使用 1.000000e-04 的 OPTIONS.TolX 的终止条件,
F(X) 满足使用 1.000000e-04 的 OPTIONS.TolFun 的收敛条件x =1.0000    1.0000fval =4.0686e-10exitflag =1output = 包含以下字段的 struct:iterations: 114funcCount: 210algorithm: 'Nelder-Mead simplex direct search'message: '优化已终止:…'

其实无约束非线性优化还有许多算法,但都讲篇幅过大,因此这里只讲几种主要的算法。

二、约束最优化

fmincon()是最主要的求解约束最优化的函数

形式:

算法:大规模内点法,SQP算法,基于内点反射信赖域算法等。

约束非线性最优化算法​ww2.mathworks.cn

例3、求解如下优化问题

函数

function f = confun(x)
f = -x(1)*x(2)*x(3);

主程序

options = optimoptions('fmincon','Display','iter','Algorithm','sqp');  %选用sqp算法
A = [-1,-2,-2;1,2,2];
b = [0;72];
x0 = [10,10,10];                                                        %初始迭代点
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = [];                                                           %对应标准形式中的ceq
[x,fval,exitflag,output] = fmincon(@confun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

结果

 Iter  Func-count            Fval   Feasibility   Step Length       Norm of   First-order  step    optimality0           4   -1.000000e+03     0.000e+00     1.000e+00     0.000e+00     1.000e+02  1           9   -1.364305e+03     0.000e+00     7.000e-01     3.340e+01     1.674e+02  2          13   -3.291805e+03     0.000e+00     1.000e+00     1.420e+01     1.673e+02  3          17   -3.437592e+03     0.000e+00     1.000e+00     8.824e+00     1.247e+02  4          21   -3.455626e+03     0.000e+00     1.000e+00     2.423e+00     3.448e+00  5          25   -3.455999e+03     0.000e+00     1.000e+00     2.942e-01     1.630e-01  6          35   -3.455999e+03     1.421e-14     1.176e-01     4.405e-03     1.687e-01  7          39   -3.456000e+03     0.000e+00     1.000e+00     2.144e-02     7.989e-02  8          43   -3.456000e+03     0.000e+00     1.000e+00     1.037e-02     1.709e-04  Local minimum found that satisfies the constraints.Optimization completed because the objective function is non-decreasing in
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.<stopping criteria details>x =24             12             12       fval =-3456       exitflag =1       output = 包含以下字段的 struct:iterations: 8funcCount: 43algorithm: 'sqp'message: 'Local minimum found that satisfies the con…'constrviolation: 0stepsize: 50/4823lssteplength: 1firstorderopt: 121/707851

三、大规模优化问题举例

例4、求解如下优化问题(含200个变量)

函数

function f = Fun(x)
f = 0;
n = 200'
for ii = 1:n
f = f+(x(ii)-1/ii)^2;
end

主程序

n = 200;
x0 = 10*ones(1,n);     %初始迭代点
options = optimoptions('fminunc','Display','iter','Algorithm','quasi-newton');
[x,fval,exitflag,output] = fminunc(@Fun,x0,options)

结果

fval =1.1140e-14

总结

本文介绍了非线性优化算法,主要分为无约束和有约束两种情况。

优化算法中最重要的是算法的选择,本文并没有对这些算法进行对比,这将在以后的章节中介绍。

python 拟牛顿法 求非线性方程_9-非线性优化相关推荐

  1. python 拟牛顿法 求非线性方程_C语言实现迭代法求非线性方程的根

    迭代法求非线性方程的根 迭代法是一种逐次逼近法.它是求解代数方程,超越方程及方程组的一种基本方法,但存在收敛性及收敛快慢的问题. 为了用迭代法求非线性方程f(x) = 0的近似根: 1.首先需要将此方 ...

  2. python 拟牛顿法 求非线性方程_有限元简单科普之——改进的欧拉法

    上一篇我们提到,在土力学领域的有限元计算中,计算机每一步的计算本质都是在求解下面的方程: 即每一个步长的刚度矩阵乘以节点位移向量等于荷载向量,在一个步长内,我们假定刚度矩阵不变,用优化的牛顿法(Mod ...

  3. python牛顿法解非线性方程组_利用python求非线性方程

    最近在做的东西中有一件任务,相当于一个函数已知y来求x,网上找了各种办法最终得以实现.在此说明方法,并记录一些坑. 要求的函数比如:*log(x) - log(1-x) + 2.2 * (1 -2x) ...

  4. 【Python】Python用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。提示:牛顿迭代法求非线性方程的根的迭代公式为x`(n+1)`=x`n`-f(x)/f'(x) 。

    用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根.提示:牛顿迭代法求非线性方程的根的迭代公式为x(n+1)=xn-f(x)/f'(x) . 算法源码 def f(x): ##原函数ret ...

  5. python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)

    实验环境:python2.7 题目1:python之"求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数" 程序: import math def factorial(n): ...

  6. python函数def里面嵌套def,python菜鸟求问关于嵌套函数中作用域范围应该怎么理解?,python嵌套,直接上代码def l(l...

    python菜鸟求问关于嵌套函数中作用域范围应该怎么理解?,python嵌套,直接上代码def l(l 直接上代码def l(list): def d(): return list return d ...

  7. python concat函数 多张表_教你用python递归函数求n的阶乘,优缺点及递归次数设置方式

    本文内容介绍了python递归函数求n的阶乘,优缺点及递归次数设置方式,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 递归函数两大特点: 1.能够调用函数自身 2.至少有一个出口( ...

  8. 计算机语言平均数怎么算,使用python怎么求三个数的平均值

    使用python怎么求三个数的平均值 发布时间:2021-04-27 17:31:39 来源:亿速云 阅读:64 作者:Leah 本篇文章给大家分享的是有关使用python怎么求三个数的平均值,小编觉 ...

  9. python快速求EXCEL数据权重

    python快速求EXCEL数据权重 1.数据 2.9,1.13,26.98,0.97 3.3,1.16,26.16,0.99 2.5,1.29,27.2,0.99 3.1,</

最新文章

  1. corosync+pacemaker+crmsh配置高可用集群。
  2. Python 技术篇-百度语音识别API接口调用演示
  3. v-slot vue2.6新增指令使用指南
  4. html5transform变形,transform-function
  5. 逃离泄露事件,阿里云安全默认防御大揭秘 | 问底中国 IT 技术演进
  6. 火山图 多个样本、_statTarget-基于QC样本的代谢组学数据校正
  7. 程序结构程序设计(四)
  8. apereo cas mysql_史上最详细的 Apereo CAS 5.3开发教程:二、Apereo CAS 5.3 Server环境搭建,登录名,密码从数据库中获取...
  9. 感知器分类模型回顾与python实现
  10. inter Fortran安装匹配VS2012
  11. Azure安全系列(2)-体验Azure Security Center(安全中心)
  12. 高级运维工程师证书_华为认证云运维高级工程师(HCIP-CDCO)
  13. 利用fiddler抓包工具测试APP及高级应用
  14. 对话机器人(一)——对话机器人基础知识
  15. 未转变者服务器配置要求,游戏配置 - 未转变者中文维基 | Unturned资料站 - 灰机wiki...
  16. IPFS李鑫:fil币2021年价格预测
  17. 论文笔记——Comparing to Learn
  18. 实现Typora多端同步
  19. NEON----ARM通用 SIMD 引擎
  20. 半年从转行软件测试到产品经理

热门文章

  1. 【报告分享】2021-2022元宇宙报告-化身与智造:元宇宙座标解析.pdf(附下载链接)...
  2. 【白皮书分享】腾讯2022新职业教育洞察白皮书:“职”成机遇,“育”见未来.pdf...
  3. 【报告分享】2019中国少儿编程行业报告.pdf(附下载链接)
  4. PyTorch系列入门到精通——模型保存与加载
  5. leetcode力扣617. 合并二叉树
  6. 加入鹅厂,就趁现在!
  7. 用摸鱼学来解释隐马尔可夫模型(HMM)
  8. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)
  9. 数学建模 时间序列分析
  10. 364 页 PyTorch 版《动手学深度学习》分享(全中文,支持 Jupyter 运行)