Matlab: ode45解微分方程——以弹簧振子模型为例

简介:

在科学和工程中,我们经常遇到描述事物变化的微分方程。这些方程可以帮助我们理解从行星运动到药物在体内的扩散等各种现象。但是,很多微分方程非常复杂,手动求解几乎不可能。这时,我们就可以使用像 ode45这样的工具来帮助我们找到解决方案。下面谈谈ode45函数的基本用法以及简单应用。

一、ode45()概念与用法

ode45 是 MATLAB 中用于求解常微分方程初值问题的函数,它采用了一种称为 “Runge-Kutta 方法” 的数值积分技术。具体来说,ode45 使用了一种称为 “Dormand-Prince” 方法的五阶龙格-库塔公式,同时还使用了一个自适应步长控制算法,以保证数值解的精度和稳定性。

ode45 的基本用法如下:

[t, y] = ode45(@odefun, tspan, y0)
  • @odefun 是一个函数句柄,表示待求解的微分方程组。这个函数接受两个参数:时间 t 和状态向量 y,并返回对应的导数值。
  • tspan 是一个包含两个元素的数组,表示求解的时间区间 [t_start, t_end]
  • y0 是一个包含微分方程组初始状态的列向量。

ode45 返回两个输出参数:

  • t 是一个列向量,包含求解过程中的时间点。
  • y 是一个大小为 (length(t), length(y0)) 的矩阵,每一行表示对应时间点 t 处的状态向量 y

二、ode45()步骤流程方法


使用 ode45 解微分方程组的步骤通常包括:

1. 定义方程:首先,需要将问题转化为一个或多个微分方程。
2. 编写函数:在 MATLAB 中,你需要编写一个函数来定义这些方程。这个函数将接受当前的状态(比如位置和速度)和时间作为输入,并返回状态的导数(比如加速度)。
3. 调用 ode45:使用 `ode45` 函数,输入你的方程函数、初始条件、时间跨度等参数。
4. 分析结果ode45 将返回一个近似的数值解,你可以用它来进行进一步的分析或绘图。

三、弹簧振子模型代码实践

有一个挂在天花板上的弹簧,下面挂着一个质量为 m 的物体。如果把这个物体拉下来一点然后放手,它会开始上下振动,这就是一个弹簧振子系统。这个系统的运动可以通过一个二阶微分方程来描述:

m\frac{d^2x}{dt^2} + kx = 0 

为了使用 ode45我们需要将这个二阶方程转换为一阶方程组。我们引入一个新的变量 v = dx/dt,表示物体的速度。那么加速度 d^2x/dt^2 就可以表示为 dv/dt。这个过程有点像状态空间方程的改写。现在我们有两个方程: 

v=\frac{dx}{dt}

a = \frac{dv}{dt} = -\frac{kx}{m}

 现在,我们可以按照以下步骤使用 ode45

1.定义方程,编写函数:

function dxdt = spring_system(t, x)m = 1;  % 质量 mk = 4;  % 弹簧常数 kdxdt = [x(2); -k/m * x(1)];  % 返回速度和加速度
end

 2.调用ode45:

% 从 t=0 到 t=10,初始位置为 1,初始速度为 0
[t, x] = ode45(@spring_system, [0, 10], [1, 0]); 

3.分析结果:

plot(t, x(:,1), 'r', 'LineWidth', 2); % 绘制位置随时间变化的图
hold on;
plot(t, x(:,2), 'b', 'LineWidth', 2); % 绘制速度随时间变化的图
xlabel('Time');
ylabel('Displacement/Velocity');
legend('Displacement', 'Velocity');

四、完整代码 

下面给出完整代码:

