编程手之数学建模学习——微分方程

分为符号解和数值解。

符号解是精确的,可以表示为表达式或函数;

数值解使用离散的数值数据来近似微分方程的解;

一、符号解求解

微分方程求解符号解:

采用dsolve函数:

clc, clear, syms y(x)  %定义符号函数y,自变量为x
dy=diff(y);  %定义y的一阶导数,目的是下面赋初值
y=dsolve(diff(y,2)-2*diff(y)+y==exp(x), y(0)==1, dy(0)==-1)

微分方程组求解符号解:

矩阵形式(一阶微分方程组)

clc,clear
syms x(t)  [3,1]  %定义符号向量函数,x(t)后面有空格
A=[1,0,0;2,1,-2;3,2,1]; B=[0;0;exp(t)*cos(2*t)];
x0=[0;1;1]; %初值条件
[s1,s2,s3]=dsolve(diff(x)==A*x+B,x(0)==x0) %求符号解

 组合形式(高阶微分方程组)

clc,clear, syms f(x) g(x)  %定义符号函数
df=diff(f);  %定义f的一阶导数
[s1,s2]=dsolve(diff(f,2)+g-2==1, diff(g)+diff(f)==1,...
        df(1)==0, f(0)==0, g(0)==0)

二、数值解求解(重点)

初值问题求解数值解:

 ode45的调用 (必须转为一次方程组)

clc, clear, close all
dy=@(x,y)[y(2); sqrt(1+y(2)^2)/5/(1-x)];
[x,y]=ode45(dy,[0,0.999999],[0;0])
plot(x, y(:,1)), xlabel('$x$','Interpreter','Latex')
ylabel('$y$','Interpreter','Latex','Rotation',0)

 deval函数确定特定点上的值

这里的s也就是前面ode45得到的y和s。

 边值问题求解数值解:

给出自变量区域边界的函数值,求解微分方程的数值解。

采用bvpinit函数给出初始猜测解具体数值,采用bvp4c计算数值解。

bvpinit(自变量取值,猜测符号解);bvp4c(一阶微分方程组,边值条件,猜测初始解具体数值)

clc, clear
eq=@(x,y,mu)[y(2);-mu*y(1)]; %定义一阶方程组的匿名函数
bd=@(ya,yb,mu)[ya(1);ya(2)-1;yb(1)+yb(2)];  %定义边值条件的匿名函数
guess=@(x)[sin(2*x);2*cos(2*x)]; %定义初始猜测解的匿名函数
guess_structure=bvpinit(linspace(0,1,10),guess,5); %给出初始猜测解的结构,mu=5
sol=bvp4c(eq,bd,guess_structure); %计算数值解
plot(sol.x, sol.y(1,:), '-', sol.x, sol.yp(1,:), '--', 'LineWidth',2)
xlabel('$x$','FontSize',12,'Interpreter','Latex')
ylabel('$y$','FontSize',12,'Interpreter','Latex','Rotation',0)
legend('$y_1$','$y_2$','Interpreter','Latex')

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值