利用Matlab求解高阶微分方程(ode45)

news2024/11/15 11:05:05

1、高阶微分方程的基本概念

       二阶以及二阶以上的微分方程称之为高阶微分方程,一般来说,微分方程的阶数越高,求解的难度也就越大。求高阶方程的一个常用方法就是降低阶数。对二阶方程 ,如果能用变量代换把它化成一阶方程,那么就可以用一阶微分方程的求解方法来解决了。

      同样,在matlab中不能直接求解高阶微分方程,我们需要使用变量替换将其转换为一阶微分方程来求解。本文基于ode45求解器进行求解。

2、利用ode45求解高阶微分方程

 2.1 方法简介

      ode45 是 MATLAB 中用于求解常微分方程(ODE)的函数之一,它基于变步长的龙格-库塔方法(5(4)阶方法)。ode45 通过自动调整步长来提高效率和精度。

 2.2 函数格式

ode45 的基本语法如下: [t, y] = ode45(odefun, tspan, y0)

  • odefun: 函数句柄,表示微分方程的右侧函数,应该以 t 和 y 为输入,返回导数 dy/dt。
  • tspan: 时间范围,通常是一个二元素向量 [t0, tf],表示时间区间从 t0 到 tf。
  • y0: 初始条件,是一个向量,包含了在 t0 时刻的解的初始值。
  • t: 求解出的时间向量,表示在每个时间点上计算的结果。
  • y: 对应的解向量,与 t 的大小相同。

 2.3 举例分析

以2022年国赛A题 波浪能最大输出功率设计 第一问为例(有些公式出现的很突兀,建议看一下论文,更易理解)参考资料:2022高教社杯全国大学生数学建模竞赛A题论文展示(A001)

第一问建立的数学模型如下:可以发现这是一个二阶二元微分方程,x_{f},x_{z}是未知量

我们对上述方程进行变化,化为一阶四元微分方程

下面开始编程实现

  1. 编写函数句柄:odefun
function dydt = odefun(t, y, params)
    % 提取参数
    zf = params.zf;
    w = params.w;
    K_zn = params.K_zn;
    K_tang = params.K_tang;
    C_x = params.C_x;
    B = params.B;
    S = params.S;
    mzz = params.mzz;
    
    % 提取状态变量
    x_f = y(1); % 浮子位移
    x_z = y(2); % 振子位移
    u = y(3);   % 浮子速度
    w_n = y(4); % 振子速度
    
    % 定义微分方程
    dx_f = u;
    dx_z = w_n;
    du = (zf*cos(w*t) + K_zn*(w_n - u) + K_tang*(x_z - x_f) - C_x*u - B*x_f) / S;
    dw = -(K_zn*(w_n - u) + K_tang*(x_z - x_f)) / mzz;
    
    % 返回结果
    dydt = [dx_f; dx_z; du; dw];
end

2. 调用ode45函数求解

% 初始化参数
clc; clear; close all;

% 系统参数
params.zf = 6250;
params.w = 1.4005;
params.K_zn = 10000;
params.K_tang = 80000;
params.C_x = 656.3616;
params.B = 1025 * 9.8 * pi;
params.S = 4866 + 1335.535;
params.mzz = 2433;

% 初始条件 [x_f(0), x_z(0), u(0), w(0)]
y0 = [0, 0, 0, 0];

% 时间区间
T = (2 * pi) / params.w * 40; % 前40个波浪周期
tspan = [0 T];

% 调用 ode45 求解
[t, y] = ode45(@(t, y) odefun(t, y, params), tspan, y0);

% 提取解
x_f = y(:, 1); % 浮子位移
x_z = y(:, 2); % 振子位移
u = y(:, 3);   % 浮子速度
w_n = y(:, 4); % 振子速度

% 绘图
figure;

% 绘制位移图
subplot(1, 2, 1);
plot(t, x_f, 'r', t, x_z - x_f, 'b');
legend('浮子位移', '振子相对浮子位移');
xlabel('时间 (s)');
ylabel('位移 (m)');
title('位移随时间变化');

