当前位置:网站首页>利用 MATLAB 编程实现最速下降法求解无约束最优化问题
利用 MATLAB 编程实现最速下降法求解无约束最优化问题
2022-04-23 14:33:00 【i道i】
本文章包含以下内容
1、画出最速下降法的算法流程图;
2、MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件);
3、MATLAB 编写最速下降法求解无约束优化问题的函数,要求采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);
4、MATLAB 编写最速下降法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);
5、MATLAB 编写程序(命令式 M 文件),分别利用精确搜索和不精确搜索 的最速下降法,求解如下问题:
精度为 0.001,初始点为(-1,1);
改变初始点为(-1.2,1)重新运行,观察运行结果。
本实验中函数用单独function计算
function y=f(x)
if(length(x)==1)
global xk;
global pk;
x=xk+x*pk;
end
y=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
1.最速下降法的算法流程图
2、MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件);
function g=shuzhiweifenfa(x)
for i = 1:length(x)
m=zeros(1,length(x));
m(i)=(10^-3)/2;
g(i)=f(x+m)-f(x-m);
end
g=g/10^-3;
3、最速下降法求解无约束优化问题的函数,采用黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度设为 epson 可调);
function x=zuisuxiajiangfa_hjfg(e,x)
%step 1
%没用到k,只存储当前迭代的值。
global xk;
global pk;
while 1
%step 2
g=shuzhiweifenfa(x);
%step 3
%范数用的是平方和开根号
if sqrt(sum(g.^2))<=e
return;
end
pk=-g;
xk=x;
%这两个函数见之前代码(matlab无约束最优化的一般算法)
[a,b,c]=jintuifa(0,0.1);
a=huangjinfenge(a,c,10^-4);
%step 4
x=x+a*pk;
end
4、最速下降法求解无约束优化问题的函数,要求采用 Wolfe-Powell 非精确一维搜索,用数值微分法计算梯度(函数式 M 文件, 精度设为 epson 可调);
function a=Wolfe_Powell(x,pk)
%step 1
u=0.1;
b=0.5;
a=1;
n=0;
m=10^100;
%step 2
fx=f(x);
g=shuzhiweifenfa(x);
while 1
xk=x+a*pk;
fxk=f(xk);
gk=shuzhiweifenfa(xk);
if (fx-fxk)>=(-u*a*g*pk.')%(3-1)
if (gk*pk.')>=(b*g*pk.')%(3-2)
return;
else
%step 4
n=a;
a=min(2*a,(a+m)/2);
end
else
%step 3
m=a;
a=(a+n)/2;
end
end
function x=zuisuxiajiangfa_Wolfe(e,x)
%step 1
%没用到k,只存储当前迭代的值。
while 1
%step 2
g=shuzhiweifenfa(x);
%step 3
%范数用的是平方和开根号
if sqrt(sum(g.^2))<=e
return;
end
pk=-g;
a=Wolfe_Powell(x,pk);
%step 4
x=x+a*pk;
end
5、分别利用精确搜索和不精确搜索 的最速下降法,问题:
clear
clc
for i=1:2
if(i==1)
x=[-1,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('=========================\n');
else
x=[-1.2,1];
fprintf('=========================');
fprintf('\nx=%f\t\t%f\n',x(1),x(2));
fprintf('=========================\n');
end
fprintf('精确搜索的最速下降法:\n');
x_=zuisuxiajiangfa_hjfg(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
fprintf('不精确搜索的最速下降法\n');
x_=zuisuxiajiangfa_Wolfe(10^-3,x);
fprintf('x*=%f\t%f\n',x_(1),x_(2));
fprintf('f(x)=%f\n',f(x_));
end
结果:
版权声明
本文为[i道i]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_58196051/article/details/124331438
边栏推荐
- API Gateway/API 网关(四) - Kong的使用 - 集成Jwt和熔断插件
- 全连接层的作用是什么?
- C语言知识点精细详解——初识C语言【1】
- 1分钟看懂执行流程,永久掌握for循环(附for循环案例)
- MDS55-16-ASEMI整流模块MDS55-16
- I thought I could lie down and enter Huawei, but I was confused when I received JD / didi / iqiyi offers one after another
- 想要成为架构师?夯实基础最重要
- Use of ansible and common modules
- Want to be an architect? Tamping the foundation is the most important
- 关于在vs中使用scanf不安全的问题
猜你喜欢
1N5408-ASEMI整流二极管1N5408
AT89C52 MCU frequency meter (1Hz ~ 20MHz) design, LCD1602 display, including simulation, schematic diagram, PCB and code, etc
全连接层的作用是什么?
XX project structure notes
Nacos uses demo as configuration center (IV)
外包干了四年,废了...
8.5 循环神经网络简洁实现
Parameter stack pressing problem of C language in structure parameter transmission
QT actual combat: Yunxi chat room
A good tool: aardio
随机推荐
Sed learning for application
JS progress bar, displaying the loading progress
flannel 原理 之 子网划分
Branch statement of process control
【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
Debug on TV screen
Mq-2 and DS18B20 fire temperature smoke alarm system design, 51 single chip microcomputer, with simulation, C code, schematic diagram, PCB, etc
LLVM - 生成局部变量
The initial C language framework is suitable for review and preliminary understanding
ASEMI三相整流桥和单相整流桥的详细对比
单片机的函数信号发生器,输出4种波形,频率可调,原理图,仿真和C程序
LLVM - 生成加法
线程同步、生命周期
Qt实战:云曦日历篇
MDS55-16-ASEMI整流模块MDS55-16
全连接层的作用是什么?
51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)
详解TCP的三次握手
Redis源码分析之HSET流程与ziplist
初始c语言大致框架适合复习和初步认识