文章目录:

  • 1.简介
  • 2.效果
  • 3.基本步骤
    • 3.1 解方程
    • 3.2 背景绘制
    • 3.3计算并绘图
    • 3.4完整代码
1.简介

这是一期将单摆微分方程可视化的博文,我们都知道单摆常微分方程求解过程中会涉及到椭圆积分,难以用常见函数表示其结果,所以我们这篇博文想办法将其数值解可视化。

2.效果


其中横坐标为: θ(t),θ(t)∈[−2.5π,2.5π]\theta(t),\theta(t)\in[-2.5\pi,2.5\pi]θ(t),θ(t)∈[−2.5π,2.5π]
纵坐标为:θ˙(t),θ˙(t)∈[−2π,2π]\dot{\theta}(t),\dot{\theta}(t)\in[-2\pi,2\pi]θ˙(t),θ˙(t)∈[−2π,2π]


3.基本步骤
3.1 解方程

首先我们有微分方程:
θ¨(t)=−μθ˙(t)−gLsin(θ(t))\ddot{\theta}(t)=-\mu\dot{\theta}(t)-\frac g Lsin(\theta(t)) θ¨(t)=−μθ˙(t)−Lg​sin(θ(t))
我们将其变形得到微分方程组:
ddt[θ(t)θ˙(t)]=[θ˙(t)θ¨(t)]=[θ˙(t)−μθ˙(t)−gLsin(θ(t))]\frac d {dt} \begin{bmatrix} \theta(t)\\\dot{\theta}(t) \end{bmatrix}= \begin{bmatrix} \dot{\theta}(t)\\\ddot{\theta}(t) \end{bmatrix}= \begin{bmatrix} \dot{\theta}(t)\\-\mu\dot{\theta}(t)-\frac g Lsin(\theta(t)) \end{bmatrix} dtd​[θ(t)θ˙(t)​]=[θ˙(t)θ¨(t)​]=[θ˙(t)−μθ˙(t)−Lg​sin(θ(t))​]
对此我们均匀的在平面上取点,并计算不同[θ(t)θ˙(t)]\begin{bmatrix} \theta(t)\\\dot{\theta}(t) \end{bmatrix}[θ(t)θ˙(t)​]对应的ddt[θ(t)θ˙(t)]\frac d {dt} \begin{bmatrix} \theta(t)\\\dot{\theta}(t) \end{bmatrix}dtd​[θ(t)θ˙(t)​]就可完成微分方程的可视化。


3.2 背景绘制

如果你看过我之前写的小游戏,可会下意识的这样写:

axis([-2.5,2.5,-2,2].*pi)
set(gca,‘color’,[0 0 0.0078])
set(gca,‘xtick’,[],‘ytick’,[],‘xcolor’,‘w’,‘ycolor’,‘w’)

但这样写后的效果是这个样子的:

很明显不够高端大气,至少不如效果图里显得大气
我们不妨重新定义一个大的figure,并且重新设置axes大小:

penduium.fig=figure(‘units’,‘pixels’,…
‘position’,[350 100 800 500],…
‘Numbertitle’,‘off’,…
‘menubar’,‘none’,…
‘resize’,‘off’,…
‘name’,‘simple_penduium’,…
‘color’,[0.95 0.95 0.95]);
axes(‘position’,[0 0 1 1])
axis([-2.5,2.5,-2,2].*pi)
set(gca,‘color’,[0 0 0.0078])
set(gca,‘xtick’,[],‘ytick’,[],‘xcolor’,‘w’,‘ycolor’,‘w’)

像这样的到的背景长这样:

没有边框帅气很多,之后我们(残暴的)为其增添坐标系:

