首页 > 编程语言 >BB方法与最速下降法的对比程序

BB方法与最速下降法的对比程序

时间:2024-02-28 19:46:11浏览次数:23  
标签:plt 迭代 BB dF 对比 np 最速 norm

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 plt.rcParams['font.sans-serif']=['Microsoft YaHei']
 4 
 5 def f(y): #目标函数
 6     f_x=y[0]**2+10*y[1]**2
 7     return f_x
 8 
 9 def df(y): #函数梯度
10     df_y=np.array([2*y[0],20*y[1]])
11     return df_y
12 
13 def DG_method(start,eps): #最速下降法
14 
15     #分别记录迭代点、迭代点的函数值、迭代点的梯度、梯度模长
16     X=np.zeros((1000,2))
17     F=np.zeros((1000,1))
18     dF=np.zeros((1000,2))
19     dF_norm=np.zeros((1000,1))
20     X[0,:]=start #初始迭代点
21     F[0]=f(X[0])
22     dF[0,:]=df(X[0])
23     dF_norm[0]=np.linalg.norm(dF[0,:])
24     k=0
25  
26     while (dF_norm[k]>=eps)  :
27         alpha=np.dot(dF[k,:],dF[k,:])/np.dot(dF[k,:],np.dot([[2,0],[0,20]],dF[k,:])) #计算步长,此处直接使用的最速下降的步长
28         X[k+1,:]=X[k,:]-alpha*dF[k,:]
29         F[k+1]=f(X[k+1,:])
30         dF[k+1,:]=df(X[k+1,:])
31         dF_norm[k+1]=np.linalg.norm(dF[k+1,:])
32 
33         k=k+1
34         
35     return k,X[k,:],F[k,:],X,F,dF_norm
36 
37 def BB_method(start,eps,alpha=1,alpham=0.05,alphaM=2,M=10,c1=0.2,beta=0.3): #BB方法
38 
39     #分别记录迭代点、迭代点的函数值、迭代点的梯度、梯度模长
40     X=np.zeros((1000,2))
41     F=np.zeros((1000,1))
42     dF=np.zeros((1000,2))
43     dF_norm=np.zeros((1000,1))
44     X[0,:]=start #初始迭代点
45     F[0]=f(X[0])
46     dF[0,:]=df(X[0])
47     dF_norm[0]=np.linalg.norm(dF[0,:])
48     k=0
49  
50     while dF_norm[k]>=eps :
51         while f(X[k,:]-alpha*dF[k,:])>= max(F[max(0,k-M):k+1])-c1*alpha*dF_norm[k]**2 : #对步长进行修正
52             alpha=beta*alpha
53         X[k+1,:]=X[k,:]-alpha*dF[k,:]
54         F[k+1]=f(X[k+1,:])
55         dF[k+1,:]=df(X[k+1,:])
56         dF_norm[k+1]=np.linalg.norm(dF[k+1,:])
57        
58         s=X[k+1,:]-X[k,:]        
59         y=dF[k+1,:]-dF[k,:]
60         #alpha=np.dot(s,s)/np.dot(s,y)
61         alpha=min([max([np.dot(s,s)/np.dot(s,y),alpham]),alphaM]) #对步长进行截断
62         k=k+1
63         
64     return k,X[k,:],F[k,:],X,F,dF_norm
65 
66 K,x_min,f_min,X,F,dF_norm=BB_method([-10,-1],1e-6)
67 print("利用BB方法: 迭代次数 = ",K ,",最优值点 = ",x_min,",最小值 = ",f_min)
68 
69 K1,x_min1,f_min1,X1,F1,dF_norm1=DG_method([10,1],1e-6)
70 print("利用最速下降法:迭代次数 = ",K1 ,",最优值点 = ",x_min1,",最小值 = ",f_min1)
71 
72 
73 def Go_plot(K1,X1,F1,dF_norm1,K2,X2,F2,dF_norm2): #对迭代点位置、函数值下降、梯度范数下降曲线画图,将两个方法的结果对比
74     plt.figure()
75     plt.plot(X1[0:K1+1,0],X1[0:K1+1,1])
76     plt.plot(X2[0:K2+1,0],X2[0:K2+1,1])
77     plt.legend(['BB方法','最速下降法'])
78 
79     plt.figure()
80     plt.plot(range(K1+1),np.log(dF_norm1[0:K1+1]))
81     plt.plot(range(K2+1),np.log(dF_norm2[0:K2+1]))
82     plt.legend(['BB方法','最速下降法'])
83     plt.xlabel('迭代次数')
84     plt.ylabel('梯度范数模长的对数')
85     
86     plt.figure()
87     plt.plot(range(K1+1),np.log(F1[0:K1+1]))
88     plt.plot(range(K2+1),np.log(F2[0:K2+1]))
89     plt.legend(['BB方法','最速下降法'])
90     plt.xlabel('迭代次数')
91     plt.ylabel('目标函数值的对数')
92 
93     plt.show()
94 
95 Go_plot(K,X,F,dF_norm,K1,X1,F1,dF_norm1)
96 
97 
98     

