技术标签: # MATLAB 笔记 可视化 单摆 MATLAB 常微分
这是一期将单摆微分方程可视化的博文,我们都知道单摆常微分方程求解过程中会涉及到椭圆积分,难以用常见函数表示其结果,所以我们这篇博文想办法将其数值解可视化。
其中横坐标为: θ ( 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π]
首先我们有微分方程:
θ ¨ ( t ) = − μ θ ˙ ( t ) − g L s i n ( θ ( t ) ) \ddot{\theta}(t)=-\mu\dot{\theta}(t)-\frac g Lsin(\theta(t)) θ¨(t)=−μθ˙(t)−Lgsin(θ(t))
我们将其变形得到微分方程组:
d d t [ θ ( t ) θ ˙ ( t ) ] = [ θ ˙ ( t ) θ ¨ ( t ) ] = [ θ ˙ ( t ) − μ θ ˙ ( t ) − g L s i n ( θ ( 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)−Lgsin(θ(t))]
对此我们均匀的在平面上取点,并计算不同 [ θ ( t ) θ ˙ ( t ) ] \begin{bmatrix} \theta(t)\\\dot{\theta}(t) \end{bmatrix} [θ(t)θ˙(t)]对应的 d d t [ θ ( t ) θ ˙ ( t ) ] \frac d {dt} \begin{bmatrix} \theta(t)\\\dot{\theta}(t) \end{bmatrix} dtd[θ(t)θ˙(t)]就可完成微分方程的可视化。
如果你看过我之前写的小游戏,可会下意识的这样写:
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)
就得到了效果图中的背景:
只需要 写一个双层for循环计算方向向量,将其归一化后画在图中,并且根据不同的长度为其赋予不同的颜色就好了
for i=(-2.5+1/6:1/6:2.5-1/6).*pi
for j=(-2+1/4:1/4:2-1/4).*pi
a=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)
end
end
end
其中f,pos_exchange,color_exchange三个匿名函数为:
%=========================================================
[email protected](theta,M,g,L) [theta(2),-M*theta(2)-g/L*sin(theta(1))];
%theta(1) ->theta
%theta(2) ->theta'
%==============================================
[email protected](pos) pos./[pi*5,pi*4]+[0.5,0.5];
%==============================================
color_map=[0.9725 0.3804 0.3529
0.9725 0.3804 0.3529
0.9020 0.3843 0.3765
0.9020 0.3843 0.3765
0.9333 0.4118 0.3765
0.9686 0.5804 0.2235
0.9765 0.8392 0.1098
0.9882 0.9804 0.0588
0.7961 0.8353 0.2510
0.6510 0.7373 0.2000
0.5961 0.7059 0.4039];
[email protected](value,maxvalue,color_map) color_map(12-(floor(value/(maxvalue/11))+1),:);
%=========================================================================================
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.3529
0.9725 0.3804 0.3529
0.9020 0.3843 0.3765
0.9020 0.3843 0.3765
0.9333 0.4118 0.3765
0.9686 0.5804 0.2235
0.9765 0.8392 0.1098
0.9882 0.9804 0.0588
0.7961 0.8353 0.2510
0.6510 0.7373 0.2000
0.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 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)
for i=(-2.5+1/6:1/6:2.5-1/6).*pi
for j=(-2+1/4:1/4:2-1/4).*pi
a=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)
end
end
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
Xcode5中创建一个工程的时候,系统会自动创建一个以以工程名为名字的pch(Precompile Prefix Header)文件,开发的过程中可以将广泛使用的头文件以及宏包含在该文件下,编译器就会自动的将pch文件中的头文件添加到所有的源文件中去,这样在需要使用相关类的时候不需要使用import就可以直接使用头文件中的内容,很大程度上给程序员带来了编程的便利性。但是在Xcode6中去掉P...
/***** * @param $path 上传到本地的文件路径 * @param $url 请求的 url * @param $uid 操作人id * @param $position 请求发起的位置 * @return mixed|stri...
vscode配置总结可收藏/vscode用户设置大全/vue代码模板,vscodevue//用户设置{//-------- 搜索配置 --------"search.exclude": {"**/node_modules": true,"**/bower_components": true,"**/.git": true,"**/.DS_Store": true,"**/*.meta": tr...
prefacenginx 这个问题 还是上周 需要记录的, 最近公司 要倒闭了, 跟着老板 去了另一个公司,两边跑,有些累,今天记录下问题我们开发了一个 社区管理系统, 本来只有我前台页面写了一套 静态页面。通过 定时器 模拟了登录,请求等过程。后来后台开发了接口,然后我们本地连调没有问题,上了测试站, 登录后总是显示 status code 401 。后来查看日志 后台说 没有收到 tok...
SQL Server中一共提供了三个字符串截取函数:LEFT()、RIGHT()、SUBSTRING()。一、LEFT()函数函数说明如下:语法:LEFT(character,integer)。参数介绍:参数1:要截取的字符串,参数2:截取字符个数。返回值:返回从字符串左边开始指定个数的字符。示例SQL:select LEFT('SQLServer_2012',3)。...
题目链接:http://www.acdream.net/problem.php?id=1018题意:给出一棵树,每个节点有一个值w。若干询问,每个询问s,t,a,b,k,询问从s节点走到t节点权值在[a,b]之间的第k个节点。思路:(1)首先把从根出发到每个点的权值分布用函数式线段树全部记录,则通过函数式线段树的减法操作以及计算两个点LCA就可以得到任意两个点路径上权值a到b的点个数。...
目录前言题目二分频电路第一步:画波形图第二步:写状态机三分频电路前言最近又到了招聘季,招聘就离不开笔试面试,而在笔试面试过程中经常出现的一道题就是写出分频电路的verilog代码(以及电路图?),因此在这篇文章里,我们使用一个公式将所有分频电路套进去,以便于在考场上和仿真工具中轻松实现分频电路。题目实现2/3/4/5分频电路,给出一个模板:modul...
新安装的 lnmp 环境,将项目放上报 require(): open_basedir restriction in effect. File 的错误! 错误日志显示,访问脚本不在 open_basedir的限定目录里面,配置open_...
过起点,终点,通过控制点 绘制出一条n阶贝塞尔曲线
环境准备1.导入Azure Kinect Examples for Unity.unitypackage2.package Manager中下载两个插件Visual Effect GraphHigh Definition RP3.在Project中创建一个HDRenderPipelineAsset并添加到ProjectSettings Graphics中...
Jpa把名字写好就不用写sql了,增加了代码可移植性~OK,下面就是名称规则:直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:JpaRepository会对方法名进行校验 不符合规范会报错 除非添加@Query注解Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如 find、findBy、read、readBy、get、g...
安装mongo数据库,在shell下输入sudo apt-get install mongodb如果需要在Python中使用mongo数据库,还需要额外安装Python封装库pip install pymongo 检测安装是否成功,可以使用下面命令在本地启动MongoDBmongod -dbpath . 在shell中输入mongo,就可以进入mongo数据库查询...