% 绘制速度图
subplot(1, 2, 2);
plot(t, u, 'r', t, w_n - u, 'b');
legend('浮子速度', '振子相对浮子速度');
xlabel('时间 (s)');
ylabel('速度 (m/s)');
title('速度随时间变化');

% 保存结果到 Excel 文件
% 初始化变量
resfx = [];
resfv = [];
reszx = [];
reszv = [];
dt = 0.2; % 时间间隔
time_points = 0:dt:T;

% 查找时间点在时间向量中的索引并记录数据
for t_point = time_points
    [~, idx] = min(abs(t - t_point)); % 查找最接近的时间点
    resfx(end+1) = x_f(idx);
    resfv(end+1) = u(idx);
    reszx(end+1) = x_z(idx);
    reszv(end+1) = w_n(idx);
end

% 保存结果到 Excel 文件
result = [time_points', resfx', resfv', reszx', reszv'];
xlswrite('myresult1.xlsx', result);

结果绘图:

(未完待续......,有时间再write一下四阶龙格-库塔 Runge—Kutta) 

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

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

相关文章

【Tesla FSD V12的前世今生】从模块化设计到端到端自动驾驶技术的跃迁

自动驾驶技术的发展一直是全球汽车行业的焦点,Tesla的Full-Self Driving(FSD)系统凭借其持续的技术革新和强大的数据支持,在这个领域独占鳌头。本文将深入介绍Tesla FSD V12的演进历史,从自动驾驶的基础概念入手&#…

【XML详解】

XML基本概念 XML(全称EXtensible Markup Language,可扩展标记语言):是一种用于存储和传输数据的标记语言,通过标签(tags)来定义数据的结构和含义。数据格式:XML本质上是一种数据的格…

【异常错误】pycharm可以在terminal中运行,但是无法在run中运行(没有输出错误就停止了)

问题: pycharm的命令可以在terminal中运行,但是复制到无法在run中运行(没有输出错误就停止了) run中运行后什么错误提示都没有 搞不懂为什么 解决: 降低run中batch-size的大小,即可以运行 我并没有观察到…

视频在线去水印解析相册怎么弄,轻松掌握五大技巧

在当前短视频流行的时代,我们常常需要下载一些短视频来进行剪辑或分享,但视频中的水印却成了一个不小的烦恼。为了帮助大家解决这个问题,本文将介绍五款高效的短视频去水印免费软件,让你轻松告别水印烦恼。 工具一:奈…

在VB.net中,LINQ有什么方法与属性

标题 在VB.net中,LINQ有什么方法与属性 正文 在VB.NET中使用LINQ(Language Integrated Query),你可以利用一系列的方法和属性来查询和操作内存中的集合(如数组、列表等)以及数据库等数据源。LINQ提供了丰富…

Python相关系数导图

🎯要点 量化变量和特征关联绘图对比皮尔逊相关系数、斯皮尔曼氏秩和肯德尔秩汽车性价比相关性矩阵热图大流行病与资产波动城镇化模型预测交通量宝可梦类别特征非线性依赖性捕捉向量加权皮尔逊相关系数量化图像相似性 Python皮尔逊-斯皮尔曼-肯德尔 皮尔逊相关系…

QcomboBox 组件

在记事本项目中,有一个问题,字体的编码格式是写死的。我们要建一个 组件提供这样的功能:通过点击,获得 不同的格式编码 定义它的槽 首先 把ui里面的comboBox组件与槽关联起来 connect(ui->comboBox,SIGNAL(currentIndexChange…

cesium加载矢量切片数据(mvt)全网方案总结

引言:Cesium是一款开源的3D地球可视化引擎,支持全球范围的数据展示,包括高分辨率地形、卫星图像和建筑模型等,允许用户创建交互式的3D地图,并提供了一系列的工具和API来处理地理空间数据。 Cesium支持加载多数据源的栅格切片数据,例如ArcGIS、BingMaps、WMTS、WMS等等。栅…

Qt 线程与窗体之间的传值

QThread 和窗口之间的通信通常通过信号和槽机制来实现 也可以直接通过调用线程中的值 效果图(Dialog To hello; TextLabel To hello) 在主窗口类中创建线程实例&#xff0c;并连接线程发出的信号到主窗口的槽函数。 .h #ifndef TESTAPP_H #define TESTAPP_H#include <QD…

Threejs学习-Stats 性能监控器、抗锯齿

stats性能监控器 import Stats from three/addons/libs/stats.module.js //引入包//添加性能监视器&#xff0c;查看帧率 const stats new Stats(); document.body.appendChild(stats.domElement); // //渲染 function animate() {requestAnimationFrame(animate);stats.upda…

GraphRAG论文解读

欢迎一起讨论 论文地址综述介绍部分核心翻译翻译解释重要的信息元素和实体的关系&#xff08;包含和被包含&#xff0c;而非相等&#xff09;Graph Index&#xff08;图索引&#xff09;Community Detection&#xff08;社区检测&#xff09;Query-Focused Summarization&#…

Qt+FFmpeg开发视频播放器笔记(二):界面UI搭建

效果图 主要使用无边框窗体搭建,实现窗体的拖动和缩放&#xff0c;播放列表、文件打开等。 主要代码 manwindow设计类 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QMutex> #include "framelesshelper.h"QT_BEGIN_NA…

力扣最热一百题——6.三数之和

目录 题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示 解法一&#xff1a;双指针 代码分析 总结 没啥多说的&#xff0c;就是最近CS根本上不了分谢谢。 题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&…

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 精读

1 传统视图合成和NeRF&#xff08;Neural Radiance Fields&#xff09; 1.1 联系 传统视图合成和NeRF的共同目标都是从已有的视角图像中生成新的视角图像。两者都利用已有的多视角图像数据来预测或合成从未见过的视角。 1.2 区别 1.2.1 几何表示方式 传统视图合成&#xff…

frameworks 之InputReader

frameworks 之InputReader InputManagerService 初始化InputManagerService 启动InputReader 事件的读取设备节点注册和监听设备输入事件的读取 InputReader 事件的处理设备的添加和删除处理触摸事件的处理数据的加工和分发 android 输入事件 主要分 2个流程 事件读取 和 事件…

先进提示词工程

大型语言模型 (LLM) 的普及彻底改变了我们人类解决问题的方式。在过去&#xff0c;用计算机解决任何任务&#xff08;例如&#xff0c;重新格式化文档或对句子进行分类&#xff09;都需要创建一个程序&#xff08;即根据某种编程语言精确编写的一组命令&#xff09;。使用 LLM&…

ssrf实现.SSH未创建写shell

一、介绍SSRF漏洞 SSRF (Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求&#xff0c;由服务端发起请求的安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的&#xff0c;所以服务端能请求到与自身相…

Openvino2024.3版部署YOLO (C++)

在网上很少看到有2024版的openvino&#xff0c;老版本的接口很多也都不在了&#xff0c;此篇写出来也算是为了防止自己忘记。 openvino下载 下载英特尔发行版 OpenVINO 工具套件 (intel.com) 下载好后解压出来&#xff0c;放C盘D盘都一样&#xff0c;我放在D盘了&#xff0c;…

如何解决 Cloudflare | 使用 Puppeteer 和 Node.JS

我认为&#xff0c;现在自动化任务越多&#xff0c;越能体现它们的价值&#xff0c;因此挑战也变得更加明显和困难。例如&#xff0c;Cloudflare 目前提供了强有力的安全措施来保护网站免受所有形式的自动化工具的侵扰。 但对于从事自动化项目&#xff08;如网络爬虫、数据提取…

STM32(七):定时器——输入捕获

IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。 每个高级定时器和通用定时器都拥有4个输…