MATLAB: ode45 求解常微分方程
创始人
2024-12-01 06:35:24
0

引入

ode45 是 MATLAB 中用于求解非刚性常微分方程(ODE)的数值方法。它基于 Runge-Kutta 方法,并具有自适应步长调整机制,能够在一定误差控制范围内高效地计算 ODE 的数值解。

下面我们通过这个包含详细注释的代码,一起学习一下这个函数的使用:

使用 ode45 求解非线性常微分方程并绘制数值解与精确解对比图

方程模型

我们考虑以下非线性常微分方程:

y ′ ′ = − y ′ + cos ⁡ ( t ) − 3 sin ⁡ ( t ) y'' = -y' + \cos(t) - 3 \sin(t) y′′=−y′+cos(t)−3sin(t)

##初始条件

选择初始条件:
y ( 0.1 ) = cos ⁡ ( 0.1 ) + 2 sin ⁡ ( 0.1 ) y(0.1) = \cos(0.1) + 2 \sin(0.1) y(0.1)=cos(0.1)+2sin(0.1)
y ′ ( 0.1 ) = − sin ⁡ ( 0.1 ) + 2 cos ⁡ ( 0.1 ) y'(0.1) = -\sin(0.1) + 2 \cos(0.1) y′(0.1)=−sin(0.1)+2cos(0.1)

使用 ode45 求解 ODE

以下是使用 ode45 求解该方程的 MATLAB 代码,并绘制数值解与精确解的对比图:

% 定义非线性ODE,以下是不同的ODE定义 % ode = @(t, y) [y(2); (f  + y(2).^2 / 2 - 2 * mu .* y(2) ./ (rho .* y(1)) + sig ./ (rho * y(1)) - aB .* y(2).^2 ) ./ (aB * y(1))]; % ode = @(t, y) [y(2); (f + y(2).^2 / 2 - aB .* y(2).^2)];  % 当前使用的ODE定义 ode = @(t, y) [y(2); (-y(2) + cos(t) - 3 * sin(t))];  % 设定初始条件 x0 = 0.1;                      % 初始时间 drealu = @(t) -sin(t) + 2 * cos(t);   % 实际解的导数 realu = @(t) cos(t) + 2 * sin(t);     % 实际解 initial_conditions = [realu(x0); drealu(x0)];  % 初始条件向量  % 定义求解区间 tspan = [x0 10];  % 从初始时间到10的时间区间  % 使用ode45求解ODE [t, y] = ode45(ode, tspan, initial_conditions);  % 绘制数值解 figure; plot(t, y(:, 1), 'o-'); title('numerical solution'); xlabel('time (t)'); ylabel('solution (y(t))'); grid on;  % 绘制实际解 figure; plot(t, realu(t), 'o-'); title('real solution'); xlabel('time (t)'); ylabel('solution (y(t))'); grid on;  

我们画出数值解与精确解对比图:

在这里插入图片描述
效果不错!

再看一个例子

使用 ode45 求解常微分方程并绘制数值解与精确解对比图

方程模型

我们考虑以下二阶常微分方程:
y ′ ′ + y = 0 y'' + y = 0 y′′+y=0

这个方程的精确解为:
y ( t ) = A cos ⁡ ( t ) + B sin ⁡ ( t ) y(t) = A \cos(t) + B \sin(t) y(t)=Acos(t)+Bsin(t)

初始条件

选择初始条件:
y ( 0 ) = 1 y(0) = 1 y(0)=1
y ′ ( 0 ) = 0 y'(0) = 0 y′(0)=0

根据初始条件,精确解可以写为:
y ( t ) = cos ⁡ ( t ) y(t) = \cos(t) y(t)=cos(t)

使用 ode45 求解 ODE

以下是使用 ode45 求解该方程的 MATLAB 代码,并绘制数值解与精确解的对比图:

% 定义ODE ode = @(t, y) [y(2); -y(1)];  % 初始条件 y0 = [1; 0]; % y(0) = 1, y'(0) = 0  % 定义求解区间 tspan = [0 10];  % 使用ode45求解ODE [t, y] = ode45(ode, tspan, y0);  % 定义精确解 exact_solution = @(t) cos(t);  % 绘制数值解与精确解对比图 figure; plot(t, y(:, 1), 'o-', 'DisplayName', 'Numerical Solution'); % 数值解 hold on; fplot(exact_solution, [0 10], 'r-', 'DisplayName', 'Exact Solution'); % 精确解 title('Comparison of Numerical Solution and Exact Solution'); xlabel('time (t)'); ylabel('solution (y(t))'); legend; grid on; hold off; 

画出数值解与精确解对比图:在这里插入图片描述

Good!

相关内容

热门资讯

实测交流!友友联盟辅助免费下载... 实测交流!友友联盟辅助免费下载,吉祥填大坑免费脚本,安装教程(讲解有挂);1、完成友友联盟辅助免费下...
重磅来袭“赣牌圈科技”了解开挂... 您好:赣牌圈科技这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好...
一分钟了解!福建天天开心辅助器... 一分钟了解!福建天天开心辅助器是真的码,斗城麻将微信有挂,攻略教程(真的有挂);福建天天开心辅助器是...
玩家必看教程“情怀游戏字牌辅助... 玩家必看教程“情怀游戏字牌辅助”揭秘开挂作弊辅助神器(一向是真的有挂);亲真的是有正版授权,小编(透...
发现玩家!微乐家乡app辅助器... 发现玩家!微乐家乡app辅助器,微信小程序微乐辅助器破解版,2025新版技巧(有挂方略);AI辅助机...
实测分享“新海贝之城辅助器”解... 实测分享“新海贝之城辅助器”解密开挂作弊辅助挂(从来存在有挂);AI辅助机器人普及解说快速成为一个“...
一分钟秒懂!丫丫游戏辅助,大咖... 一分钟秒懂!丫丫游戏辅助,大咖娱乐破解器,黑科技教程(有挂分析);人气非常高,ai更新快且高清可以动...
一分钟揭秘“雀神广东智能插件”... 一分钟揭秘“雀神广东智能插件”了解开挂作弊辅助下载(竟然是真的有挂);大家肯定在之前雀神广东智能插件...
玩家必看教程!新道游房卡辅助器... 玩家必看教程!新道游房卡辅助器,微信小游戏辅助器,我来教教你(有挂头条);最新版2026是一款经典耐...
发现一款“奇迹陕西靖边打锅子辅... 发现一款“奇迹陕西靖边打锅子辅助”推荐开挂作弊辅助挂(竟然真的是有挂);是一款可以让一直输的玩家,快...