无约束最优化方法-牛顿法

2024-02-02 14:38

本文主要是介绍无约束最优化方法-牛顿法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


无约束最优化算法-Newton法原理及c++编程实现
6536人阅读 评论(5) 收藏 举报
本文章已收录于:
分类:
作者同类文章 X

    无约束最优化方法-牛顿法

    牛顿法Newton'smethod)又称为牛顿-拉弗森方法Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法,迭代的示意图如下:


    总结@郑海波 blog.csdn.net/nuptboyzhb/

    参考:斯坦福大学machine learning

    本博客中所有源代码:http://download.csdn.net/detail/nuptboyzhb/4886786

    求解问题:

    1.无约束函数f的0点。

    2.无约束函数f的最小值,最大值。



    函数的曲线(matlab画出)



    #include <iostream>

    #include <math.h>

    using namespace std;

    #define f(x)  (pow(x,3)-4.0*pow(x,2)+3.0*x)

    #define  df(x)    (3.0*pow(x,2)-8.0*x+3)

    int main()

    {

           doublex=9;//设置迭代的初始值

           doubleerr=1.0e-10;//设置精度

           intcount=0;

        while(true)

        {

                  x=x-f(x)/df(x);

                  if(abs(f(x))<err)

                  {

                         break;

                  }

                  cout<<""<<count++<<"迭代x="<<x<<" f(x)="<<f(x)<<endl;

        }

           cout<<"函数f0点为:"<<x<<endl;

           return0;

    }

    结果讨论:

    迭代结果与初始值有关,迭代的结果总是初始值x附近的0。如:

    1.初始值x=9时,运行结果如下:

    0迭代 x=6.51724 f(x)=126.47

    1迭代 x=4.90174 f(x)=36.3714

    2迭代 x=3.88768 f(x)=9.96551

    3迭代 x=3.30967 f(x)=2.36715

    函数f0点为:3.05742

    Press any key tocontinue

    2.初始值x=1.3时,运行结果如下:

    函数f0点为:1.01545

    Press any key tocontinue

    3.初始值为-10时,运行结果如下:

    0迭代 x=-6.26632 f(x)=-421.924

    1迭代 x=-3.79793 f(x)=-123.873

    2迭代 x=-2.18197 f(x)=-35.9783

    3迭代 x=-1.14629 f(x)=-10.201

    4迭代 x=-0.51317 f(x)=-2.72803

    函数f0点为:-0.167649

    Press any key tocontinue


    [cpp] view plain copy print ?
    1. #include <iostream>  
    2. #include <math.h>  
    3. using namespace std;  
    4. #define  f(x)   (pow(x,3)-4.0*pow(x,2)+3.0*x)  
    5. #define df(x)    (3.0*pow(x,2)-8.0*x+3)  
    6. #define ddf(x)    (6.0*x-8)  
    7. int main()  
    8. {  
    9.     double x=1.2;//初始值  
    10.     double err=1.0e-10;  
    11.     int count=0;  
    12.     while (true)  
    13.     {  
    14.         x=x-df(x)/ddf(x);  
    15.         if (abs(df(x))<err)  
    16.         {  
    17.             break;  
    18.         }  
    19.         cout<<"第"<<count++<<"迭代x="<<x<<" df(x)="<<df(x)<<endl;  
    20.     }  
    21.     cout<<"函数f极点为:("<<x<<","<<f(x)<<")"<<endl;  
    22.     return 0;  
    23. }  
    #include <iostream>
    #include <math.h>
    using namespace std;
    #define  f(x)   (pow(x,3)-4.0*pow(x,2)+3.0*x)
    #define df(x)    (3.0*pow(x,2)-8.0*x+3)
    #define ddf(x)    (6.0*x-8)
    int main()
    {double x=1.2;//初始值double err=1.0e-10;int count=0;while (true){x=x-df(x)/ddf(x);if (abs(df(x))<err){break;}cout<<"第"<<count++<<"迭代x="<<x<<" df(x)="<<df(x)<<endl;}cout<<"函数f极点为:("<<x<<","<<f(x)<<")"<<endl;return 0;
    }
    


    结果讨论:

    迭代结果与初始值有关,迭代的结果总是初始值x附近的极值。如:

    1.初始值x=9时,运行结果如下:

    0迭代x=5.21739df(x)=42.9244

    1迭代x=3.37549df(x)=10.1778

    2迭代x=2.54484df(x)=2.06992

    函数f极点为:(2.26008,-2.1072)

    Press any key tocontinue

    2.初始值x=1.2时,运行结果如下:

    0迭代x=-1.65df(x)=24.3675

    1迭代x=-0.288687df(x)=5.55952

    函数f极点为:(0.282567,0.550886)

    Press any key tocontinue

    3.初始值为-10时,运行结果如下:

    0迭代x=-4.36765df(x)=95.1702

    1迭代x=-1.58537df(x)=23.2232

    2迭代x=-0.259259df(x)=5.27572

    函数f极点为:(0.292851,0.560622)

    Press any key tocontinue

    注意:对于只有1个0点的函数求解或只有一个极值的函数求解时,迭代结果一般与初始值的关系不大,但迭代次数会受影响。

    转载请声明,未经允许,不得用以商业目的


    这篇关于无约束最优化方法-牛顿法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/671016

    相关文章

    Android 12解决push framework.jar无法开机的方法小结

    《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

    在.NET平台使用C#为PDF添加各种类型的表单域的方法

    《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

    SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

    《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

    Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

    《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

    判断PyTorch是GPU版还是CPU版的方法小结

    《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

    Qt实现网络数据解析的方法总结

    《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

    SpringMVC 通过ajax 前后端数据交互的实现方法

    《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

    Java中的工具类命名方法

    《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

    Spring Security自定义身份认证的实现方法

    《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

    python获取网页表格的多种方法汇总

    《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.