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

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

    相关文章

    C# 比较两个list 之间元素差异的常用方法

    《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

    MySQL查询JSON数组字段包含特定字符串的方法

    《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

    关于集合与数组转换实现方法

    《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

    Python中注释使用方法举例详解

    《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

    一文详解Git中分支本地和远程删除的方法

    《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

    在Golang中实现定时任务的几种高效方法

    《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

    在Linux终端中统计非二进制文件行数的实现方法

    《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

    Python中Tensorflow无法调用GPU问题的解决方法

    《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

    XML重复查询一条Sql语句的解决方法

    《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

    C++ 检测文件大小和文件传输的方法示例详解

    《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee