tic
代码
toc
用于计算代码运行时间
用于解微分方程
y=dsolve('m*D2y+k*y=0','x') //无初始条件
y=dsolve('m*D2Y+k*y=0','Dy(0)=0','y(0)=x0','x') //有初始条件
** 注:D必须大写,如果需要解方程组则
[y1,y2]=dsolve('m*D2Y+k*y=0','m*D2Y+k*x=0','x')
ode是Matlab专门用于解微分方程的功能函数。该求解器有变步长(variable-step)和定步长(fixed-step)两种类型。不同类型有着不同的求解器,具体说明如下图。
[引用于https://blog.csdn.net/lynn15600693998/article/details/86597068]
龙格算法会产生龙格现象,使某一部分的数值产生较大误差,Admas方法属于多步法,计算相对复杂,但精度会高一些,而梯形算法的精度较低,一般不建议使用,想利用梯形算法的话可以采用精度较高的复化Cotes公式或复化Simposon公式,想了解的可以参考数值分析方法
一般而言,我们会先采用od45,即龙格算法来计算微分方程,如果计算时间较长或者失败,可以考虑刚性求解,一般先采用ode15s
1)ode45的函数格式
[T,Y] = ode45(@function,tspan,y0)
[T,Y] = ode45(@function,tspan,y0,options)
[T,Y,TE,YE,IE] = ode45(@function,tspan,y0,options)
sol = ode45(@function,[t0 tf],y0…)
其中: function是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名;
tspan 是求解区间 [t0 tf],或者一系列散点[t0,t1,…,tf],采用一系列散点只会返回相应的点的值;
y0 是初始值向量;
options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等
T返回列向量的离散点;
Y 返回对应T的求解列向量;
TE 事件发生时间
YE 事件发生时之答案
IE 事件函数消失时之指针i
在进行ode计算时,需要首先对微分方程进行变量转换,需要将微分方程转换先转换为显示微分方程
下面以实例来说明转换步骤
Step 1
将微分方程的最高项移动到等式右边,然后将其他项都放在等式右边
如:
微分方程1:
需要转换为
Step2
为除最高阶外的多项式选择相应的状态参量
针对上述方程式:
x’’‘无需选择状态参量
其余参数状态参量分别为
x0=x;
x1=x’;
x2=x’’;
Step3
根据上述参量及原微分方程写出新的一阶状态参量表达式
x0‘=x1;
x1’=x2;
x2’=1/a(x2+3x1-5x-3);
利用转换好的状态参量表达式来写function,然后采用ode45计算
针对原子自发辐射的经典模型,考虑辐射对电子的反作用力,可以得出电子的运动方程为
m为电子质量
x为电子偏离平衡位置的位移
w0为谐振频率
γ称为经典阻尼系数
e为电荷量
ε0为真空介电常数
c为光速
针对上述简谐振子模型,进行ode中Function的编写
function x=harmonicOscillator(y,t)
r=2;
w0=3;
% r 为经典辐射阻尼系数,wo为谐振频率,此时随意赋了两个值
x=[ t(2);
-r*t(2)+w0*t(1)];
end
x0=[1,0]; % 随意赋得初值
options=odeset('RelTol',1e-8);
tic
[t,xt1]=ode45(@harmonicOscillator,[0,20],x0,options)
toc
plot(xt1(:,1),t);
diff()函数是Matlab的符号函数求导。
diff()使用说明:
diff(S,‘v’)——对表达式S中指定符号变量v,计算S的一阶导数
diff(S,‘v’,n)——对表达式S中指定符号变量v,计算S的n阶导数
diff()应用实例
对于显函数的导数,如y=6x3-4x2+x-5
diff('6x^3-4x^2+x-5') %求y的一阶导数
diff('6x^3-4x^2+x-5',2) %求y的二阶导数
对于隐函数的导数,如z=sin(x2)*y2
syms x y
diff(sin(x^2)*y^2,2) %求z对x的二阶偏导数
对于参数方程的导数,如y=1-t4,x=1+t2
syms x y t
dy=diff(1-t^4) %求y对t的一阶导数
dx=diff(1+t^2) %求x对t的一阶导数
dydx=dy/dx
t=sqrt(x-1),eval(dydx) %求y对x的一阶导数
参考文档1