hold on
plot([1;1]*(-2.5:0.1:2.5).*pi,[-2;2]*ones(1,51).*pi,'color',[0.1569 0.2039 0.1882],'linewidth',0.01)
plot([-2.5;2.5]*ones(1,41).*pi,[1;1]*(-2:0.1:2).*pi,'color',[0.1569 0.2039 0.1882],'linewidth',0.01)
plot([-2.5;2.5].*pi,[0 0],'color',[0.9373 0.9569 0.9569],'linewidth',1)
plot([0 0],[-2;2].*pi,'color',[0.9373 0.9569 0.9569],'linewidth',1)
plot([-2.5;2.5]*ones(1,6).*pi,[1;1]*[1.5,1,0.5,-0.5,-1,-1.5].*pi,'color',[0.2353 0.4235 0.4745],'linewidth',0.8)
plot([1;1]*[2,1.5,1,0.5,-0.5,-1,-1.5 -2].*pi,[-2;2]*ones(1,8).*pi,'color',[0.2353 0.4235 0.4745],'linewidth',0.8)

就得到了效果图中的背景:


3.3计算并绘图

只需要 写一个双层for循环计算方向向量,将其归一化后画在图中,并且根据不同的长度为其赋予不同的颜色就好了

for i=(-2.5+1/6:1/6:2.5-1/6).*pifor j=(-2+1/4:1/4:2-1/4).*pia=f([i,j],M,g,L);len=norm(a);a=a/len;a=a.*vector_len;Spoint=pos_exchange([i,j]);Epoint=pos_exchange([i,j]+a);if ~any(isnan(a))annotation('arrow',[Spoint(1),Epoint(1)],[Spoint(2),Epoint(2)],...'color',color_exchange(len,max_len,color_map),...'linewidth',0.2)endend
end

其中f,pos_exchange,color_exchange三个匿名函数为:

%========================================================= f=@(theta,M,g,L) [theta(2),-M*theta(2)-g/L*sin(theta(1))];
%theta(1) ->theta
%theta(2) ->theta'
%==============================================pos_exchange=@(pos) pos./[pi*5,pi*4]+[0.5,0.5];
%==============================================color_map=[0.9725    0.3804    0.35290.9725    0.3804    0.35290.9020    0.3843    0.37650.9020    0.3843    0.37650.9333    0.4118    0.37650.9686    0.5804    0.22350.9765    0.8392    0.10980.9882    0.9804    0.05880.7961    0.8353    0.25100.6510    0.7373    0.20000.5961    0.7059    0.4039];color_exchange=@(value,maxvalue,color_map) color_map(12-(floor(value/(maxvalue/11))+1),:);
%=========================================================================================

