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

在这里插入图片描述
解:
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
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十五天| 回溯算法理论基础、LeetCode77.组合

一、216.组合总和III 题目链接/文章讲解/视频讲解&#xff1a; https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 状态&#xff1a;已解决 1.思路 做过77题&#xff08;上篇博客&#xff09;后&#xff0c;这道题也就不难了&#xff0c;无非是多…

数字化转型导师坚鹏:BLM新质生产力发展方法论

BLM新质生产力发展方法论 ——新质生产力发展之知行果合一 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道如何理解新质生产力&#xff1f; 不清楚如何发展新质生产力&#xff1f; 不知道新质生产力发展案例&#xff1f; 课程特色&#xff1a; 原创…

echarts统计图占满整个容器

原先的统计图表没有占满容器&#xff0c;感觉整个被压缩了 网上查阅相关资料后发现需要设置grid一个配置项&#xff08;有些数值需要根据实际情况进行调整&#xff09; grid:{top:"0px",left:"0px",right:"0px",bottom:"0px"} 对于gr…

用户登录.java

分析&#xff1a; 1&#xff0c;用String来定义两个变量&#xff0c;记录正确的用户名和密码----->直接赋值得来 2&#xff0c;键盘录入用户名和密码------>new开辟空间得来&#xff0c;存的是地址值 他们直接用比较大小,必定不相同&#xff0c;需要用到String里面的方…

沙箱安全机制

Java安全模型的核心就是Java沙箱(sandbox)&#xff0c; 什么是沙箱&#xff1f; 沙箱是一个 限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM) 特定的运行范围中&#xff0c;并且严格限制代码对本地系统资源访问&#xff0c;通过这样的措施来保证 对代码的 有效隔…

QT中的文件操作QFile、QDataStream、QTextStream、QBuffer

文件操作概述 1、Qt中IO操作的处理方式 &#xff08;1&#xff09;、Qt通过统一的接口简化了文件与外部设备的操作方式 &#xff08;2&#xff09;、Qt中的文件被看做是一种特殊的外部设备 &#xff08;3&#xff09;、Qt中的文件操作与外部设备操作相同 2、IO操作中的关键…

基于协同过滤算法的图书推荐系统(ssm+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于协同过滤算法的图书推荐系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员功能需求…

C语言例1-11:语句 while(!a); 中的表达式 !a 可以替换为

A. a!1 B. a!0 C. a0 D. a1 答案&#xff1a;C while()成真才执行&#xff0c;所以!a1 &#xff0c;也就是 a0 原代码如下&#xff1a; #include<stdio.h> int main(void) {int a0;while(!a){a;printf("a\n");} return 0; } 结果如…

Soot入门学习笔记

Soot 适合参考的文档和教程如下&#xff1a; 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料&#xff1a; 南京大学《软件分析》课程笔记 比较好的入门作业或者案例&#xff1a; CSCE710 Assignmen…

vue3如何二次封装el-upload组件进行图片上传及删除

实现功能&#xff1a; 1、封装el-upload组件&#xff0c;父组件可以控制图片上传框的宽高 2、父组件可以传入提示信息&#xff0c;利用具名插槽 3、上传前的校验 4、实现删除功能 不同配置下的效果&#xff1a; 下边案例是图片上传的时候没有掉接口&#xff0c;在整体提交的时…

省级-能源结构数据(电力消费水平)(2000-2022年)

能源结构指能源总生产量或总消费量中各类一次能源、二次能源的构成及其比例关系。它是能源系统工程研究的重要内容&#xff0c;直接影响着国民经济各部门的最终用能方式&#xff0c;并反映了人民的生活水平。能源结构主要由生产结构和消费结构组成。 本数据通过电力消费水平来…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

Python之Opencv教程(3):人脸识别

1、人脸识别代码 直接上代码&#xff1a; import cv2# 加载训练数据集文件 recogizer cv2.face.LBPHFaceRecognizer_create()recogizer.read(trainer/trainer.yml)# 准备识别的图片 img cv2.imread(images/lisa.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_dete…

Linux文件系统权限

文件的一般权限 每个文件针对每类访问者定义了三种主要权限&#xff1a; r&#xff1a;read 读 w&#xff1a;write 写 x&#xff1a;execute 执行 所属者/组/其他用户权限的字符表示二进制表示八进制表示---0000--x0011-w-0102-wx0113r--1004r-x1015rw-1106rwx1117 文件/目…

企业培训系统功能介绍

在当今知识经济时代&#xff0c;企业的竞争力在很大程度上取决于员工的专业能力和综合素质。为了适应不断变化的市场需求和技术进步&#xff0c;企业需要对员工进行持续有效的培训。一个高效的企业培训系统对企业人才培训至关重要。以下介绍一下企业培训系统的主要功能&#xf…

《操作系统导论》第15章读书笔记:机制:地址转换(address translation)

《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09; —— 杭州 2024-03-30 夜 文章目录 《操作系统导论》第15章读书笔记&#xff1a;机制&#xff1a;地址转换&#xff08;address translation&#xff09;1.前…

c语言:用do-while输出前40项的斐波那契数值

求Fibonacci数列的前40个元素。该数列的特点是第1、2两个数为1、1。从第3个数开始&#xff0c;每数是其前两个数之和。 分析&#xff1a;从题意可以用如下等式来表示斐波那契数列&#xff1a; 1&#xff0c; 1&#xff0c; 2&#xff0c; 3&#xff0c; 5&#xff0c; 8&#x…

FA模型切换Stage模型组件切换之PageAbility切换

FA模型中PageAbility对应Stage模型中的UIAbility&#xff0c;PageAbility切换为UIAbility的方法如下。 在Stage应用中 创建UIAbility。 将FA应用中PageAbility的代码迁移到新创建的UIAbility中。 FA应用中PageAbility和Stage应用中的UIAbility生命周期基本一致&#xff0c;两者…

面试八股——redis——集群

0. redis集群的方案 1.主从复制&#xff08;高并发读&#xff09; 一个主节点负责写操作&#xff08;增删改&#xff09;&#xff0c;多个从节点负责查操作。 主从复制是让主节点修改数据之后&#xff0c;将对应数据同步到从节点中。 2.哨兵模式&#xff08;实现高可用&#x…