Matlab使用杂谈1-微分方程求解及函数求导

Matlab使用杂谈1-微分方程求解及函数求导

  • 计时代码
    • tic toc 计时器
  • 微分方程求解
    • dsolve函数
    • ODE解微分方程
      • ode45的具体使用
      • Function实例编写
      • ode45求偏微分方程
  • 函数求导
  • 参考文献

计时代码

tic toc 计时器

tic
代码
toc
用于计算代码运行时间

微分方程求解

dsolve函数

用于解微分方程

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解微分方程

ode是Matlab专门用于解微分方程的功能函数。该求解器有变步长(variable-step)和定步长(fixed-step)两种类型。不同类型有着不同的求解器,具体说明如下图。
Matlab使用杂谈1-微分方程求解及函数求导_第1张图片[引用于https://blog.csdn.net/lynn15600693998/article/details/86597068]
龙格算法会产生龙格现象,使某一部分的数值产生较大误差,Admas方法属于多步法,计算相对复杂,但精度会高一些,而梯形算法的精度较低,一般不建议使用,想利用梯形算法的话可以采用精度较高的复化Cotes公式或复化Simposon公式,想了解的可以参考数值分析方法
一般而言,我们会先采用od45,即龙格算法来计算微分方程,如果计算时间较长或者失败,可以考虑刚性求解,一般先采用ode15s

ode45的具体使用

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计算

Function实例编写

针对原子自发辐射的经典模型,考虑辐射对电子的反作用力,可以得出电子的运动方程为
在这里插入图片描述
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

ode45求偏微分方程

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

你可能感兴趣的:(Matlab杂谈)