matlab中微分方程的求解

1、求解一阶微分方程

clc,clear

dy=@(t,y)y*sin(t)+cos(t);%定义微分方程右端项的匿名函数

s=ode45(dy,[0,10],1)     %求微分方程的数值解,返回一个结构体

t0=1:10;y0=deval(s,t0)   %计算对应的函数值

plot(t0,y0)              %画方程的数值解图形

首先是句柄@的使用:https://blog.csdn.net/sinat_38816924/article/details/82193167

接着是ode45的使用:https://ww2.mathworks.cn/help/matlab/ref/ode45.html?searchHighlight=ode45&s_tid=doc_srchtitle

[t,y] = ode45(odefun,tspan,y0)

sol = ode45(___)

odefun - 要求解的函数函数句柄,指定为指向待积分函数的句柄。

tspan - 积分区间向量。求解器在 tspan(1) 施加初始条件 y0,并求 tspan(1)tspan(end) 的积分。即,向量的起始必须是初始条件。

y0 - 初始条件向量

sol - 用于计算的结构体结构体数组

再接着是deval函数

y = deval(sol,x)

y = deval(___,idx)

y = deval(sol,x)y = deval(x,sol) 可以计算 x 中包含的点处的微分方程问题的解 sol

y = deval(___,idx) 只返回带有向量 idx 中所列索引的解分量。您可以使用前面列出的任一输入参数组合。

2、求解二阶线性微分方程

clear
dy=@(x,y)[ y(2);2*y(2)-y(1)+exp(x)];

s0=ode45(dy,[0,1],[1;-1]);%注意,这里是【0,1】,从初始条件0开始
t0=0:0.05:1;
y0=deval(s0,t0,1);
plot(t0,y0,'-o')
hold on

s1=ode45(dy,[0,-1],[1;-1]);%注意,这里是【0,-1】,从初始条件0开始
t1=-1:0.05:0;
y1=deval(s1,t1,1);
plot(t1,y1,'-*')

还有另一种方法

syms y(x);%建立符号函数
dy=diff(y);
y=dsolve(diff(y,2)-2*diff(y)+y==exp(x),y(0)==1,dy(0)==-1);
ezplot(y,[-1,1])

首先是syms函数:https://ww2.mathworks.cn/help/symbolic/syms.html?searchHighlight=syms&s_tid=doc_srchtitle

还有diff函数:https://ww2.mathworks.cn/help/matlab/ref/diff.html?searchHighlight=diff&s_tid=doc_srchtitle

接着是dsolve函数:https://ww2.mathworks.cn/help/symbolic/dsolve.html?searchHighlight=dsolve&s_tid=doc_srchtitle

syms s(t) f(x,y)%创建符号函数

diff-差分和近似导数

Y = diff(X)计算沿大小不等于 1 的第一个数组维度的 X 相邻元素之间的差分:

Y = diff(X,n)通过递归应用 diff(X) 运算符 n 次来计算第 n 个差分。在实际操作中,这表示 diff(X,2)diff(diff(X))    相同。

dsolve-微分方程和系统解算器

S = dsolve(eqn)解决了微分方程 eqn,在那里 eqn是一个象征性的方程。使用 diff ==表示微分方程。例如, diff(y,x) == y代表了方程 dy/dx=y解决一个微分方程组通过指定 eqn作为一个向量的方程。

S = dsolve(eqn,cond)解决了 eqn初始和边界条件cond

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/82352393