首页 > 其他分享 >matlab中通过ode函数求解常微分方程附加简单的钟摆模型

matlab中通过ode函数求解常微分方程附加简单的钟摆模型

时间:2023-04-25 12:05:56浏览次数:52  
标签:function dydt end tspan dstate matlab 钟摆 osc ode

求解常微分方程常用matlab中的ode函数,该函数采用数值方法用于求解难以获得精确解的初值问题。ODE是一个包含一个独立变量(例如时间)的方程以及关于该自变量的一个或多个导数。在时域中,ODE是初始值问题,因此所有条件在初始时间t=0指定。

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_解决方案

Matlab有几个不同的函数(内置)用于ODEs的解决方案。这些解算器可以与以下语法一起使用:

[outputs] = function_handle(inputs)
[t,state] = solver(@dstate,tspan,ICs,options)

其中state-一个数组,ODE的解(每次状态的值)。

solver-求解器函数,比如ode45、ode23等

dstate- 包含求导公式的函数句柄

tspan- 时间范围,比如[0,5]

ICs- 求解变量的初始状态

options-其他配置参数,比如rtol、atol等

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_常微分方程_02

积分器使用我们已经知道并重复的信息计算y(t)的附近值。

高阶数值方法以速度为代价减少误差:

•欧拉方法-一阶展开

•中点法-二阶扩展

•Runge Kutta-四阶扩展

几种不同的求解器对比



matlab中通过ode函数求解常微分方程附加简单的钟摆模型_数值方法_03

[t,state] = ode45(@dstate,tspan,ICs,options)计算步骤:

1.在一个文件中定义tspan、IC和选项(例如call_dstate.m) ,用来设置ode45

2.在另一个文件中定义常量和求导数(例如dstate.m)或作为调用内的函数dstate

3.运行call_dstate.m

4.将结果进行分析

举个例子:

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_常微分方程_04

function [t,y] = call_dstate()
tspan = [0 9]; % 时间范围
y0 = 10; % 初始值
% 调用ode
[t,y] = ode45( @dstate ,tspan ,y0);
plot(t,y)
disp([t,y]) % 输出结果
function dydt = dstate (t,y)
    alpha=2; gamma=0.0001;
    dydt = alpha* y-gamma *y^2;
end
end

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_数值方法_05

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_解决方案_06

• 这是一个常微分方程系统,其中对自变量时间有不止一个导数。

• 这是一个刚性系统,因为y1和y2变化剧烈,因此我们需要ode15。

•这次我们将为调用函数(call_osc.m)和ode函数(osc.m)创建单独的文件

为了模拟这个系统,创建一个包含方程的函数osc。

方法1:在列向量中预先分配空间,并填充导数函数

function dydt = osc(t,y)
 dydt = zeros(2,1)
 dydt(1) = y(2);
 dydt(2) = 1000*(1 - y(1)^2)*y(2) - y(1);
end

方法2:对微分函数进行矢量化

function dydt = osc(t,y)
 dydt = [y(2)
 1000*(1 - y(1)^2)*y(2) - y(1)];
end

现在用上述初始条件在0到3000的时间间隔内求解。创建y1随时间的散点图。

function [T,Y] = call_osc()
 tspan = [0 3000];
 y1_0 = 2;
 y2_0 = 0;
 [T,Y] = ode15s(@osc,tspan,[y1_0 y2_0]);
 plot(T,Y(:,1),'o')
end

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_数值方法_07

对于一个简单的钟摆模型

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_解决方案_08

它的数学模型为:

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_数值方法_09

令:matlab中通过ode函数求解常微分方程附加简单的钟摆模型_常微分方程_10,则

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_数值方法_11

function [] = call_pend()
tspan=[0 2*pi]; % 
z0=[pi/3,0]; % 初始数值
[t,z]=ode23(@pend,tspan,z0);
plot(t,z(:,1))
function dzdt = pend(t,z)
G=9.8; L=2; % 常数
z1=z(1); % z1
z2=z(2); % z2
dzdt = [z2 ; -G/L*sin(z1);];
end
end

matlab中通过ode函数求解常微分方程附加简单的钟摆模型_解决方案_12


标签:function,dydt,end,tspan,dstate,matlab,钟摆,osc,ode
From: https://blog.51cto.com/domi/6223704

相关文章

  • DDP运行报错(单卡无错):ERROR:torch.distributed.elastic.multiprocessing.api:failed (e
    使用DDP时出现错误,但是单卡跑无错误。错误记录如下:RuntimeError:Expectedtohavefinishedreductionintheprioriterationbeforestartinganewone.Thiserrorindicatesthatyourmodulehasparametersthatwerenotusedinproducingloss.Youcanenableunu......
  • 【DP】LeetCode 198. 打家劫舍
    题目链接198.打家劫舍思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nums......
  • matlab学习笔记9 随机变量与概率分布
    概率分布函数下图的函数作用是求某点处的B(n,p)的概率,横坐标为实验所得值,即x,从中可见e(x)=12unidpdf(k,N)为均匀分布函数的概率密度在随机范围为1到N的正整数中取k的概率,若需要离散的情况可改用unifpdfy=unidpdf(1:1:10,20)%unidpdf(k,N)为均匀分布函数的概率密度在随机范......
  • leetcode(2)
    Given n pointsona2Dplane,findthemaximumnumberofpointsthatlieonthesamestraightline.在一条直线上最多的点。理解错了:理解成一条直线上距离最长的点(自己见过类似题,务必审题要细!!!!)4.1hash_map和map的区别在哪里?构造函数。hash_map需要hash函数,......
  • 【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵
    题目链接1277.统计全为1的正方形子矩阵思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1......
  • window操作系统安装多个版本nodejs版本-控制工具nvm
    参考:https://blog.csdn.net/m0_38134431/article/details/118388297https://juejin.cn/post/7044890876631318564电脑上已经安装了10.x版本的nodejs,你不想直接更新到12.x,想同时保存10.x和12.x版本,在必要的时候还能随时切换nodejs版本,nvm工具可以实现一、首先要安装nvm下载地......
  • 微服务-node.js
    权威解释Node.js®isaJavaScriptruntimebuiltonChrome’sV8JavaScriptengine.Node.jsusesanevent-driven,non-blockingI/Omodelthatmakesitlightweightandefficient.Node.js’packageecosystem,npm,isthelargestecosystemofopensourcelibraries......
  • CodeStar2023年春第6周周赛普及进阶组
    T1:最长倍数序列本题难度中等,先把\(a\)从小到大排序。dp[i]表示以\(a_i\)结尾的倍数序列。转移如下:只有\(a_i\),对应长度\(dp[i]=1\)上一个数是\(a_j(1\leqslantj\leqslanti-1)\),若\(a_j\)是\(a_i\)的约数,就更新\(dp[i]=\max(dp[i],dp[j]+1)\)最终答......
  • Codeforces Round #459 (Div. 2) D. MADMAX DAG&&博弈
    Asweallknow,Maxisthebestvideogameplayeramongherfriends.Herfriendsweresojealousofhers,thattheycreatedanactualgamejusttoprovethatshe’snotthebestatgames.Thegameisplayedonadirectedacyclicgraph(aDAG)withnvertic......
  • Codeforces Round #306 (Div. 2) D. Regular Bridge 构造
    Anundirectedgraphiscalledk-regular,ifthedegreesofallitsverticesareequalk.Anedgeofaconnectedgraphiscalledabridge,ifafterremovingitthegraphisbeingsplitintotwoconnectedcomponents.Buildaconnectedundirectedk-regularg......