精华内容
下载资源
问答
  • 我正在尝试使用Matlab中的函数ode45来解决具有三个微分方程的系统 . 我真的不明白我得到的错误,我可以用一些帮助来理解我做错了什么 .微分方程如下:F1 = -k1y1+k2(y2-y1)F2 = -k2(y2-y1)+k3(y3-y2)F3 = -k3(y3-y2)...

    我正在尝试使用Matlab中的函数ode45来解决具有三个微分方程的系统 . 我真的不明白我得到的错误,我可以用一些帮助来理解我做错了什么 .

    微分方程如下:

    F1 = -k1y1+k2(y2-y1)

    F2 = -k2(y2-y1)+k3(y3-y2)

    F3 = -k3(y3-y2)

    而我在Matlab中的代码是这样的:

    function dz = kopplad(t, z)

    global m1 m2 m3 k1 k2 k3

    dz = [z(2)

    -k1*z(1)/m1 + k2*(z(2)-z(1))/m1

    z(4)

    -k2*(z(2)-z(1))+k3(z(3)-z(2))/m2

    z(6)

    -k3(z(3)-z(2))/m3];

    global m1 m2 m3 k1 k2 k3

    m1 = 0.75; m2 = 0.40; m3 = 0.65;

    k1 = 0.85; k2 = 1.1; k3 = 2.7;

    [t, z] = ode45(@kopplad, [0, 50], [0 -1 0 1 0 0]);

    plot(t, z(:,1))

    hold on

    plot(t,z(:,3),'--')

    plot(t,z(:,5),'*')

    legend('y_1', 'y_2', 'y_3');

    hold off

    我收到的错误如下:

    尝试访问k3(1.00002); index必须是正整数或逻辑 . kopplad中的错误(第3行)dz = [z(2)ode45中的错误(第262行)f(:,2)= feval(odeFcn,t hA(1),yf * hB(:,1),odeArgs {: }); diffekv中的错误(第6行)[t,z] = ode45(@ kopplad,[0,50],[0 -1 0 1 0 0]);

    展开全文
  • ode45解微分方程

    千次阅读 2020-08-19 13:12:18
    %常微分方程公式 end - [ example 2] % 表示该方程组 m = 1; dy = @(t, y)[y(2); (5 - y(2)*exp(y(1)) + y(1)^2)/m]; y0=[1;-10]; tspan = [0, 5]; % m = 1,质量为1 [t_m_1, y_m_1] = ode45(dy, tspan, y0); % m = ...

    适用非刚性方程

    [T,Y] = ode45(odefun,tspan,y0)
    解算 y′=f(t,y) 形式的方程组
    [t,y] = ode45(odefun,tspan,y0,options) 还使用由 options(使用 odeset 函数创建的参数)定义的积分设置。例如,使用 AbsTol 和 RelTol 选项指定绝对误差容限和相对误差容限

    odefun 是函数句柄,可以是函数文件名,或匿名函数句柄
    tspan是区间[t0 tf] 或者一系列时间散点[t0,t1,…,tf]
    y0是初始值向量
    T返回列向量的时间点
    Y返回对应T的求解列向量
    生成的输出即为时间点 t 的列向量和解数组 y。y 中的每一行都与 t 的相应行中返回的时间相对应。y 的第一列与 y 1 y_1 y1 相对应,第二列与 y 2 y_2 y2 相对应。

    ode45 仅适用于使用两个输入参数(t 和 y)的函数。但是,可以通过在外部定义参数并在指定函数句柄时传递这些额外参数。

    A = 1;
    B = 2;
    tspan = [0 5];
    y0 = [0 0.01];
    [t,y] = ode45(@(t,y)[y(2);(A/B)*t.*y(1)], tspan, y0);
    plot(t,y(:,1),'-o',t,y(:,2),'-.')
    

    - [example 1]

    function Testode45
    tspan=[3.9 4.0]; %求解区间
    y0=[8 2]; %初值
    [t,y]=ode45(@odefun,tspan,y0);
    plot(t,y(:,1),'-o',t,y(:,2),'-*')
    legend('y1','y2')
    title('y"=-t*y + e^t*y"+3sin2t')
    xlabel('t')
    ylabel('y')
    end
    function dx=odefun(t,x)
    dx=zeros(2,1); % 列向量
    dx(1)=x(2);
    dx(2)=-t*x(1)+exp(t)*x(2)+3*sin(2*t); %常微分方程公式
    end
    

    tspan=[3.9 4.0]; %求解区间
    y0=[8 2]; %初值
    [t,y]=ode45(@(t,y)[y(2);-t*y(1)+exp(t)*y(2)+3*sin(2*t)],tspan,y0);
    plot(t,y(:,1),'-o',t,y(:,2),'-*')
    legend('y1','y2')
    title('y"=-t*y + e^t*y"+3sin2t')
    xlabel('t')
    ylabel('y')
    

    tspan=[3.9 4.0]; %求解区间
    y0=[8 2]; %初值
    fcn=@(t,y)[y(2);-t*y(1)+exp(t)*y(2)+3*sin(2*t)];
    [t,y]=ode45(fcn,tspan,y0);
    plot(t,y(:,1),'-o',t,y(:,2),'-*')
    legend('y1','y2')
    title('y"=-t*y + e^t*y"+3sin2t')
    xlabel('t')
    ylabel('y')
    

    - [ example 2]

    % 表示该方程组
    m = 1;
    dy = @(t, y)[y(2); (5 - y(2)*exp(y(1)) + y(1)^2)/m];
    y0=[1;-10];
    tspan = [0, 5];
    
    % m = 1,质量为1
    [t_m_1, y_m_1] = ode45(dy, tspan, y0);
    % m = 2质量为2
    m = 2;
    dy = @(t, y)[y(2); (5 - y(2)*exp(y(1)) + y(1)^2)/m];
    [t_m_2, y_m_2] = ode45(dy, tspan, y0);
    
    % plot
    subplot(1, 2, 1);
    plot(t_m_1, y_m_1(:, 2));
    hold on
    plot(t_m_2, y_m_2(:, 2));
    title('dy/dt')
    legend('m=1','m=2')
    
    subplot(1, 2, 2);
    plot(t_m_1, y_m_1(:, 1));
    hold on
    plot(t_m_2, y_m_2(:, 1));
    title('y')
    legend('m=1','m=2')
    
    m = 1;
    y0=[1;-10];
    tspan = [0, 5];
    [t_m_1, y_m_1] = ode45(@(t, y)[y(2); (5 - y(2)*exp(y(1)) + y(1)^2)/m], tspan, y0);
    
    % m = 2
    m = 2;
    [t_m_2, y_m_2] = ode45(@(t, y)[y(2); (5 - y(2)*exp(y(1)) + y(1)^2)/m], tspan, y0);
    
    % plot
    subplot(1, 2, 1);
    plot(t_m_1, y_m_1(:, 2));
    hold on
    plot(t_m_2, y_m_2(:, 2));
    title('dy/dt')
    legend('m=1','m=2')
    subplot(1, 2, 2);
    plot(t_m_1, y_m_1(:, 1));
    hold on
    plot(t_m_2, y_m_2(:, 1));
    title('y')
    legend('m=1','m=2')
    
    展开全文
  • ode45解二阶微分方程

    千次阅读 2021-04-23 17:43:20
    (2)).*y(1)+0.0001*(1-y(2)).^2; dy2dx = -1e4*dy1dx + 3000*(1-y(2)).^2; f = [dy1dx; dy2dx]; 高阶微分方程odefile的编写求解: ......Runge... MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn?1 ? yn ? h 6 (k1 ? ...

    (2)).*y(1)+0.0001*(1-y(2)).^2; dy2dx = -1e4*dy1dx + 3000*(1-y(2)).^2; f = [dy1dx; dy2dx]; 高阶微分方程odefile的编写求解: ......

    Runge-Kutta法是常微分方程的一种经典解法 ? MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn?1 ? yn ? h 6 (k1 ? 2k2 ? 2k3 ? k4 ) k1 ? f (......

    Runge-Kutta法是常微分方程的一种经典解法 ? MATLAB 对应命令:ode45 四阶Runge-Kutta公式 h yn ?1 ? yn ? (k1 ? 2k 2 ? 2k3 ? k 4 ) 6 k1 ? ...

    ODE) 初值问题---给出初始值 边值问题---给出边界条件 与初值常微分方程解算有关的指令 ode23 ode45 ode113 ode23t ode15s ode23s ode23tb 一.解ODE的基......

    (tn1) 方法 的近似值 yn1 时只用到 tn , yn ,是自开始 Runge-Kutta法是常微分方程的一种经典解法 MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn1 yn h......

    (tn1) 的近似值 yn1 时只用到 tn , yn ,是自开始方法 Runge-Kutta法是常微分方程的一种经典解法 MATLAB 对应命令:ode45 四阶Runge-Kutta公式 yn1 yn h ......

    [dy1dx; dy2dx]; 高阶微分方程odefile的编写 求解: y&q...

    t ? 10 s 这是一个二阶微分方程组,可以引进变量 x 2 ? t ? ? x1 ? t ? ,由此 ODE 可以化成如下形式 本文参考 薛定宇《控制系统计算机辅助设计——......

    《MATLAB 语言及应用》 大作业姓名: 学号: 学院: 班级: 题目编号: 2013 年 10 月 13 4 阶 Runge-Kutta 法求解一阶常微分方程。一、 Runge-Kutta 法的数学......

    《MATLAB 语言及应用》 大作业姓名: 学号: 学院: 班级: 题目编号: 2013 年 10 月 13 4 阶 Runge-Kutta 法求解一阶常微分方程。一、 Runge-Kutta ......

    能熟练使用 dsolve 函数解析求解常微分方程; 3. 能熟练运用 ode45、ode15s 求解器分别数值求解非刚性和刚性常微分方程; 4. 学习用求解器来绘制相图的方法。 二......

    用字符串表示常微分方程,自变量缺省时为t,导数用 D表示微分。y的2阶导数用D2y表示,依此类推。 如何调用? [T,Y,TE,YE,IE]=solver('odefun',tspan,y0,......

    4.解微分方程的 MATLAB 命令 MATLAB 中主要用 dsolve 求符号解析解,ode45,ode23,ode15s 求数值解。 s=dsolve(‘方程 1’, ‘方程 2’,…,’初始条件 1’......

    常微分方程数值解 二、初值问题求解函数 2. 函数介绍函数 ode45 ode23 问题类型 精确度 非刚性 非刚性 中等 低 说明 采用算法为4-5阶Runge-Kutta法,大多数 ......

    ode15s 短 ode23tb 刚性 梯形算法;低精度 当精度较低时,计算 时间比 ode15s 短 说明:ode23、ode45 就是极其常用得用来求解非刚性得标准形式得一阶微分 方程......

    ode45 是极其常用的用来求解非刚性的标准形式的一阶微分 方程(组)的初值问题的解的 Matlab 常用程序,其中: ode23 采用龙格-库塔 2 阶算法,用 3 阶公式作误差......

    2.3. Euler 法实用性 从图可以看出来一阶方法精确度非常差,基本上是无法用到实际工程中的,因此显式和 隐式 Euler 法只是提供一种对微分方程求解的思想。从图......

    解增长 解衰减解振荡 29 MATLAB求常微分方程数值解的函数基于龙格-库塔法, MATLAB求常微分方程数值解 的函数,一般调用格式为: [t,y]=ode23('fname',tspan,......

    Matlab解微分方程 除了上述的已知ODE外,还须有起始条件 y0=y(x0)才能解方程式,即是在x=x0时, y(x)=y0。上述各个方程式 的解析解 (analytical solution) ......

    用Matlab求常微分方程的数值解 [t,x]=solver(’f’,ts,x0,options)自变 量值 函数 值 ode45 ode23 ode113 ode15s ode23s 由待解 方程写 成的m文件名......

    展开全文
  • matlab求解常微分方程组——dsolve与ode45

    千次阅读 多人点赞 2020-02-08 22:12:49
    本文主要介绍matlab中求解常微分方程(组)的dsolve和ode系列函数,并通过例子加深读者的理解。 一、符号介绍    D: 微分符号;D2表示二阶微分,D3表示...dsolve函数用于求常微分方程组的精确,也称为常...

    本文主要介绍matlab中求解常微分方程(组)的dsolveode系列函数,并通过例子加深读者的理解。

    一、符号介绍

       D: 微分符号;D2表示二阶微分,D3表示三阶微分,以此类推。

    二、函数功能介绍及例程

    1、dsolve 函数

    dsolve函数用于求常微分方程组的精确解,也称为常微分方程的符号解。如果没有初始条件或边界条件,则求出通解;如果有,则求出特解。

    1)函数格式  

    Y = dsolve(‘eq1,eq2,…’ , ’cond1,cond2,…’ , ’Name’)

    其中,‘eq1,eq2,…’:表示微分方程或微分方程组;

                ’cond1,cond2,…’:表示初始条件或边界条件;

                ‘Name’:表示变量。没有指定变量时,matlab默认的变量为t;

    2)例程

    例1.1(dsolve 求解微分方程)

    求解微分方程:

      

    在命令行输入: dsolve('Dy=3*x^2','x') ,摁下enter键后输出运行结果。

    例1.2(加上初始条件)

    求解微分方程:

    只需要在命令行添加初始条件即可,此时求出的即为方程的特解。可以看到上例中的C9变为了2。

    例2(dsolve 求解微分方程组)

    求解微分方程组: 

    由于x,y均为t的导数,所以不需要在末尾添加’t’。

    2、ode函数

    在上文中我们介绍了dsolve函数。但有大量的常微分方程,虽然从理论上讲,其解是存在的,但我们却无法求出其解析解,此时,我们需要寻求方程的数值解。

    怎么理解数值求解呢?数值分析是一门专门的学科,在此不过多介绍。我主要想通过一个简单的例子来向大家阐述数值求解的思想。

    比如,求解微分方程  。我们就可以转化为,那么。因此,我们可以通过迭代的方式来求解y。即可理解为步长

    ode是Matlab专门用于解微分方程的功能函数。该求解器有变步长(variable-step)和定步长(fixed-step)两种类型。不同类型有着不同的求解器,具体说明如下图。 

    非刚性ode求解命令

    求解器solver

    功能

    说明

    ode45

    一步算法:4、5阶龙格库塔方程:累计截断误差(Δx)^5

    大部分尝试的首选算法

    ode23

    一步算法:2、3阶龙格库塔方程:累计截断误差(Δx)^3

    适用于精度较低的情形

    ode113

    多步算法:Adams

    计算时间比ode45短

    刚性ode求解命令

    ode23t

    梯形算法

    适度刚性情形

    ode15s

    多步法:Gear’s反向数值微分:精度中等

    若ode45失效时,可以尝试使用

    ode23s

    一步法:2阶Rosebrock算法:精度低

    当精度较低时,计算时间比ode15s短

    ode23tb

    梯形算法:精度低

    当精度较低时,计算时间比ode15s短

    其中,ode45求解器属于变步长的一种,采用Runge-Kutta算法;其他采用相同算法的变步长求解器还有ode23。ode45表示采用四阶-五阶Runge-Kutta算法,它用4阶方法提供候选解,5阶方法控制误差,是一种自适应步长(变步长)的常微分方程数值解法,其整体截断误差为(Δx)^5。解决的是Nonstiff(非刚性)常微分方程。

    ode45是解决数值解问题的首选方法,若长时间没结果,应该就是刚性的,可换用ode15s试试。

    下面将以ode45为例具体介绍函数的使用方法。

    1)函数格式  

    [T,Y] = ode45(‘odefun’,tspan,y0)

    [T,Y] = ode45(‘odefun’,tspan,y0,options)

    [T,Y,TE,YE,IE] = ode45(‘odefun’,tspan,y0,options)

    sol = ode45(‘odefun’,[t0 tf],y0...)

    其中: odefun是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名;

              tspan 是求解区间 [t0 tf],或者一系列散点[t0,t1,...,tf];

              y0 是初始值向量

              T 返回列向量的时间点

              Y 返回对应T的求解列向量

              options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等

               TE 事件发生时间

               YE 事件发生时之答案

                IE 事件函数消失时之指针i

    2)微分方程标准化

    利用ode45求解高阶微分方程时,需要做变量替换。下面说明替换的基本思路。

    微分方程为

     

    初始条件

     

    首先做变量替换 

    原微分方程可以转换为下面的微分方程组的格式:

    下面就可以利用转换好的微分方程组来编写odefun函数。

    3)例程

    例3.1(编写odefun函数)

     

    在matlab中新建脚本文件,编写函数如下:

    本例中只需在例3.1的基础上编写主函数,加上求解区间和边值条件即可。需要注意的是,ode45的运行结果以列向量形式给出。因此在本例中,x的第一列为y,第二列为y’。如果遇到变量不是列向量形式的,可以考虑利用reshape函数做矩阵变换。

    则,plot(t,x(:,1))画出来的是x的第一列数据,即为y;

            plot(t,x(:,2))画出来的是x的第二列数据,即为y’;

     

    三、总结

    在使用matlab中,如遇到命令格式记不清楚等情况,建议直接在命令行输入指令’help+函数名称’,如,在matlab命令窗口输入help dsolve后,显示如下:

    参考:

    1、https://jingyan.baidu.com/article/e52e36154448e940c60c51aa.html

    2、https://baike.baidu.com/item/ode45/6674723?fr=aladdin

    3、https://wenku.baidu.com/view/45a0a0b54b73f242326c5f7f.html

     

     

    展开全文
  • Matlab使用ode45求解高阶微分方程

    千次阅读 2021-04-18 03:18:30
    原问题为利用ode45求解下面微分方程:初值为可以转为二阶微分方程利用Matlab求解,下面为源代码functionMyode45tspan = [2,4]; %求解区间y0 = [1 0]; %y0的初值形式为行向量[t,x] = ode45(@odefun,tspan,y0); %使用...
  • matlab关于ode45解二阶微分方程的困惑matlab关于ode45解二阶微分方程的困惑一个二阶微分方程:y''+y'+y=sin(t)初始条件为y(0)=5,y'(0)=6。过程:先降阶为一阶微分方程组y'=zz'=-z-y+sin(t)编制如下函数m文件function...
  • ode是专门用于解微分方程的功能函数,他有ode23,ode45,ode23s等等,采用的是Runge-Kutta算法。ode45表示采用四阶,五阶runge-kutta单步算法,截断误差为(Δx)^3。解决的是Nonstiff(非刚性)的常微分方程.是解决数值...
  • 简单的微分方程边值问题(BVP),1stOpt很容易求解:Variable t=[0,2*pi],y=[1,1],y'=[0,0];Plot t[x],y, y'[y2];ODEFunction y'''=y''-y'+y;复制代码目标函数: 1.04603504250813E-13边值估算:y''(t=0): -1....
  • 本人需要用ODE15s解一个微分方程组,形式如图中圈出来的。看过matlab help文件后还是不知道具体怎么使用,参数怎么设置。有没有大神能举个类似例子让我看一下。(我要的方程质量矩阵里面不是常数,包含了y) 看图...
  • ode45求解微分方程

    千次阅读 2021-03-27 19:15:23
    如何利用matlab中的ode45来求解一阶和二阶微分方程 建议大家先看ode45的使用文档,再来看我的博客,拿我这个当个练习做吧,文档链接在文章底部 1.求解一阶微分方程 这是随机共振中的Langevin方程,现在我们来求解x ...
  • MATLAB官网ode45函数介绍中有一下四种用法。[t,y] = ode45(odefun,tspan,y0)https://www.mathworks.com/help/releases/R2020b/matlab/ref/ode45.html?doclanguage=zh-CN&nocookie=true&prodfilter=ML%20SL...
  • Matlab(1)使用ode45求解常微分方程

    万次阅读 多人点赞 2018-07-08 12:29:44
    这里是使用Matlab中的ode45求解常微分方程数值的简单说明。具体可使用"help ode45"命令查看它的帮助文档。ode45求非刚性微分方程,中阶方法。使用语法为 [T,Y] = solver(odefun,tspan,y0)下面举例...
  • 使用 matlab 自带的 ode45方程组用句柄表示。
  • 程序有点麻烦,先谢谢... % %现在问题是:求解ode45时,一下子可以求得t=[0:1:10]的值,不能求得单个时刻的值,因此就不能进行系数更新 针对解方程组,而系数时变,需要用到前一时刻求出的值,不知道用ODE45行不行?
  • %函数function dxdt=differential(t,x)dxdt=[x(1)*(1-x(1))*(195.75-223.23*x(2));x(2)*(1-x(2))*(51.75-38....end复制代码clear%y-xfor i=0:0.1:1for j=0:0.1:1[T,Y]=ode45('differential',[0 5],[i j]);figure(1...
  • nbspmatlabMatlab解微分方程(ODE+PDE).pdf33页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理...
  • ode45求解微分方程MATLAB

    千次阅读 2019-03-26 11:23:00
    首先介绍一下ode45的格式: [t,y] = ode45(odefun,tspan,y0) [t,y] = ode45(odefun,tspan,y0,options) [t,y,te,ye,ie] = ode45(odefun,tspan,y0,...这里介绍一阶微分方程: [自变量,因变量] = ode45(方程...
  • 1、如下公式: 其中x、y、m、n为参数,a、b为未知数,利用MATLAB求解方程; syms x y m n a b;[a,b]=solve('x=m*cos(a)+n*cos(a+b)','y=m*sin(a)+n*sin(a+b)','a','b');会得到四组解;对a(3)、b(3)、a(4)、b(4)进行...
  • [matlab]数值计算微分方程组当我们使用dsolve无法进行符号求解时,我们使用ode45函数函数原型为[t,y] = ode45(odefun,tspan,y0)example [t,y] = ode45(odefun,tspan,y0,options)example [t,y,te,ye,ie] = ode45...
  • matlab 多次求解偏微分方程 ode45

    千次阅读 2019-04-27 20:39:47
    师兄和我讨论了一个问题,就是在matlab中求解偏微分方程, 其中,偏微分方程中有的常数是一直变化的,要求很多次,而不是一个固定的常数求一次就行了。 其中,A1和A2是要求的因变量,x是自变量,其他为...
  • MATLAB利用ode求解二阶微分方程

    千次阅读 2020-12-17 15:02:10
    MATLAB利用ode求解二阶微分方程 求解微分方程为: MATLAB的m文件代码如下: function xp=order1(t,x) xp=zeros(2,1); %x1=y,x2=y' xp(1)=x(2); xp(2)=(200*t-0.5*(x(2))^2)/(20*t); end 在命令行中调用代码如下:...
  • matlab求解含时微分方程组-ode45龙格库塔方法.docx
  • clcclear all%画系统的庞加莱图主程序;T=2*pi;%周期;tspan=0:T/100:200*T;%求解区间;y0=[0.005,0.005,0.005,0.005,0.005,0.005,0.005,0.005,0.005,0.005];%初始值;options=odeset('RelTol',...[t,y]=ode45('fun...
  • https://blog.csdn.net/lynn15600693998/article/details/86597068 https://www.cnblogs.com/NikkiNikita/p/9450743.html https://blog.csdn.net/lusongno1/article/details/51288055
  • 二阶微分方程matlab代码 this code works on matlab. It is shooting method impementation for solving second order differential equations
  • 用Eular法微分方程组的数值,使用了细胞数组,代码简洁,除注释外的有效代码只有二十行左右。(几年前上传的程序了,当时要20积分,现在为大家降到5个积分)
  • matlab解微分方程组并作图

    千次阅读 2021-04-20 05:06:51
    共回答了19个问题采纳率:89.5%function dx=appollo(t,x)mu=1/82.45;mustar=1-mu;r1=sqrt((x(1)+mu)^2+x(3)^2);r2=sqrt((x(1)-mustar)^2+x(3)^2);dx=[x(2)2*x(4)+x(1)-mustar*(x(1)+mu)/r1^3-mu*(x(1)-mustar)/r2^3x...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,372
精华内容 548
关键字:

matlabode45解微分方程组

matlab 订阅