% 模拟参数
tspan = [0 10];  % 时间区间
x0 = [0.5; 0];  % 初始条件,假设初始位置为 0.5 m,初始速度为 0 m/s% 使用 ODE45 求解微分方程
[t, x] = ode45(@spring_system, tspan, x0);  %x中接收到的是函数返回值的原函数位移和速度% 绘图
figure;
plot(t, x(:,1), 'r', 'LineWidth', 2); % 绘制x随时间变化的图(位置)
hold on;
plot(t, x(:,2), 'b', 'LineWidth', 2); % 绘制x的导数随时间变化的图(速度)
xlabel('Time (s)');
ylabel('Displacement (m) / Velocity (m/s)');
legend('Displacement', 'Velocity');
title('Spring System Simulation');% 局部函数定义:定义微分方程系统
function dxdt = spring_system(t, x)m = 1;  % 质量 mk = 4;  % 弹簧常数 kdxdt = [x(2); -k/m * x(1)];  % 返回速度和加速度
end

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DL】FocalLoss的PyTorch实现

【DL】FocalLoss的PyTorch实现 此篇不介绍FocalLoss的原理,仅展示PyTorch实现FocalLoss的两种方式。个人认为相关原理已在文章《FocalLoss原理通俗解释及其二分类和多分类场景下的原理与实现》中讲得很清晰,故此篇不再介绍。 方式一 同时计算一个batc…

【iOS】frame与bounds区别

文章目录 前言framebounds两者区别size的区别总结 前言 在学习响应者链的过程中用到了frame与bounds的混用,这两个属性经常出现在我们的开发中,特别撰写一篇博客分析区别 首先,我们来看一下iOS特有的坐标系,在iOS坐标系中以左上…

C语言如何查看进程中环境变量中所有的值

示例代码&#xff1a;查看进程中环境变量中所有的值。 #include <stdio.h>int main(){extern char** environ;for (char** pp environ; *pp; pp){printf("%s\n", *pp);}return 0; }输出结果&#xff1a; SHELL/bin/bash WSL2_GUI_APPS_ENABLED1 WSL_DISTRO_…

【debug】如何使用pycharm对代码调试

后续会将所有debug中遇到的知识放入&#xff0c;建议关注收藏 本站友情链接&#xff1a; 基本理论专栏&#xff08;当前更新好的debug所有内容都在这里&#xff09; 【debug】报错解决方法&#xff08;CondaHTTPError&#xff1a;HTTP 000 connection failed for url&#xff…

【回溯 状态压缩 深度优先】37. 解数独

本文涉及知识点 回溯 状态压缩 深度优先 LeetCode37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

leetCode刷题记录4-面试经典150题-2

文章目录 不要摆&#xff0c;没事干就刷题&#xff0c;只有好处&#xff0c;没有坏处&#xff0c;实在不行&#xff0c;看看竞赛题面试经典 150 题 - 2210. 课程表 II 不要摆&#xff0c;没事干就刷题&#xff0c;只有好处&#xff0c;没有坏处&#xff0c;实在不行&#xff0c…

[C++核心编程-06]----C++类和对象之对象模型和this指针

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Microsoft 365 for Mac v16.84 office365全套办公软件

Microsoft 365 for Mac是一款功能丰富的办公软件套件&#xff0c;为Mac用户提供了丰富的功能和工具&#xff0c;提高了工作效率和协作能力。Microsoft 365 for Mac是一款专为Mac用户设计的订阅式办公软件套件&#xff0c;旨在提高生产力和效率。 Microsoft 365 for Mac v16.84正…

数据赋能(83)——数据要素:数据要素管理与数据管理

数据要素管理则更关注数据作为生产性资源在创造经济价值中的作用&#xff1b;数据管理更侧重于数据在整个生命周期中的控制、保护和价值提升。 数据要素管理是对数据作为关键生产要素进行系统性管理的过程。它聚焦于数据在经济和社会活动中的价值创造和贡献&#xff0c;将数据…

ubantu安装docker以及docker-compose

ubantu安装docker以及docker-compose 安装docker1、从官方存储库中安装Docker2、启动Docker服务3、验证 安装docker compose使用docker部署服务1、需要再opt文件夹下创建以下文件夹&#xff0c;/opt文件夹目录说明2、可将已备份对应文件夹拷至对应文件夹下3、在/opt/compose目录…

