matlab步长如何设置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab步长如何设置相关的知识,希望对你有一定的参考价值。
1、打开MATLAB,file-new-script,进行程序编制,例如这里画一条曲线。”clear;clc;m=1365;a=-11825/m+5.01;x=0:0.1:1.6;b=a-log10(x);y=10.^(b);p=plot(x,y,'r');”
2、运行程序,可以先保存在运行,进行“save and run”,也可以拷贝到command window运行。
3、运行后得到图形。
4、假如现在你觉得横坐标太挤了,如何进行图片刻度线间距修改。
5、找到底部x轴,ticks,点击进入间距即步长设置。
6、设置完成,步长变了。具体步长得你自己看着怎么合适怎么确定。
参考技术A 首先、仿真时间要设置好,时间太长了就会一直等着。第二、变步长解法器也要设置。
第三、变步长的最大值也要设置当然越小越好,但是太小了会仿真的时间很长,就会一直在等着。
用户在Type后面的第一个下拉选项框中指定仿真的步长选取方式,可供选择的有Variable-step(变步长)和Fixed-step(固定步长)方式。变步长模式可以在仿真的过程中改变步长,提供误差控制和过零检测。固定步长模式在仿真过程中提供固定的步长,不提供误差控制和过零检测。用户还可以在第二个下拉选项框中选择对应模式下仿真所采用的算法。
变步长模式解法器有:ode45,ode23,ode113,ode15s,ode23s,ode23t,ode23tb和discrete。
ode45:缺省值,四/五阶龙格-库塔法,适用于大多数连续或离散系统,但不适用于刚性(stiff)系统。它是单步解法器,也就是,在计算y(tn)时,它仅需要最近处理时刻的结果y(tn-1)。一般来说,面对一个仿真问题最好是首先试试ode45。
ode23:二/三阶龙格-库塔法,它在误差限要求不高和求解的问题不太难的情况下,可能会比ode45更有效。也是一个单步解法器。
ode113:是一种阶数可变的解法器,它在误差容许要求严格的情况下通常比ode45有效。ode113是一种多步解法器,也就是在计算当前时刻输出时,它需要以前多个时刻的解。
ode15s:是一种基于数字微分公式的解法器(NDFs)。也是一种多步解法器。适用于刚性系统,当用户估计要解决的问题是比较困难的,或者不能使用ode45,或者即使使用效果也不好,就可以用ode15s。
ode23s:它是一种单步解法器,专门应用于刚性系统,在弱误差允许下的效果好于ode15s。它能解决某些ode15s所不能有效解决的stiff问题。
ode23t:是梯形规则的一种自由插值实现。这种解法器适用于求解适度stiff的问题而用户又需要一个无数字振荡的解法器的情况。
ode23tb:是TR-BDF2的一种实现, TR-BDF2 是具有两个阶段的隐式龙格-库塔公式。
discrtet:当Simulink检查到模型没有连续状态时使用它。
步长参数:对于变步长模式,用户可以设置最大的和推荐的初始步长参数,缺省情况下,步长自动地确定,它由值auto表示。
Maximum step size(最大步长参数):它决定了解法器能够使用的最大时间步长,它的缺省值为“仿真时间/50”,即整个仿真过程中至少取50个取样点,但这样的取法对于仿真时间较长的系统则可能带来取样点过于稀疏,而使仿真结果失真。一般建议对于仿真时间不超过15s的采用默认值即可,对于超过15s的每秒至少保证5个采样点,对于超过100s的,每秒至少保证3个采样点。
Initial step size(初始步长参数):一般建议使用“auto”默认值即可。
仿真精度的定义(对于变步长模式)
Relative tolerance(相对误差):它是指误差相对于状态的值,是一个百分比,缺省值为1e-3,表示状态的计算值要精确到0.1%。
Absolute tolerance(绝对误差):表示误差值的门限,或者是说在状态值为零的情况下,可以接受的误差。如果它被设成了auto,那么simulink为每一个状态设置初始绝对误差为1e-6。
Mode(固定步长模式选择)
Multitasking:选择这种模式时,当simulink检测到模块间非法的采样速率转换,它会给出错误提示。所谓的非法采样速率转换指两个工作在不同采样速率的模块之间的直接连接。在实时多任务系统中,如果任务之间存在非法采样速率转换,那么就有可能出现一个模块的输出在另一个模块需要时却无法利用的情况。通过检查这种转换,Multitasking将有助于用户建立一个符合现实的多任务系统的有效模型。
使用速率转换模块可以减少模型中的非法速率转换。Simulink提供了两个这样的模块:unit delay模块和zero-order hold模块。对于从慢速率到快速率的非法转换,可以在慢输出端口和快输入端口插入一个单位延时unit delay模块。而对于快速率到慢速率的转换,则可以插入一个零阶采样保持器zero-order hold。
Singletasking:这种模式不检查模块间的速率转换,它在建立单任务系统模型时非常有用,在这种系统就不存在任务同步问题。
Auto:这种模式,simulink会根据模型中模块的采样速率是否一致,自动决定切换到multitasking和singletasking。
输出选项
Refine output:这个选项可以理解成精细输出,其意义是在仿真输出太稀松时,simulink会产生额外的精细输出,这一点就像插值处理一样。用户可以在refine factor设置仿真时间步间插入的输出点数。
产生更光滑的输出曲线,改变精细因子比减小仿真步长更有效。精细输出只能在变步长模式中才能使用,并且在ode45效果最好。
Produce additional output:它允许用户直接指定产生输出的时间点。一旦选择了该项,则在它的右边出现一个output times编辑框,在这里用户指定额外的仿真输出点,它既可以是一个时间向量,也可以是表达式。与精细因子相比,这个选项会改变仿真的步长。
Produce specified output only:它的意思是让simulink只在指定的时间点上产生输出。为此解法器要调整仿真步长以使之和指定的时间点重合。这个选项在比较不同的仿真时可以确保它们在相同的时间输出。 参考技术B
matlab步长可这样设置:
参数法:step=2;a=1:step:30
默认法:a=1:30%默认step=1
直接法:a=1:2:30
set(gca,'ytick',[ymin:step:ymax])
注意:axis([xmin xmax ymin ymax])仅仅设定了横纵坐标的范围,而没有说明Matlab画图中标示的点.
而set命令,直指显示出来的标示位置. 参考技术D 双击组件,查看里面的step设置
采用非精确线搜索求步长的Armjio准则--MATLAB实现
实现原理
具体数学实现原理可参考这篇文章:用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
代码实现
以下编译环境为 MATLAB R2019b 下编译运行,不同版本可能略有出入。
function [alpha, xk, f, k] = Armjio(fun, grid, x0, dk)
%
% Function [alpha, xk, fx, k] = Armjio(fun, grid, x0, dk)
% 求出函数fun在x0处以dk为下降方向时的步长alpha,同时返回相对应的下
% 一个下降点xk以及xk处的函数值fx,k为迭代次数
% -----------------------------------------------------------
% 输入:
% fun 函数名称(字符变量)
% grid 梯度函数名称(字符变量)
% x0 迭代点(列向量)
% dk 函数在迭代点处的下降方向(列向量)
%
% 输出:
% alpha 函数在x0处以dk为下降方向时的下降步长
% xk 函数在x0处以dk为下降方向,以alpha为步长
% 求得的下降点
% fx 函数在下降点xk处的函数值
% k 求步长算法迭代次数
% -----------------------------------------------------------
% by Zhi Qiangfeng
%
beta = 0.333; % 步长 alpha 的迭代系数,小于 1
rho = 1e-3; % 泰勒展开式补足系数,0 < rho < 1/2
alpha = 1; % 初始步长为 1
k = 0; % 统计迭代次数
gk = feval(grid, x0); % x0处的梯度值
fd = feval(fun, x0 + alpha * dk); % 函数在下一个迭代点处的目标函数值
fk = feval(fun, x0) + alpha * rho * gk' * dk; % 函数在下一个迭代点处的泰勒展开值
while fd > fk
alpha = beta * alpha;
fd = feval(fun, x0 + alpha * dk);
fk = feval(fun, x0) + alpha * rho * gk' * dk;
k = k + 1;
end
xk = x0 + alpha * dk; % 下降点
f = feval(fun, xk); % 下降点处函数值
end
输出示例
以Rosenbrock函数为例,这是优化领域中一个著名的检验函数,其函数与其梯度函数如下:
函数图像如下:
编写函数文件 Rosenbrock.m 如下:
function f = Rosenbrock(x)
f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
end
随后是梯度函数文件 grid.m 如下:
function g = grid(x)
g = [-400 * x(1) * x(2) + 400 * x(1)^3 + 2 * x(1) - 2;
200 * x(2) - 200 * x(1)^2];
end
接着我们求 Rosenbrock 函数在 [-1; 1] 点处以负梯度方向为下降方向的迭代步长,调用我们上面的 Armjio 函数,输出结果如下:
>> x0 = [-1; 1];
>> dk = -grid(x0);
>> [alpha, xk, fx, k] = Armjio("Rosenbrock", "grid", x0, dk)
alpha =
0.0014
xk =
-0.9945
1.0000
fx =
3.9900
k =
6
结论:Rosebrock 函数在 [-1; 1] 点处以负梯度方向为下降方向的迭代步长为 0.0014,下一个迭代点为 [-0.9945; 1],且下一步函数值为 3.99。
附
最优化相关算法设计数学原理:最优化/Optimization文章合集
有帮助可以点赞哦,谢谢大家的支持~
以上是关于matlab步长如何设置的主要内容,如果未能解决你的问题,请参考以下文章