① 用matlab求解微分方程组的数值解,原题是这样的,y''-y-x=0,初值是y(0)=0,y'(0)=1,要求用欧拉法求解数值解
可以提供两种方法:
1:迭代法,通过自变量步长推进求解,有一定的算法。
2:MATLAB符号运算的自带函数dsolve,可以求出解符号表达式,用自变量的域代替就行了。
y=dsolve('D2y-3*Dy=x^2','Dy(0)=1','y(1)=0','x');
如果要求-10到10之间的解(Y值),可令步长为0.01
x=(-10:0.01:10);
y的解:
y=subs(y,'x',x)
② 用euler方法,以步长h=0.2解初值问题,y'=-xy2-y,y(0)=1
步长h取0.01比较合适,这样y1=2
③ MATLAB中用ode45求解微分方程,如何设置最大步长
如果你用过simulink里的ode45配置,我觉得你就会发现高赞就是在扯淡,你给的时间序列只是采样点,根本不是设置步长用的。我最近偷懒不想用simulink就研究了下ode45的函数配置项,在matlab帮助里搜一下“Summary of ODE Options”,里面详细罗列了各种ode函数有的参数,最大步长想必也猜的出来,就是“MaxStep”,用法也在ode45函数的帮助里写了,我简单举个例子:
tspan=1:1e-3:30;
xini=[111]';
options=odeset('MaxStep',1e-2,'RelTol',1e-2,'AbsTol',1e-4);
[~,results]=ode45(@(t,x)myodefunc(t,x,user_args),tspan,xini,options);
是的,就是通过odeset函数设置,options参数写入。设置的细节请参考Matlab帮助。
我看还有同学在纠结ode45的固定步长设置方法,提一句:首先,ode45 是一个变步长函数,不可能设置为定步长的。其次,需要定步长的ode函数可以在Matlab帮助里搜一下“Solvers for Real-Time Simulation”,里面详细介绍了一些定步长的ode函数。但要注意Matlab本身是没有这些函数的,需要用simulink仿真才能配置。
如果实在不想用simulink,那自己手写一个函数也行(虽然我没写过),定步长的ode函数里常用的是ode4,也就是四阶龙格库塔算法,可以参考这个博客:susanliuliu28-四阶龙格库塔
④ 版本matlab2014a,simulink仿真步长和算法无法设置,求问怎么办
一、算法设置
1.变步长(Variable—Step)求解器
可以选择的变步长求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.缺省情况下,具有状态的系统用的是ode45;没有状态的系统用的是discrete。
1)ode45基于显式Runge—Kutta(4,5)公式,Dormand—Prince对.它是—个单步求解器(solver)。也就是说它在计算y(tn)时,仅仅利用前一步的计算结果y(tn-1).对于大多数问题.在第一次仿真时、可用ode45试一下。
2)ode23是基于显式Runge—Kutta(2,3).Bogackt和Shampine对.对于宽误差容限和存在轻微刚性的系统、它比ode45更有效一些.ode23也是单步求解器。
3)odell3是变阶Adams-Bashforth—Moulton PECE求解器.在误差容限比较严时,它比ode45更有效.odell3是一个多步求解器,即为了计算当前的结果y(tn),不仅要知道前一步结果y(tn-1),还要知道前几步的结果y(tn-2),y(tn-3),…;
4)odel5s是基于数值微分公式(NDFs)的变阶求解器.它与后向微分公式BDFs(也叫Gear方法)有联系.但比它更有效.ode15s是一个多步求解器,如果认为一个问题是刚性的,或者在用ode45s时仿真失败或不够有效时,可以试试odel5s。 odel5s是基于一到五阶的NDF公式的求解器.尽管公式的阶数越高结果越精确,但稳定性会差一些.如果模型是刚性的,并且要求有比较好的稳定性,应将最大的阶数减小到2.选择odel5s求解器时,对话框中会显示这一参数. 可以用ode23求解器代替。del5s,ode23是定步长、低阶求解器。
5)ode23s是基于一个2阶改进的Rosenbrock公式.因为它是一个单步求解器,所以对于宽误差容限,它比odel5s更有效.对于一些用odel5s不是很有效的刚性问题,可以用它解决。
6)ode23t是使用“自由”内插式梯形规则来实现的.如果问题是适度刚性,而且需要没有数字阻尼的结果,可采用该求解器。
7)ode23tb是使用TR—BDF2来实现的,即基于隐式Runge—Kutta公式,其第一级是梯形规则步长和第二级是二阶反向微分公式.两级计算使用相同的迭代矩阵.与ode23s相似,对于宽误差容限,它比odtl5s更有效。
8)discrete(变步长)是simulink在检测到模型中没有连续状态时所选择的一种求解器。
2.定步长(Flxed—Step)求解器
可以选择的定步长求解器有:ode5,ode4,ode3,ode2,ode1和discrete。
1)ode5是ode45的一个定步长版本,基于Dormand—Prince公式。
2)ode4是RK4,基于四阶Runge—Kutta公式。
3) ode3是ode23的定步长版本,基于Bogacki-Sbampine公式。
4) ode2是Heun方法,也叫作改进Euler公式。
5) odel是Euler方法。
6) discrete(定步长)是不执行积分的定步长求解器.它适用于没有状态的模型,以及对过零点检测和误差控制不重要的模型。
⑤ matlab,对于常微分方程怎样用数值解法求函数关系
正常现象,微分方程的求解在算法上要讨论求解精度的问题,有可能和参数的数值有些关系。
比如说有时我们指定求解步长是1e-3,而实际上的求解过程可能不会按此步长计算,只是在更高精度求解结束后,以1e-3的精度给你返回求解结果。
⑥ simulink求解器solver 的设置问题
出现这个警告信息的原因:
在仿真参数设置对话框(Configuration Parameters)中,求解器选项(Solver options)的最大步长(Max Step Size)被设成“自动”(auto)。在这种情况下,离散求解器会使用最短采样时间作为最大步长,而连续求解器使用仿真起止时间的1/50作为最大步长。模型默认的开始时间是0,结束时间是10,所以其1/50就是0.2秒。
警告的作用:
关于最大步长
最大步长是Simulink求解器按时间进行步进时所允许的最大步长——注意,这是对变步长(Variable-step)求解器而言的(你的模型出现这样的提示,肯定是变步长求解器)。如果选择的是定步长(Fixed-step)求解器,参数设置对话框里面有一个类似的项是Fixed step size (fundamental sample time),同样可以设置为auto,也会导致类似(但不完全相同)的警告。
警告的作用
按照上面所说的自动步长设置规则,你新建一个模型,默认的求解器是变步长的,而默认的最大步长是auto,这样的参数设置对于多数模型可能是适用的,但对于有些模型,这样的步长可能不合适,可能错过模型的一些重要特性,从而导致仿真结果错误。所以Simulink发出一个警告,提醒用户注意这个问题。
怎样消除这个警告:
知道了原因和作用,如果你确定仿真结果可信,只是不想看到每次仿真都出来这样一个讨厌的警告,那么也很简单,提供两种做法给你:
在前述仿真参数设置对话框中,求解器选项的最大步长(Max Step Size)设成一个明确的数而不是auto(随便什么数都可以,比如0.2)。
如果不改最大步长,那就简单屏蔽掉警告信息,这也有两种做法:
通过用户界面:从仿真参数设置对话框选择诊断选项卡(Diagnostics pane),然后设置Automatic solver parameter selection为none。
简单的用一个命令代替上述GUI操作:
set_param(gcs,'SolverPrmCheckMsg','none')
打这么多字不容易,如果满意,就采纳了给个好评吧。
⑦ simulink求解器solver的设置问题
出现这个警告信息的原因:在仿真参数设置对话框(ConfigurationParameters)中,求解器选项(Solveroptions)的最大步长(MaxStepSize)被设成“自动”(auto)。在这种情况下,离散求解器会使用最短采样时间作为最大步长,而连续求解器使用仿真起止时间的1/50作为最大步长。模型默认的开始时间是0,结束时间是10,所以其1/50就是0.2秒。警告的作用:关于最大步长最大步长是Simulink求解器按时间进行步进时所允许的最大步长——注意,这是对变步长(Variable-step)求解器而言的(你的模型出现这样的提示,肯定是变步长求解器)。如果选择的是定步长(Fixed-step)求解器,参数设置对话框里面有一个类似的项是Fixedstepsize(fundamentalsampletime),同样可以设置为auto,也会导致类似(但不完全相同)的警告。警告的作用按照上面所说的自动步长设置规则,你新建一个模型,默认的求解器是变步长的,而默认的最大步长是auto,这样的参数设置对于多数模型可能是适用的,但对于有些模型,这样的步长可能不合适,可能错过模型的一些重要特性,从而导致仿真结果错误。所以Simulink发出一个警告,提醒用户注意这个问题。怎样消除这个警告:知道了原因和作用,如果你确定仿真结果可信,只是不想看到每次仿真都出来这样一个讨厌的警告,那么也很简单,提供两种做法给你:在前述仿真参数设置对话框中,求解器选项的最大步长(MaxStepSize)设成一个明确的数而不是auto(随便什么数都可以,比如0.2)。如果不改最大步长,那就简单屏蔽掉警告信息,这也有两种做法:通过用户界面:从仿真参数设置对话框选择诊断选项卡(Diagnosticspane),然后设置为none。简单的用一个命令代替上述GUI操作:set_param(gcs,'SolverPrmCheckMsg','none')打这么多字不容易,如果满意,就采纳了给个好评吧。
⑧ 最速下降法 步长
最速下降法是以负梯度方向作为极小化算法的下降方向,又称为梯度法,是无约束最优化中最简单的方法。
从点x1 沿着最速下降方向d,以步长λ到达点x2,数学上可以写为x2 = x1 + λ*d。这里的d的表达式已经从理论给出,那么问题就变成,寻找合适的λ使得目标函数值 f(x1+λ*d)最小,这本身又是一个最小化问题。
通常所谓的迭代算法,就是指,在某一个给定误差范围内,通过迭代关系 x(k +1)=x(k)+λ(k)*d(k)分别求解相应的 λ(k)和d(k)的过程。当然,每一步求解的x(k +1)都必须在约束范围内。
简单说来就是由起点x(k),方向d(k),步长λ(k)求出下一点x(k +1),然后将x(k +1)代回原方程,原方程变为一个关于步长λ的方程,求解方程最小时的λ值,即方程关于λ求导,等于0时的λ值。
⑨ 两个不同算法的simulink系统合并之后如何确定新的算法
首先,你所说的Fixed-step不管是dscrete还是ode4,它不叫算法,它是求解器(Solver)的类型名称。也就是你在Simulink里面用框图设计好了你的模型以后,Simulink就使用你所设置的求解器来计算你的模型。
continuous states存在,是你模型本身的属性,并不是错误。它只是在提醒你所设置的求解器跟模型属性不匹配而已。
另外,如果是SimPowersystem搭建的模型,应该是在POWERGUI设置求解器吧。configuration页面里就用默认的变步长求解器ode23t呗
⑩ 最速下降法求解,用matlb做,但是不能直接用里面的函数,里面的epsilon是终止误差,不是步长,谢谢~
%预分配数组空间提高效率
x1 = zeros(1,10000); x2 = zeros(1,10000);
fval = zeros(1, 10000);
% x1,x2的初始值
x1(1) = 4; x2(1) = 4;
% 计算f初值
fval(1) = 2*x1(1)^2+0.3*x2(1)^2;
% 步长控制
step = 0.1;
% 精度控制
epsilon = 0.01;
i = 2; % 迭代计数
while 1
dir1 = 4*x1(i-1); % f对x1的偏导数
dir2 = 0.6*x2(i-1); % f对x2的偏导数
dir = sqrt(dir1^2+dir2^2); % 梯度向量的模
if (dir < 1) % 在梯度向量的模较小时,不再归一化以提高精度
dir = 1;
end;
x1(i) = x1(i-1)-step*dir1/dir; % 新的x1
x2(i) = x2(i-1)-step*dir2/dir; % 新的x2
fval(i) = 2*x1(i)^2+0.3*x2(i)^2;
if(abs(fval(i) - fval(i-1)) < epsilon)
break;
end;
i=i+1;
end;
x1 = x1(1:i-1);
x2 = x2(1:i-1);
fval = fval(1:i-1);
% 可视化
X=-5:0.05:5;
Y=-5:0.05:5;
[X,Y] = meshgrid(X,Y);
Z = 2*X.^2+0.3*Y.^2;
surf(X,Y,Z);
shading interp
hold on;
plot3(x1, x2, fval, 'linewidth', 2, 'color', 'black');
hold off;
xlabel('x_1', 'fontsize', 16);
ylabel('x_2', 'fontsize', 16);
set(gca, 'fontsize', 12);