matlab中bfgs的用法,MATLAB拟牛顿法之DFP与BFGS算法
DFP算法原理
由于博主使用WPS编辑的文本,公式无法赋值粘贴,这里以截图的方法给出了推导过程。博主会上传该DOC文档。
牛顿法
阻尼牛顿法
BFGS算法原理
matlab代码(DFP)
syms x1 x2
f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;
X=DFP(f,[0 0],1e-8,100)
function x=DFP(f,x0,eps,k)
%目标函数f
%初始迭代点x0
%迭代精度eps
%迭代次数K
x0=x0';
TiDu=matlabFunction(gradient(sym(f)));
m=length(x0);
H=eye(m);%构造初始海塞矩阵
%写出函数值,梯度值的表达式
f_cal='f(x0(1),x0(2))'; %初始点函数值
tidu_cal='TiDu(x0(1),x0(2))';
f1_cal='f(x_1(1),x_1(2))';%下一点函数值
%% 从第一个点计算到第二个点
f_x0=eval(f_cal);%计算初始点函数值
tidu_x0=eval(tidu_cal);%计算初始点梯度值
if norm(tidu_x0) < eps%判断是否满足终止条件
x=x0;
return;
end
d=-A*tidu_x0;% 下降方向
syms alfa %定义步长
x_1=x0+alfa*d;%更新迭代点位置
f_x1=eval(f1_cal);%计算迭代点的函数表达式
df_x1=diff(f_x1);%迭代点的梯度表达式
dalfa=double(solve(df_x1));%求解,得到步长alfa
x0=x0+dalfa*d;%更新初始点
tidu_x1=eval(tidu_cal);%计算该点梯度
n=1;
while n < k && norm(tidu_x1) > eps
delta_x=dalfa*d; %计算sK
delta_g=tidu_x1-tidu_x0; %计算yk
delta_H=delta_x*delta_x'/(delta_x'*delta_g)- H*delta_g*delta_g'*H/(delta_g'*H*delta_g); %计算delta_Dk
H=H+delta_H; %dfp迭代公式
tidu_x0=tidu_x1; %将该点梯度作为新的初始点继续迭代
d=-A*tidu_x0;% 下降方向
syms alfa
x_1=x0+alfa*d;
f_x1=eval(f1_cal);
df_x1=diff(f_x1);
dalfa=double(solve(df_x1));
x0=x0+dalfa*d;
tidu_x1=eval(tidu_cal);
end
x=x0;
end
matlab代码(BFGS)
%% BFGS算法与DFP算法过程类似,只是迭代函数不同
clc
clear
syms x1 x2
f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;
X=BFGS(f,[0 0],1e-8,100)
function x=BFGS(f,x0,eps,k)
x0=x0';
TiDu=matlabFunction(gradient(sym(f)));
m=length(x0);
A=eye(m);%构造初始矩阵
f_cal='f(x0(1),x0(2))';
tidu_cal='TiDu(x0(1),x0(2))';
f1_cal='f(x_1(1),x_1(2))';
%从第一个点计算到第二个点
f_x0=eval(f_cal);
tidu_x0=eval(tidu_cal);
if norm(tidu_x0) < eps
x=x0;
return;
end
d=-A*tidu_x0;% 下降方向
syms alfa
x_1=x0+alfa*d;
f_x1=eval(f1_cal);
df_x1=diff(f_x1);
dalfa=double(solve(df_x1));
x0=x0+dalfa*d;
tidu_x1=eval(tidu_cal);
n=1;
while n < k && norm(tidu_x1) > eps
delta_x=dalfa*d;
delta_g=tidu_x1-tidu_x0;
delta_A=-A*delta_x*delta_x'*A/(delta_x'*A*delta_x)+delta_g*delta_g'/(delta_g'*delta_x);
A=A+delta_A;
tidu_x0=tidu_x1;
d=-A*tidu_x0;% 下降方向
syms alfa
x_1=x0+alfa*d;
f_x1=eval(f1_cal);
df_x1=diff(f_x1);
dalfa=double(solve(df_x1));
x0=x0+dalfa*d;
tidu_x1=eval(tidu_cal);
end
x=x0;
end
matlab中bfgs的用法,MATLAB拟牛顿法之DFP与BFGS算法相关推荐
- matlab中linspace的用法,matlab中的一些基本使用方法(持续添加)
MATLAB中的常用清除命令 1.clc命令:即可清空命令窗口中的内容. 2.clf命令:清除当前figure中的内容. 3.close命令:关闭当前打开的figure图形界面. 4.clear命令: ...
- matlab中等号的用法,matlab中“==”两个等号连一块是啥意思?怎么用?
www.mh456.com防采集. a=5 % 给变量a赋值a==5 % 逻辑判断,变量a是否等于5,如果是则返回1,否则返回0.追问M=max(DeD);for i=1:M+1; %网络图中节点的度 ...
- matlab中rng的用法,matlab 中rag函数怎么用?
1,一维数组输入 在matlab中,基本的运算单元是无需指定维数的数组.一维数组在数学上常称为向量,如下所示,在matlab中要输入数组 a = {1,2,4,9,21,13,20} ,按照下面格式就 ...
- matlab中randint函数用法,matlab中rand randn randint函数的区别
matlab中rand函数是产生0到1的随机分布 matlab中randn函数是产生标准正态分布 randint是产生整数随机数,默认为0和1 %%%%%%%%%%%rand%%%%%%%%%%%%% ...
- matlab中normcdf函数用法,MATLAB NORMCDF
MATLAB 中关于常见的概率分布密度函数的语句及格 式 MATLAB 中关于常见的概率分布密度函数的语句及格式 normpdf(x,mu,sigma) 正态分布密度函数. uifpdf(x,a,b) ...
- matlab中repmat的用法,Matlab: sum的用法、每一行求和、repmat的用法、sum和repmat结合使用减少循环...
偶尔会用到关于矩阵元素的求和,总结一下常用的 目录 1.向量求和 2.矩阵求和 (1)默认按列求和,得到一个行向量 (2)求每一行的和 3.sum和repmat一起使用 (1)矩阵A中每一行的平方和 ...
- matlab中normcdf函数用法,Matlab中标准正态分布的密度函数是normcdf(x,0,1)
中标准正属于项目资本现金流量表中现金流出构成的是() 态分USCI模块中的波特率由分频器和调制器共同作用生成. 在MSP430F66xx时钟设置中XT1的XIN和XOUT引脚接32768Hz低频晶振, ...
- matlab中平均函数用法,matlab中怎样在X的指定范围内求y的平均值
有两组数据,前面一组值设为x后面一组设为y.x是坐标的变化范围,y是每个坐标下力的大小,怎样在X的指定范围内求y的平均值?? 比如下面x范围是从-18.19959641到-18.00003052之内的 ...
- matlab中ga函数用法,matlab遗传算法ga函数
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 function optimization4() A=[];b=[]; Aeq=[];beq=[];LB=[0.1;0.03;0.03;0.1;0.03; ...
- matlab中triangle函数用法,matlab triangle函数格式
匿名用户 1级 2016-07-27 回答 pulstran(t,d,p,fs,w)其中t是时间,d为函数偏移(如y = func(t-d(1)) + func(t-d(2)) + ... ):p是函 ...
最新文章
- 读书人:人机融合中的深度态势感知
- 利用PHP的Popen实现RRDTOOL作图的动态输出
- Python中self的用法
- OpenCV使用Laplacian filtering和距离变换以及Laplacian滤波对重叠对象进行分段的实例(附完整代码)
- U-boot 打补丁,编译,设置环境变量,
- react(86)--列表项控制选中
- 玩转oracle 11g(50):rman备份脚本
- 抖音2020研究报告_抖音音乐发布2020抖音音乐生态数据报告
- 通过分析系统日志,统计你的电脑开机时间的小程序PC PowerOn Time,附源码
- 微服务网关(gateway)概述 与 嵌入式 Zuul 反向代理
- 自制全铝CNC雕刻机全过程(完工篇)
- 英特尔核显驱动hd630_全新CPU性能天梯图,十代英特尔与R3 3100/3300X定位讲解
- linux下动态域名的实践
- BASH脚本基础:环境变量PS1配色方法
- java零基础风清扬黑马笔记
- JVM虚拟机与Android虚拟机
- IEC101 可变结构限定词、传送原因、ASDU公共地址和传送原因
- [C++]判断齐次坐标系中三点是否共线(三个向量是否共面)
- 新手学习python零基础_一个零基础新手学习Python应该知道的学习步骤与规划
- 一个屌丝程序猿的人生(九十六)