python实现最速下降法求二元函数极值并绘制3D图像
目标
原函数: f(x) = 2x1x1 + x2x2 -2x1*x2 - 4x1 + 4
起始点 为(0,0)
精度 :误差要求小于 10**(-3)
过程:
直接上代码看注释吧()
import numpy as np
import math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef f(x):return 2*x[0]**2 + x[1]**2 - 2*x[0]*x[1]-4*x[0]+4 def step(x): # 计算每次迭代的步长,H为该函数的hessian矩阵H = np.matrix([[4, -2], [-2, 2]])a = np.matrix(grad(x))b = np.matrix(grad(x).reshape(2, 1)) # array.reshape() 是把原列表按顺序变成指定的形状,本来是行向量形状是(2,1),经过处理后就变成了列向量形状是(2,1)return a*b/(a*np.matrix(H)*b) def grad(x): #在该点的梯度,返回一个向量return np.array([4*x[0]-2*x[1]-4, 2*x[1]-2*x[0]])def accuracy(x): #计算在该点的精度return math.sqrt(x[0]*x[0]+x[1]*x[1])if __name__=="__main__":x = np.array([0, 0]) # 定义初始点trace = [] # 用来记录迭代的轨迹deta = accuracy(grad(x)) # 精度while deta > 10**-3: # 一直循环,直到达到精度要求trace.append(np.append(x, f(x))) t = float(step(x)) # step(x)为只有一个元素的矩阵(二维列表),所以先把他转化为浮点型x = x - t*grad(x) # 更新点deta = accuracy(grad(x)) # 计算新的误差print(len(trace)) #看一下他迭代了多少次得到解# 一下是画图环节fig = plt.figure()ax = Axes3D(fig)X = np.arange(0, 3, 0.25) # 先输出一下trace列表看看大致的范围再确定坐标,范围是(0,3)步长为 0.25Y = np.arange(0, 3, 0.25)X, Y = np.meshgrid(X, Y) # meshgrid是 网格 的意思,用来形成网格Z = 2*X**2 + Y**2 - 2*X*Y-4*X+4 # 求Z坐标的值 X,Y,Z都是列表plt.xlabel('x') #设置坐标轴的名称plt.ylabel('y')for p in trace:ax.scatter(*p) # 显示轨迹点ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='summer') #绘制函数在设置的坐标范围的图像 XYZ是坐标列表,后面两个是画图坐标的间隔,默认值就是1,越大跨度越大点越稀疏,cmap 是图的风格(颜色渐变等等),有很多自己去网上找plt.show() # 显示
效果:
迭代次数为23
只看到两个点是因为被图覆盖了,如果只显示点,是这样的:
极值点为(2,2)
python实现最速下降法求二元函数极值并绘制3D图像相关推荐
- 遗传算法求二元函数极值怎么编码_使用遗传算法求二元函数的最小值
二元函数为y=x1^2+x2^2,x∈[-5,5] NIND=121; %初始种群的个数(Number of individuals) NVAR=2; %一个染色体(个体)有多少基因 PRECI=20 ...
- 遗传算法求二元函数极值怎么编码_遗传算法求解一元函数二元函数最值
##--------------------------施工中----------------------------## import random import math import numpy ...
- 遗传算法求二元函数极值怎么编码_遗传算法求解二元函数极值源码
网上看到了一个比较不错的讲解遗传算法的帖子,链接如下 http://blog.csdn.net/b2b160/article/details/4680853 但是却没有贴源代码,正好最近闲来无事,就尝 ...
- matlab求二元函数极值算法_最优化计算与matlab实现(3)——进退法
参考资料 <精通MATLAB最优化计算(第二版)> 数值实现 Matlab 2019a 目录 石中居士:最优化计算与Matlab实现--目录zhuanlan.zhihu.com 进退法 ...
- 遗传算法求二元函数极值怎么编码_用遗传算法求复杂函数的极值点
确定遗传 在元素个体,遗传得到的个体和变异个体中选取最好的30个个体(对应的函数值最大的30个个体)作为下一次迭代的父样本. from random import randint from numpy ...
- PSO粒子群算法(鸟群算法)计算二元函数极值(C语言实现、matlab工具箱实现)
算法讲解和感悟 PSO算法是经典的智能优化算法,在数学建模等比赛中非常常用,求解时的效果不错.对于智能优化算法,个人倾向于matlab实现,因为计算起来非常方便.但是这次因为老师的要求,准备C语言 ...
- python求最值_用Python实现最速下降法求极值的方法
对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...
- 用Python实现最速下降法求极值
原文:https://blog.csdn.net/u012705410/article/details/47254437 用Python实现最速下降法求极值 对于一个多元函数f(x)=f(x1,x2, ...
- python迭代法求极值_用Python实现最速下降法求极值的方法
对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...
最新文章
- Oracle Exadata 一体机关机过程(虚拟机环境)
- 猛男把400+条猫咪叫声做成数据集,可识别猫咪的3种不同状态丨开源
- 团队-团队编程项目作业名称-需求分析;
- MySQL分片 --转自Peter Zaitsev对MySQL分片的建议
- C/C++可变参函数示例
- webflux系列--reactor功能
- 华中科技大学c语言期末考试题,华中科技大学C语言期末考库剖析.docx
- iPhone SE 3 5G版发布在即 旧款将降价到千元出头
- mysql 报错1005_MysqlERROR 1005错误处理
- 广西大学计算机英语复试的内容,广西大学计算机专业的研究生复试时
- anaconda windows theano keras 完全安装教程,没有gpu忽略那段话也成功了
- c++ 多线程 垃圾回收器_新一代垃圾回收器ZGC的探索与实践
- python请输入星期几的第一个_python如何获取星期几
- CNC编程工程师如何炼成?要哪些必备技能?
- 2021年电工(初级)考试试卷及电工(初级)考试平台
- NCURSES程序设计之魔数方阵
- Xcode使用githut做代码版本管理
- YOLO-Pose: Enhancing YOLO for Multi Person Pose Estimation Using Object Keypoint Similarity Loss 笔记
- rust写操作系统 rCore tutorial 学习笔记:实验指导零 创建项目与启动
- R语言使用rnorm函数生成正太分布数据、使用boxplot函数可视化箱图、中间黑线为中位数位置、上下框线为上下四分位数位置、上下触须为1.5倍四分位数间距、如果有孤立点表示异常值