编程实现黄金分割法、平分法和不精确一维搜索等最优化算法

在这里插入图片描述
解:
1、黄金分割法
思想:
黄金分割法是通过不断缩短搜索区间的长度来寻求一维函数的极小点,这种方法的基本原理是:在搜索区间[a,b]内按如下规则对称地取两点a1和a2
a1=a+0.382(b-a); a2=a+0.618(b-a);

黄金分割法的搜索过程是:
1) 给出初始搜索区间 [a , b] 及收敛精度 eps ,将 λ赋以0.618
2) 计算a1 和 a2,并计算起对应的函数值 f(a1),f(a2); ,
3) 根据期间消去法原理缩短搜索区间,为了能用原来的坐标点计算公式,需进行区间名城的代换,并在保留区间中计算一个新的试验点及其函数值。
4) 检查区间是否缩短到足够小和函数值收敛到足够近,如果条件不满足则返回到步骤2。
5) 如果条件满足,则取最后两试验点的平均值作为极小点的数值近似解。

黄金分割法的流程图
在这里插入图片描述

以f(x)= xx-5x+2 为例,
源程序如下:

#include<iostream>
using namespace std;
const float EPS=0.000001;//定义常量
float f(float);//定义函数f
float f(float x){return  x*x-5*x+2;
}int main()
{float a,b,x1,x2,f1,f2,t,eps;cout<<"a=";cin>>a;cout<<"b=";cin>>b;cout<<"eps=";cin>>eps;x1=a+0.382*(b-a);x2=a+0.618*(b-a);f1=f(x1);f2=f(x2);while (b-a>eps)//搜索精度循环节{t=f1-f2;if (t>EPS) {a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=f(x2);}else if (t>=-EPS && t<=EPS) {a=x1;b=x2;x1=a+0.382*(b-a);x2=a+0.618*(b-a);f1=f(x1);f2=f(x2);}//函数值相等,两边区间均舍去else {b=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=f(x1);}}cout<<"x*="<<(a+b)/2;return (a+b)/2;system ("pause");}

运行截图如下:
在这里插入图片描述

2、平分法
思想:
平分法要求函数f(x)在区间[a ,b]上为下单峰函数且具有连续的一阶导数。每迭代一次可去掉区间的二分之一。
设f(x)在区间[a ,b]上一阶导数连续,且f ’(a)<0,f’(b)>0。则取c=1/2(a + b),计算f ’©。
若f ’©=0,则c是极小值点;
若f ’©<0,则在[c ,b]内有极小点,保留区间[c ,b];
若f ’©>0,则在[a ,c]内有极小点,保留区间[a ,c]。
把保留下来的区间仍记为[a ,b],重复前面的过程,知道区间[a ,b]的长度充分小,满足所要求的精度为止。

其算法过程如下 :
已知 a ,b 且 a <b ,f’(a)<0 ,f’(b)>0及e>0。

  1. c=1/2(a + b),转2。
  2. 若b-a≤e,则转4;否则转3。
  3. 计算f’©。若f’©=0,则转4;
    若f’©<0,则令a=c,转1;
    若f’©>0,则令b=c,转1。
  4. 令 x* =c。结束。
    平分法的流程图
    在这里插入图片描述

源程序如下:

#include<stdio.h>
#include<math.h>
//定义f(x)函数
double f(double x){return x*x+2*x+1;
}
//定义f(x)的导函数g(x)
double g(double x){double dx=0.001,dy,dd1,dd2;dy=f(x+dx)-f(x);dd1=dy/dx;Lab:dx=0.5*dx;//减小步长dy=f(x+dx)-f(x);dd2=dy/dx;//导数新值if(fabs(dd1-dd2)<1e-06) return dd2;else {dd1=dd2;goto Lab;};
}
int main() { double x0,f0,a=-1,b=2,c,d=0.001;int n;c=(a+b)/2;while(fabs(b-a)>d){//判断求导if(g(c)==0) n=0;else if(g(c)>0) n=1;else if(g(c)<0) n=2;switch(n) {case 0:break;case 1:b=c;c=(a+b)/2;break;case 2:a=c;c=(a+b)/2;break;}}x0=c;f0=f(c);printf("f(x)的最小值点在%f\n",x0);printf("f(x)的最小值为%f\n",f0);printf("%f",g(2));return 0;
}

在这里插入图片描述

3.不精确一维搜索
程序基本思想:

在这里插入图片描述

在这里插入图片描述

源程序如下:

#include <iostream.h>double f(double x1 , double x2)
{double result;result = 100 * (x2 - x1 * x1) * (x2 - x1 * x1) + (1 - x1) * (1 - x1);return result;
}
double g1(double x1 , double x2)
{double result;result = (-1) * 400 * (x2 - x1 * x1) * x1 - 2 * (1 - x1);return result;
}double g2(double x1 , double x2)
{double result;result = 200 * (x2 - x1 * x1);return result;
}double linesearch()
{double u, m, a, b, n, j ,best,min=0;double x1 , x2 ;u = 0.1 , m = 0.7;a = 0 , b = 999999999 ;n= 1 , j = 0 ;int flag=1;x1 = -1 , x2 = 1 ;while( flag){if( ( f(x1, x2) - f(n + x1, n + x2) + u*n*(g1(x1, x2) + g2(x1, x2)) ) < 0 && ( g1(x1 + n, x2 + n) + g2(x1 + n, x2 + n) - m*(g1(x1, x2) + g2(x1, x2))) >= 0 ){j = j + 1;cout<<j<<" " ;b = n;n = 0.5 * (a + n);flag=1;cout<<n<<" "<<f(n + x1, n + x2)<<endl;}if( ( f(x1, x2) - f(n + x1, n + x2) + u*n*(g1(x1, x2) + g2(x1, x2)) ) >= 0  && ( g1((x1 + n), (x2 + n)) + g2((x1 + n), (x2 + n)) - m*(g1(x1, x2) + g2(x1, x2))) < 0  ){j = j + 1;cout<<j<<" ";a = n;if( (2 * n - (a + b) * 0.5) > 0 ){n = (a + b) * 0.5;}else{n = 2 * n;}flag=1;cout<<n<<" "<<f(n + x1, n + x2)<<endl;}else if(( f(x1, x2) - f(n + x1, n + x2) + u*n*(g1(x1, x2) + g2(x1, x2)) ) >= 0  && ( g1((x1 + n), (x2 + n)) + g2((x1 + n), (x2 + n)) - m*(g1(x1, x2) + g2(x1, x2))) >=0 ){best = n;min=f(x1+best,x2+best);flag=0;cout<<"根据给定条件,不精确一维搜索的步长为:"<<best<<endl;}}return min;
}
int main()
{double bestresult;cout<<" 函数为Y = 100(x2-x1*x1)*(x2-x1*x1)+(1-x1)*(1-x1)"<<endl;bestresult=linesearch();cout<<"根据给定条件,不精确一维搜索后的最小值为:"<<bestresult<<endl;}

程序运行情况如下:
结果为:步长=0.00390625,最小值为3.99809
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291888.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# winform校验文件版本差异及版本号

界面 代码 using System.Diagnostics;namespace VersionTool {public partial class Form1 : Form{List<string> fileNmaes new List<string>() { "PhotoMes.Base.dll", "PhotoMes.App.exe", "PhotoMes.Cameras.dll" };public F…

MySQL Server 8.3.0 重要变更解析

MySQL Server 8.3.0 Innovation 版本是 MySQL 8.x 系列最后一个创新版本&#xff0c;下个月即将迎来 MySQL 8.4.0 LTS 长期支持版本。 关于发版模型变更&#xff0c;在之前的文章 重磅&#xff01;MySQL 8.1.0 已来&#xff01; 中已有所介绍。 这里补充一点&#xff0c;对于 M…

学习鸿蒙基础(10)

目录 一、轮播组件 Swiper 二、列表-List 1、简单的List 2、嵌套的List 三、Tabs容器组件 1、系统自带tabs案例 2、自定义导航栏&#xff1a; 一、轮播组件 Swiper Entry Component struct PageSwiper {State message: string Hello Worldprivate SwCon: SwiperControl…

带你学习现代C++并发编程

通过对C并发编程的理解&#xff0c;我总结了相关的文档&#xff0c;有需要的可以关注我公众号&#xff0c;并给我留言&#xff01; 这是目录

集成ES分组查询统计求平均值

前言 之前其实写过ES查询数据&#xff0c;进行分组聚合统计&#xff1a; 复杂聚合分组统计实现 一、目标场景 机房机柜的物联网设备上传环境数据&#xff0c;会存储到ES存到ES的温湿度数据需要查询&#xff0c;进行分组后&#xff0c;再聚合统计求平均值 二、使用步骤 1.引入…

根据实例逐行分析NIO到底在做什么

Selector&#xff08;选择器&#xff09;是 Channel 的多路复用器&#xff0c;它可以同时监控多个 Channel 的 IO 状况&#xff0c;允许单个线程来操作多个 Channel。Channel在从Buffer中获取数据。 选择器、通道、缓冲池是NIO的核心组件。 一、新建选择器 此时选择器内只包含…

设计模式之解释器模式的魅力:让代码读懂你的语言

目录 一、什么是解释器模式 二、解释器模式的应用场景 三、解释器模式的优缺点 3.1. 优点 3.2. 缺点 四、解释器模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 4.4. 优化方向 五、总结 一、什么是解释器模式 解释器模式&#xff08;Interpreter pattern&…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式&#xff1a;使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…

文件操作(顺序读写篇)

1. 顺序读写函数一览 函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets文本行输入函数所有输入流fputs文本行输出函数所有输出流fscanf格式化输入函数所有输入流fprintf格式化输出函数所有输出流fread二进制输入文件fwrite二进制输出文件 上面说…

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

如何在OceanBase的OCP多节点上获取日志

背景 在使用OceanBase的OCP的过程中&#xff0c;因各种因素&#xff0c;我们可能需要对当前页面进行跟踪。在单一ocp节点环境下&#xff0c;我们自然可以直接在该节点上查找所需的日志。然而&#xff0c;当我们的环境中部署了多个ocp节点时&#xff0c;在排查问题时就会变得相…

WPF中获取TreeView以及ListView获取其本身滚动条进行滚动

实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…

sql Tuning Advisor启用导致业务性能问题

数据库每天晚上10点后业务性能很卡&#xff0c;大量的insert被堵塞&#xff0c;查询等待事件发现有大量的“library cache lock”和“cursor: pin S wait on X”。 22:00数据库的统计信息开始收集&#xff0c; Sql Tuning Advisor堵塞了统计信息的收集&#xff0c;等待事件是“…

Python之Opencv教程(1):读取图片、图片灰度处理

1、Opencv简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个用于计算机视觉和图像处理的开源库&#xff0c;提供了丰富的图像处理、计算机视觉和机器学习功能。它支持多种编程语言&#xff0c;包括C、Python、Java等&#xff0c;广泛应用于图像处…

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志&#xff08;Slow Log&#xff09;是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈&#xff0c;定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…

Linux IRC

目录 入侵框架检测 检测流程图 账号安全 查找账号中的危险信息 查看保存的历史命令 检测异常端口 入侵框架检测 1、系统安全检查&#xff08;进程、开放端口、连接、日志&#xff09; 这一块是目前个人该脚本所实现的功能 2、Rootkit 建议使用rootkit专杀工具来检查&#…

【算法-PID】

算法-PID ■ PID■ 闭环原理■ PID 控制流程■ PID 比例环节&#xff08;Proportion&#xff09;■ PID 积分环节&#xff08;Integral&#xff09;■ PID 微分环节&#xff08;Differential&#xff09; ■ 位置式PID&#xff0c;增量式PID介绍■ 位置式 PID 公式■ 增量式 PI…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…

wordpress插件,免费的wordpress插件

WordPress作为世界上最受欢迎的内容管理系统之一&#xff0c;拥有庞大的插件生态系统&#xff0c;为用户提供了丰富的功能扩展。在内容创作和SEO优化方面&#xff0c;有一类特殊的插件是自动生成原创文章并自动发布到WordPress站点的工具。这些插件能够帮助用户节省时间和精力&…

Hides for Mac:应用程序隐藏工具

Hides for Mac是一款功能强大的应用程序隐藏工具&#xff0c;专为Mac用户设计。它能够帮助用户快速隐藏当前正在运行的应用程序窗口&#xff0c;保护用户的隐私和工作内容&#xff0c;避免不必要的干扰。 软件下载&#xff1a;Hides for Mac下载 Hides for Mac的使用非常简单直…