利用BB方法: 迭代次数 = 21 ,最优值点 = [-2.46698420e-08 2.06260876e-12] ,最小值 = [6.08601148e-16]
利用最速下降法:迭代次数 = 86 ,最优值点 = [3.19952043e-07 3.19952043e-08] ,最小值 = [1.12606241e-13]

下面的三张对比图:

 

  

 

 

标签:plt,迭代,BB,dF,对比,np,最速,norm
From: https://www.cnblogs.com/wjma2719/p/18041579

相关文章

  • pthread与tbb中各种锁的对比测试
     pthread中提供的锁有:pthread_mutex_t,pthread_spinlock_t,pthread_rwlock_t。   pthread_mutex_t是互斥锁,同一瞬间只能有一个线程能够获取锁,其他线程在等待获取锁的时候会进入休眠状态。因此pthread_mutex_t消耗的CPU资源很小,但是性能不高,因为会引起线程切换。   pthr......
  • Qt QVector和vector以及QMap和map的遍历性能对比
    使用Qt中的容器给C++开发带来很大的便利,而且QVector和QMap等容器扩展的一些成员函数也是很方便的。但是Qt的这些容器和STL库的容器比,效率到底怎么样?我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。测试环境:系统:windows10编译器:MingGWmingw......
  • RabbitMQ 学习笔记
    为什么使用消息队列?以用户下单购买商品的行为举例,在使用微服务架构时,我们需要调用多个服务,传统的调用方式是同步调用,这会存在一定的性能问题使用消息队列可以实现异步的通信方式,相比于同步的通信方式,异步的方式可以让上游快速成功,极大提高系统的吞吐量消息队列的使用场景有如......
  • 打包app端 登录页【非tabBar页面】底部会显示导航栏的解决办法
    如题,uniapp项目打包app后,登录页底部会显示导航栏的解决办法 首先直接在pages.Json中的对应页面配置中设置"navigationBarHidden":true这个方法是无效的"style":{       "navigationBarHidden":true   }但是可以通过js方式来控制页脚tabBar的隐藏与否:1、首......
  • 数据提取PDF SDK的对比推荐
    PDF已迅速成为跨各种平台共享和分发文档的首选格式,它作为一种数据来源,常见于公司的各种报告和报表中。为了能更好地分析、处理这些数据信息,我们需要检测和提取PDF中的数据,并将其转换为可用且有意义的格式。而数据提取的PDFSDK,可以集成在应用程序或内部系统中,能更加有效地提高......
  • 达梦、Oracle、Mysql和PostgreSQL数据库重要参数对比
    前言数据库在安装完成之后通常都会配置一些基础的参数用于控制和管理数据库行为,其中有些参数在配置完成后若要修改则需要重启数据库才能生效,甚至一些参数在完成初始化之后无法修改,这些参数在生产环境中尤其需要关注,需要事先就确定好,避免后续遇到需要修改时影响到生产环境的使用。......
  • 自研Uncrop对比Stability AI效果
    https://stability.ai/news/clipdrop-launches-uncrop-the-ultimate-aspect-ratio-editor官网展示效果自研效果初始一次扩图二次扩图......
  • Trino(PrestoSQL)和HiveSQL的时间格式转换对比
    1.获取当前时间--hiveselectfrom_unixtime(unix_timestamp());-->2021-01-0622:53:16--精确到今天的时分秒selectfrom_unixtime(unix_timestamp('2021-12-0713:01:03'),'yyyy-MM-ddHH:mm:ss');-->2021-12-0713:01:03--精确到今天的时分秒指定格式selectcurrent......
  • Yaml与Json的对比
    YAML格式:server:#服务器配置port:8043#端口号为8043spring:#Spring配置datasource:#数据源配置url:jdbc:mysql://localhost:3306/hbs?serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false&failOv......
  • zabbix自动发现windows 服务器自动注册服务器
    一、将zabbixAgent文件放在共享目录上,设置共享所有人都有权限访问,设置zabbix配置文件修改abbix_agentd.conf配置文件1、Server=172.21.32.123配置zabbix器地址2、ServerActive=172.21.32.128   配置zabbix器地址3、Hostname=Windowshost  配置被监控端主机名称 4......