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

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

    相关文章

    Java中读取YAML文件配置信息常见问题及解决方法

    《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

    Java 方法重载Overload常见误区及注意事项

    《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

    SQL中如何添加数据(常见方法及示例)

    《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

    Python中反转字符串的常见方法小结

    《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

    Python中将嵌套列表扁平化的多种实现方法

    《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

    Python使用pip工具实现包自动更新的多种方法

    《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

    在Linux中改变echo输出颜色的实现方法

    《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

    Conda与Python venv虚拟环境的区别与使用方法详解

    《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

    Spring Boot中WebSocket常用使用方法详解

    《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

    SQL Server配置管理器无法打开的四种解决方法

    《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S