了解odeset函数
一、odeset函数
Matlab的ode求解器是用于解决常微分方程组(ODE)的函数。odeset函数可以使用户控制其中大多数选项的值。这个函数返回一个structure。Odset结构体可以在ODE求解器中作为参数使用。ODE求解器采用Odset中指定的选项的值。用法如下:
options = odeset('Name1',value1,'Name2',value2,...)
options就是返回的structure,Name1,value1等为其可选项与值。
如下的代码段,指定sine函数的初值问题求解器ode15s的舍入误差容忍值为1e-3,绝对误差容忍度为1e-6,并绘制结果:
tspan = [0,10];
y0 = 0;
options = odeset('RelTol',1e-3, 'AbsTol', 1e-6);
[t,y] = ode15s(@(t,y) sin(t),tspan,y0,options);
plot(t,y)
二、odeset控制步长
在ODE的数值解法中,步长是决定数值稳定性和解的精度的因素之一。ODE求解器用绝对误差、相对误差和几个事件等条件进行调整。设步长和状态的修改发生在离散块中的固定时刻;当状态改变时调用事件函数。ODE求解器使用odeset函数返回的选项结构来设置绝对和相对误差容忍度、与事件相关的参数等值。下面的代码演示使用options参数重式调整求解器ode45的默认步长:
tspan = [0,10];
y0 = [1,0];
options = odeset('RelTol', 1e-6, 'AbsTol',1e-10,'MaxStep',0.1);
[t,y] = ode45(@odefcn,tspan,y0,options);
function dydt = odefcn(t,y)
dydt = [y(2); -y(1)];
end
MaxStep选项是指定最大步长,ode45设置的默认步长为0.1左右。
三、odeset中的reltol
相对最大误差范围,定义为 abs(当前步长计算的值-olsolve函数返回的值) / max(atol,abs(当前计算的值)* reltol)。定下来的认识是在与客观测量数据进行比较时,如果求解器成功误差要小于设定的容忍范围,否则算法就继续迭代并重新计算相应的步长在线性求解器中,误差通常按照量表T,解向量Y和时间变量T进行测量,通过向量来测量误差。ODE45中reltol默认值是1e-3:
tspan [0,30];
y0 = [2 0];
options = odeset('RelTol',1e-2);
[t,y] = ode45(@odefcn,tspan,y0,options);
function dydt = odefcn(t,y)
dydt = [y(2); -y(1)];
end
四、ode to,odeset两个events耦合怎么写
如果您要在多个例程中使用odeset选项,则可以创建一个options结构,然后将它传递给每个例程:
options = odeset('RelTol',1e-3);
[t1,y1] = ode45(@odefcn,tspan,y0,options);
[t2,y2] = ode23(@odefcn,tspan,y0,options);
它可以帮助改变相同的相对误差,即尽管它的默认值不同。在ODE求解器中支持事件函数(式)。您可以在特定的时间进入或离开事件。每次输入事件函数时,必须告诉ODE求解器是否计算相应的事件。 如果计算相应的事件,则必须提供一个组成向量的事件结果和指示哪个事件被触发的事件检测向量。最后,您必须告诉ODE求解器下一个时间段的结束时间。下面的示例展示了如何使用“ode23”甚至偶数次方运行情况:
tspan = [0 10];
y0 = 1;
[D,c] = ode23(@ode1,tspan,y0,odeset('events',@ode2));
plot(D,c),xlabel('Time'),ylabel('Solution')
function dy = ode1(t,y)
dy = y;
end
function [value,isterminal,direction] = ode2(t,y)
value = mod(t,2) == 0; % 奇数次方
isterminal = false; %不终止迭代器
direction = 0; % 无方位可指定
end
五、odeset matlab
对于不同的求解器和问题,ODE求解器有很多选项设置。在控制求解器行为方面,odeset函数是个非常重要的函数。Matlab函数库提供的ode45、ode23、ode113、ode15s等都适用odeset函数,它们都包含多个选项和值。以下是一个示例,其中设定求解器ode45的初始步长为0.01,佣金步长为0.1,相对容错为1e-6的绝对容错为1e-10:
tspan = [0,10];
y0 = [2,2];
options = odeset('IntialStep',0.01,'MaxStep',0.1,'RelTol',1e-6,'AbsTol',1e-10);
[t,y] = ode45(@(t,y) [y(2) ; -y(1)],tspan,y0,options);
plot(t,y(:,1))
六、ode to you
ODE(Ordinary Differential Equation)是指普路伐斯微分方程,大学数学中的常微分方程概念。数学家们对ODE这个领域做了很多研究,除了很多解析方法,还有很多数值求解器。比如一些经典的方法:欧拉法、改进欧拉法、龙格库塔法(RK)等,它们都能帮助我们求解ODE问题,但是数值精度和时间效率不同。ode45函数是在所有数值求解器中精度和时间效率均衡的算法。因此,ode45是求解ODE问题的函数,类似的函数还有:ode15s、ode23、ode23tb、ode113等。
七、ode to joy
在ODE求解器中,ode45函数用于求解常微分方程组,下面是一个关于ode45函数求解简单双摆的例子:
%简单双摆
tspan=[0,70]; % 时间范围
y0=[0,pi/2,pi/2,0]; %初值
[t,y] = ode45(@fxy,tspan,y0); % 返回时间刻度“t”和值“y”
%绘制红色线条
line([0 2*sin(y(1,1))],[0 -2*cos(y(1,1))],'color','r') %摆锤1
hold on
line([2*sin(y(1,1)) 2*sin(y(1,1))+2*sin(y(1,2))],[-2*cos(y(1,1)) -2*cos(y(1,1))-2*cos(y(1,2))],'color','r') %摆锤2
axis([-3 3 -3 3]); % 绘图区间
whitebg('w'); % 背景颜色
box('on') % 绘制边界
title('Double Pendulum') % 标题
xlabel('x (m)') % x轴标签
ylabel('y (m)') % y轴标签
% 第一列与第三列
function dy = fxy(t,y)
g=9.8; % 重力加速度
l = 2; % 摆杆长
dy=zeros(4,1);
dy(1)=y(2);
dy(2)=(-g*2*sin(y(1))-2*sin(y(1)-y(3))*((y(4)^2)+(y(2)^2)*cos(y(1)-y(3))))/(2-l*cos(y(1)-y(3))^2);
dy(3)=y(4);
dy(4)=(2*sin(y(1)-y(3)))*((y(2)^2)+(2*g*cos(y(1))) +(y(4)^2)*cos(y(1)-y(3)))/(2-l*cos(y(1)-y(3))^2);
八、ode to a nightingale
Matlab的ode求解器是用于解决常微分方程组(ODE)的函数,odeset函数可以使用户控制选项的值。ode生态系统中有一个很大的工具箱,可以轻松解决大多数的ODE问题。ond45是其中一种求解器,能够顺利解决大多数的知名ODE问题。
以下是ode45函数的代码实现:
tspan = [0,10]; %时间范围
y0 = [1, 0]; % 初值
options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-5]); %选项
[t,y] = ode45(@model,tspan,y0,options); % 函数调用
function dydt = model(t,y)
dydt = zeros(2,1);
dydt(1) = y(2);
dydt(2) = -4*y(1) - 2*y(2);
end
plot(t,y(:,1))