MATLAB: ode45 求解常微分方程

引入

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!

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

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

相关文章

Windows 11 系统对磁盘进行分区保姆级教程

Windows 11磁盘分区 磁盘分区是将硬盘驱动器划分为多个逻辑部分的过程,每个逻辑部分都可以独立使用和管理。在Windows 11操作系统中进行磁盘分区主要有以下几个作用和意义: 组织和管理数据:分区可以帮助用户更好地组织他们的数据&#xff0c…

无人机之降落操作及紧急情况处理

一、无人机降落操作 1、选择降落地点 a.提前选择一个平坦且没有障碍物的降落点; b.确认降落点周围没有行人或障碍物,保证降落的安全性。 2、降低飞行高度 a.缓慢降低飞行高度,尽量保持匀速下降,防止因下降过快导致无人机受损…

学习vue第一天

文章目录 1.什么是 Vue?2.渐进式框架3.如何新建一个vue项目 1.什么是 Vue? Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型&#xff0…

Day20 | 39. 组合总和 40.组合总和II 131.分割回文串

语言 Java 39. 组合总和 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidate…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码,验证已被我去除,两个后端系统,账号和卡密系统 第一步安装宝塔,部署卡密系统,需要环境php7.4 把源码丢进去,设置php7.4,和伪静态为thinkphp直接访问安装就行 …

探索WebKit的CSS表格布局:打造灵活的网页数据展示

探索WebKit的CSS表格布局:打造灵活的网页数据展示 CSS表格布局是一种在网页上展示数据的强大方式,它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎,提供了对CSS表格布局的全面支持。本文将深入探讨…

qt 如何制作动态库插件

首先 首先第一点要确定我们的接口是固定的,也就是要确定 #ifndef RTSPPLUGIN_H #define RTSPPLUGIN_H #include "rtspplugin_global.h" typedef void (*func_callback)(uint8_t* data,int len,uint32_t ssrc,uint32_t ts,const char* ipfrom,uint16_t f…

【前端学习笔记】CSS基础一

一、什么是CSS 1.CSS 介绍 CSS(Cascading Style Sheets,层叠样式表)是一种用来控制网页布局和设计外观的样式语言。它使得开发者可以分离网页的内容(HTML)和表现形式(样式),提高了…

Spring Security 介绍

1.概要 Spring Security是一个用于在Java应用程序中实现身份验证和访问控制的强大框架。它可以轻松地集成到任何基于Spring的应用程序中,提供了一套丰富的功能来保护应用程序的安全性。 https://spring.io/projects/spring-security/ demo:https://docs.spring.i…

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器,不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject,属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…

美团后端二面

美团后端二面 ……………………………… 两道场景 一道 数字转中文读法(1000-》一千) 0八股0自我介绍 反问 “您觉得我能过吗?” “这个需要横行对比之后才能有结果” ……………………………… 什么时候到岗 场景题 1 假设我有一个…

ETL工程师角度下的SQL优化

作为ETL(Extract, Transform, Load)工程师,SQL优化是提高数据处理和分析效率的关键一环。优化SQL查询可以显著降低数据处理时间,提高ETL过程的性能。本文将从 合理设计数据模型:在ETL过程中,正确的数据模型…

主从DNS服务器

实验 3 :主从 DNS 服务器 将一个区域文件复制到多个服务器上的过程叫做区域传送。将主服务器上的信息复制到辅助服务器上来 实现。 ( 1 )完全区域传送:复制整个区域文件 查看日志 # 主 DNS 服务器的配置【主 dns 服务器的 ip 地…

【STM32 HAL库】ADC

ADC,顾名思义就是模拟信号->数字信号ADC工作原理 分类: 并联比较型-----转换速度快-----成本高、功耗高、分辨率低 分压部分比较部分编码部分(其中Vx为模拟电压输入 ) 逐次逼近型-----结构简单,功耗低-----转换速…

Preact:轻量级替代React的选择

Preact是一个轻量级的JavaScript库,它提供了与React相似的API,但体积更小,性能更优。Preact的核心理念是尽可能地保持与React的兼容性,同时去除不必要的部分,使其成为一个理想的替代品,尤其是在对性能和包大…

C++STL详解(三)——vector类的接口详解

目录 一.vector的介绍 二.vector的构造以及赋值 2.1构造函数 2.2operator重载 三.vector的空间操作 3.1capacity和size函数 3.2reserve和resize函数 3.3empty函数 四.vector迭代器相关函数 4.1begin和end函数 4.2rbegin和rend函数 五.vector的增删查改 5.1push_back和…

web前端 React 框架面试200题(一)

面试题 1. 简述什么是React ( 概念 )? 参考回答: 1、React是Facebook开发的一款JS库。 2、React一般被用来作为MVC中的V层,它不依赖其他任何的库,因此开发中,可以与任何其他的库集成使用&…

QT串口和数据库通信

创建串口 串口连接客户端并向服务器发送消息 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network QT core gui…

【React】箭头函数:现代 JavaScript 的高效编程方式

文章目录 一、箭头函数的基本语法二、箭头函数的特性三、在 React 中的常见用法四、最佳实践 在现代 JavaScript 中,箭头函数(Arrow Functions)是一种简洁的函数表达方式,并且在 React 开发中非常常见。箭头函数不仅简化了函数的语…

RockyLinux 9 PXE Server bios+uefi 自动化部署 RockLinux 8 9

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,…