python集合

集合是一个无序的不重复元素序列&#xff0c;集合中的元素必须是不可变类型 集合的创建与删除 用{}直接创建 用集合推导式创建 用ser&#xff08;&#xff09;函数将列表&#xff0c;元组&#xff0c;range对象转换成集合 numset1{1,2,3,4,5}numset2{x**2 for x in range(…

【代码】Mysql 查询近一个月各类型设备新增数量

错误示例 SELECT COUNT(*) AS count, p.type, d.active_date FROM device d LEFT JOIN product p ON d.product_id p.pid WHERE MONTH (active_date) MONTH (CURRENT_DATE - INTERVAL 1 MONTH) AND YEAR (active_date) YEAR (CURRENT_DATE - INTERVAL 1 MONTH) group by p.…

mysql高可用集群MGR组复制的介绍、部署及配置说明

前言 MGR全称MySQL Group Replication(Mysql组复制),是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。MGR提供了高可用、高扩展、高可靠的MySQL集群服务。 高一致性:基于分布式paxos协议实现组复制,保证数据一致性; 高容错性:自动检测机制,只要不…

霍金《时间简史 A Brief History of Time》书后索引(A--D)

图源&#xff1a;Wikipedia INDEX A Abacus Absolute position Absolute time Absolute zero Acceleration Age of the universe Air resistance Albrecht, Andreas Alpha Centauri Alpher, Ralph Anthropic principle Antigravity Antiparticles Aristotle Arrows of time …

基于Vant UI的微信小程序开发(随时更新的写手)

基于Vant UI的微信小程序开发✨ &#xff08;一&#xff09;悬浮浮动1、效果图&#xff1a;只要无脑引用样式就可以了2、页面代码3、js代码4、样式代码 &#xff08;二&#xff09;底部跳转1、效果图&#xff1a;点击我要发布跳转到发布的页面2、js代码3、页面代码4、app.json代…

vue项目设置主题色

在vue开发过程中&#xff0c;很多页面为了保持主题颜色统一&#xff0c;且方便后期管理&#xff0c;通常会设有主题色&#xff0c;通过主题色可以使得页面上的按钮单选框等控件保持颜色统一。 接下来介绍其中一种方法&#xff1a; 1.先建立一个js文件用于存放主题色&#xff…

我觉得POC应该贴近实际

今天我看到一位老师给我一份测试数据。 这是三个国产数据库。算是分布式的。其中有两个和我比较熟悉&#xff0c;但是这个数据看上去并不好。看上去第一个黄色的数据库数据是这里最好的了。但是即使如此&#xff0c;我相信大部分做数据库的人都知道。MySQL和PostgreSQL平时拿出…

Spark Streaming笔记总结(保姆级)

万字长文警告&#xff01;&#xff01;&#xff01; 目录 一、离线计算与流式计算 1.1 离线计算 1.1.1 离线计算的特点 1.1.2 离线计算的应用场景 1.1.3 离线计算代表技术 1.2 流式计算 1.2.1 流式计算的特点 1.2.2 流式计算的应用场景 1.2.3 流式计算的代表技术 二…

最小生成树刷题笔记

算法基础&#xff1a; 首先是prim算法三部曲&#xff1a; &#xff08;1&#xff09;找到距离最小生成树最近的节点。 &#xff08;2&#xff09;将距离最小生成树最近的节点加入到最小生成树中。 &#xff08;3&#xff09;更新非最小生成树节点到最小生成树的距离。 实现…

HTML批量文件上传3—Servlet批量文件处理FileUpLoad

作者:私语茶馆 1.开源的文件上传组件介绍 本文使用的是Apache Commons下面的一个子项目FileUpload,另外一个常见组件是SmartUpload。FileUpload遵循RFC 1897,即“Form-based File Upload in HTML”,对于请求需要满足:HTTP协议,Post请求,content Type=“multipart/form-d…