3.4完整代码
function simple_penduium
M=1.4;
g=9.8;
L=2;
vector_len=0.75;
%========================================================= f=@(theta,M,g,L) [theta(2),-M*theta(2)-g/L*sin(theta(1))];
%theta(1) ->theta
%theta(2) ->theta'
%==============================================pos_exchange=@(pos) pos./[pi*5,pi*4]+[0.5,0.5];
%==============================================color_map=[0.9725    0.3804    0.35290.9725    0.3804    0.35290.9020    0.3843    0.37650.9020    0.3843    0.37650.9333    0.4118    0.37650.9686    0.5804    0.22350.9765    0.8392    0.10980.9882    0.9804    0.05880.7961    0.8353    0.25100.6510    0.7373    0.20000.5961    0.7059    0.4039];color_exchange=@(value,maxvalue,color_map) color_map(12-(floor(value/(maxvalue/11))+1),:);
%=========================================================================================
max_len=norm(f([pi/2,2*pi],M,g,L));
global penduium
penduium.fig=figure('units','pixels',...'position',[350 100 800 500],...'Numbertitle','off',...'menubar','none',...'resize','off',...'name','simple_penduium',...'color',[0.95 0.95 0.95]);
axes('position',[0 0 1 1])
axis([-2.5,2.5,-2,2].*pi)
set(gca,'color',[0 0 0.0078])
set(gca,'xtick',[],'ytick',[],'xcolor','w','ycolor','w')
hold onplot([1;1]*(-2.5:0.1:2.5).*pi,[-2;2]*ones(1,51).*pi,'color',[0.1569 0.2039 0.1882],'linewidth',0.01)
plot([-2.5;2.5]*ones(1,41).*pi,[1;1]*(-2:0.1:2).*pi,'color',[0.1569 0.2039 0.1882],'linewidth',0.01)
plot([-2.5;2.5].*pi,[0 0],'color',[0.9373 0.9569 0.9569],'linewidth',1)
plot([0 0],[-2;2].*pi,'color',[0.9373 0.9569 0.9569],'linewidth',1)
plot([-2.5;2.5]*ones(1,6).*pi,[1;1]*[1.5,1,0.5,-0.5,-1,-1.5].*pi,'color',[0.2353 0.4235 0.4745],'linewidth',0.8)
plot([1;1]*[2,1.5,1,0.5,-0.5,-1,-1.5 -2].*pi,[-2;2]*ones(1,8).*pi,'color',[0.2353 0.4235 0.4745],'linewidth',0.8)for i=(-2.5+1/6:1/6:2.5-1/6).*pifor j=(-2+1/4:1/4:2-1/4).*pia=f([i,j],M,g,L);len=norm(a);a=a/len;a=a.*vector_len;Spoint=pos_exchange([i,j]);Epoint=pos_exchange([i,j]+a);if ~any(isnan(a))annotation('arrow',[Spoint(1),Epoint(1)],[Spoint(2),Epoint(2)],...'color',color_exchange(len,max_len,color_map),...'linewidth',0.2)endend
end
%text(pi,-0.1,'\pi','fontsize',20,'color','w','HorizontalAlignment', 'center')
%text(-pi,-0.1,['-','\pi'],'fontsize',20,'color','w','HorizontalAlignment', 'center')
%text(2*pi,-0.1,'  \pi','fontsize',20,'color','w','HorizontalAlignment', 'center')
%text(2*pi-0.1,-0.18,'2','fontsize',13,'color','w','HorizontalAlignment', 'center')
%text(-2*pi,-0.1,'- \pi','fontsize',20,'color','w','HorizontalAlignment', 'center')
%text(-2*pi-0.08,-0.18,'2','fontsize',13,'color','w','HorizontalAlignment', 'center')
%text(2.5*pi-0.3,0.5,'\theta','fontsize',25,'color','w','HorizontalAlignment', 'center')
%text(0.5,2*pi-0.3,['\theta','’'],'fontsize',25,'color','w','HorizontalAlignment', 'center')
end

