• 数学建模——微分方程


    目录

    常微分方程符号解

    常微分方程的数值解

    初值问题

    边值问题

     其他


    常微分方程符号解

     diff(函数,n)%求函数的n阶导数

    dsolve(方程1,方程2,...,方程n,初始条件,自变量)

    simplify(s) 对表达式s进行化简

    1. clc,clear
    2. syms y(x);
    3. dy = diff(y);
    4. s1 = dsolve((1-x)*diff(y,2)==sqrt(1+dy^2)/5,y(0)==0,dy(0)==0,x)
    5. simplify(s1)

    1. clc,clear
    2. syms y(x);
    3. out = dsolve(diff(y)==-2*y+2*x^2+2*x,y(0)==1)

    1. clc,clear
    2. syms y(t);%同时声明了y和t
    3. dy=diff(y);d2y=diff(y,2);d3y=diff(y,3);%定义导数是为了后面幅值
    4. u =exp(-t)*cos(t);
    5. y = dsolve(diff(y,4)+10*diff(y,3)+35*diff(y,2)+50*diff(y)+...
    6. 24*y==diff(u,2),y(0)==0,dy(0)==-1,d2y(0)==1,d3y(0)==1)

    1. clc,clear
    2. syms x(t) [3,1];%定义符号向量函数,x(t)后面要有空格
    3. A = [3,-1,1;2,0,-1;1,-1,2];%定义系数矩阵
    4. [s1,s2,s3]=dsolve(diff(x)==A*x,x(0)==[1;1;1])

    常微分方程的数值解

    初值问题

    一阶微分方程初值问题的一般格式:

    常用ode45进行求解,有两种调用格式

     fun是匿名函数,tspan=[t0,tfinal]是求解区间,y0是初值,t、y是所求区间的对应点和该点的函数值,s是一个结构数组。tspan的t0必须是初始条件中自变量的取值,tfinal可以比t0小。利用函数deval可以计算区间内任意点的函数值:

    y = deval(s,x);

     例子:

    1. clc,clear,close all
    2. syms y(x);
    3. %求符号解
    4. y = dsolve(diff(y)==-2*y+2*x^2+2*x,y(0)==1)
    5. %求数值解
    6. dy = @(x,y)-2*y+2*x^2+2*x;%匿名函数第一个应该是自变量,第二个是因变量
    7. [sx,sy]=ode45(dy,[0,0.5],1);
    8. fplot(y,[0,0.5])%画符号解的图像
    9. hold on
    10. plot(sx,sy,'*')%画数值解的图像
    11. legend('符号解','数值解')

    matlab不能求高阶微分方程,必须化为一阶微分方程组

    例子:

    应该先化为一阶微分方程组:

    1. clc,clear,close all
    2. dy = @(x,y)[y(2);sqrt(1+y(2)^2)/5/(1-x)];
    3. [x,y]=ode45(dy,[0,0.999999],[0;0]);
    4. plot(x,y(:,1))

    1. clc,clear,close all
    2. m = 2;
    3. df = @(x,f,m)[f(2);m*f(2)-f(1)+exp(x)];%注意是列向量
    4. s1 = ode45(@(x,f)df(x,f,m),[0,1],[1;-1]);
    5. s2 = ode45(@(x,f)df(x,f,m),[0,-1],[1;-1]);
    6. fplot(@(x)deval(s1,x,1),[0,1],'-ok');hold on
    7. fplot(@(x)deval(s2,x,1),[-1,0],'-*k');

     只能求取一阶,所以定义两个未知数,ode45参数初值必须是第二个参数左端值对应的函数值,初值对应横轴0,所以将坐标范围分解为[0,-1],[0,1]。匿名函数可以有三个参数,但ode45函数里需重新定义匿名函数,只能有两个形参。

    边值问题

    初值问题指定解条件的自变量是同一个点

     边值问题指定解条件的自变量是多个点

     该问题的微分方程标准形式:

     

     bc指边界条件,边界条件中自变量的取值也是求解的区间,即求解区间为[a,b],p值有关的参数

    相关函数:

    sol = bvp4c(odefun,bcfun,solinit,options,p1,p2,…)

    odefun 函数为微分方程的函数句柄。bcfun 函数为微分方程的边界条件句柄,将边界条件所有项移到左边,右边为0。solinit为包含初始估计解的结构体,应使用bvpinit函数创建,solinit=bvpinit(x,y),x向量为初始网格的排序节点,应满足边界条件a= solinit.x(1)且b =solinit.x(end),向量y为初始估计解,solinit.y(:,i)为在solinit.x(i)节点处的初始估计解。输出参数sol 为包含数值解的一个结构:

     为使曲线变得更光滑,需要在中间插入一些点,可以使用deval函数。

    例子:

     化为一阶微分方程组:

     作为初始猜测解,可以随便取

    1. clc,clear,close all
    2. solinit = bvpinit(linspace(-1,1,20),@dropinit);
    3. sol = bvp4c(@drop,@dropbc,solinit)
    4. fill(sol.x,sol.y(1,:),[0.7 0.7 0.7]);
    5. axis([-1 1 0 1]);
    6. function yprime = drop(x,y) %微分方程组
    7. yprime = [y(2),(y(1)-1)*(1+y(2)^2)^(3/2)];end
    8. function res = dropbc(ya,yb)%边界条件
    9. res = [ya(1);yb(1)];end %y(1)表示y的0阶导,y(2)表示一阶导数,ya表示左边界,意思是ya(1)=0
    10. function yinit = dropinit(x)%猜测函数
    11. yinit = [x.^2,2*x];end

     例子:

     化为一阶微分方程组:

     

    1. clc,clear
    2. eq = @(x,y,mu)[y(2),-mu*y(1)];%一阶方程组
    3. bd = @(ya,yb,mu)[ya(1);ya(2)-1;yb(1)+yb(2)];%边值条件
    4. guess = @(x)[sin(2*x);2*cos(2*x)];%猜测解
    5. guess_structure = bvpinit(linspace(0,1,10),guess,5);
    6. sol = bvp4c(eq,bd,guess_structure);
    7. plot(sol.x,sol.y(1,:),'-',sol.x,sol.yp(1,:),'--')

     其他

    fminbnd用于查找单变量函数在定区间上的最小值

  • 相关阅读:
    百万长链接优化建议
    【Flink实战】用户统计:按照省份维度统计新老用户
    爱奇艺:基于龙蜥与 Koordinator 在离线混部的实践解析 | 龙蜥技术
    山海鲸智慧工厂:制造业数字化的风向标
    力扣—最长回文子串
    数据结构-树(Tree)
    windows10下安装fbprophet及使用虚拟环境
    IDEA 中 Maven 报错 Cannot resolve xxx【终于解决了】
    亚马逊云科技发布完整端到端 AI 技术堆栈,力促生成式 AI 更加普惠
    如何决定在创建利基(niche)站时选择中文站还是英文站
  • 原文地址:https://blog.csdn.net/m0_51311105/article/details/125837780