matlab 含阻力单摆微分方程可视化相关推荐

  1. Matlab实现 线性动态电路可视化分析

    Matlab实现 线性动态电路可视化分析 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 编程思路 这个编程总体采用面向过程的编程思想,将人在 ...

  2. matlab恶狼追兔问题,MATLAB恶狼追兔的可视化问题.doc

    MATLAB恶狼追兔的可视化问题 <MATLAB>课程设计 恶狼追兔的可视化问题 院(系)名称 信息工程学院 专 业 班 级 09普本信计1班 学 号 MATLAB 课程设计评阅书 题目恶 ...

  3. matlab电学成像,利用MATLAB进行电磁学计算及可视化教学.PDF

    利用MATLAB进行电磁学计算及可视化教学.PDF 第 2 8 卷 第 2 期 电气电子教学学报 Vol . 28 No . 2 2006 年 4 月 J OU RN AL O F EEE Ap r ...

  4. Matlab含新能源(风电光伏)和多类型电动汽车配电网风险评估

    Matlab含新能源(风电光伏)和多类型电动汽车配电网风险评估 软件:matpower+Matlab: 关键词:蒙特卡洛.时序.电网风险.风险评估.风光不确定性 介绍:由于电动汽车负荷与风电光伏出力的 ...

  5. Matlab含新能源(风电光伏)和多类型电动汽车配电网风险评估 由于电动汽车负荷与风电光伏出力的不确定性,造成配电网运行风险,运用蒙特卡洛概率潮流计算分析电压和线路支路越限

    Matlab含新能源(风电光伏)和多类型电动汽车配电网风险评估 软件:matpower+Matlab: 关键词:蒙特卡洛.时序.电网风险.风险评估.风光不确定性 介绍:由于电动汽车负荷与风电光伏出力的 ...

  6. Matlab点云处理及可视化第1期—基于KD树的邻域点搜索(柱状邻域、球状邻域及KNN)

    目录 1 概述 2 代码实现 3 可视化验证 数据及完整代码获取方式: 观前提示:本文文字内容请勿直接用于论文写作,否则后果自负. 特别提示:<Matlab点云处理及可视化>系列文章旨在为 ...

  7. MATLAB(SimMechanics)机器人可视化运动仿真-关节位置控制篇

    MATLAB(SimMechanics)机器人可视化运动仿真-关节位置控制篇 摘要: 一 导入机器人URDF模型 二 建立关节电机控制的物理模型 三 仿真结果 1-整体物理模型 2-各关节电机PID位 ...

  8. matlab怎么求三次微分,matlab课设三阶微分方程多种方法求解.doc

    matlab课设三阶微分方程多种方法求解 目录 一.课程设计题目及意义 -------- 1 页 二.课程设计任务及要求 --------2 页 三.课程设计详细过程及结果 --------3至10页 ...

  9. matlab使用杂谈4-偏微分方程求解之pdede函数使用

    matlab使用杂谈4-偏微分方程求解之pdede函数使用 偏微分方程 求解偏微分方程的数值方法 Matlab解偏微分方程 pdepe()函数 pdepe函数使用示例 PDE方程求解格式 PDE方程初 ...

最新文章

  1. R语言message函数、warning()函数和stop()函数输出程序运行健康状态信息实战
  2. Python TCP聊天器
  3. 自然语言处理中的Attention Model:是什么以及为什么[一]
  4. fopen php 读取_PHP使用fopen与file_get_contents读取文件实例分享
  5. CombineFileInputFormat 文件分片总结
  6. Java案例:读取XML文档
  7. Transaction rolled back because it has been marked as rollback-only 原因 和解决方案
  8. 我开发的kvm虚拟化虚拟机批量生产脚本
  9. 在 Linux 上部署 Django 应用,nginx+gunicorn+supervisor
  10. c++字符串加密_【网络爬虫教学】快速定位拼多多加密算法入口(四)
  11. Python 之父:移动设备中的 Python 应用“又大又慢”!
  12. 瑞友天翼应用虚拟化系统V6.0之设备重定向
  13. 《应用时间序列分析:R软件陪同》——2.6 MA 模型
  14. html中字体 楷体_(收藏)css怎么设置字体为楷体?
  15. 使用JQuery TreeTable实现树形表格
  16. The RSpec Book笔记《四》Describing Code with RSpec用RSpec描述代码
  17. Excel入门(一)
  18. android遥控杆控件,Android自定义滑杆控件SeekBar多功能版本
  19. SQL Server Performance 分析
  20. Linux:ftrace: 为什么有些函数没有在available_filter_functions

热门文章

  1. 网站建设如何选择专业的网站建设公司
  2. 【个人成长】《西游记》的至高境界,看懂者无几
  3. Matplotlib任务实现:绘制国民生产总值构成分布饼图
  4. 14.学习Camera之——camera基本知识
  5. 创建一个Node.js项目
  6. 编写一个程序,实现以下功能:(1)输入一系列的学生数据(包括学生的学号、姓名和成绩等基本信息),将学生信息写入二进制文件 student . dat 中。。。。。。
  7. 痔疮需要用php吗,长了痔疮,一定要做手术根除?辟谣:2种情况才考虑切除
  8. 联通物联网卡ICCID号校验位算法
  9. 深耕精品智能小车市场,推动奇瑞新能源品牌产品智能化
  10. 深入解析:如何修复SSL / TLS握手失败错误(中)