绘制混合弧线
在本文档中,我们描述了如何生成的图HybridArc对象的使用HybridPlotBuilder.
内容
设置
首先,我们创建几个HybridArc用作示例的解决方案对象
进口hybrid.examples。*config = HybridSolverConfig(“完善”15);'Refine'选项使绘图更流畅。system = BouncingBall();system_3D = Example3DHybridSystem();Sol =系统。求解([10,0],[0 30],[0 30],配置);sol_3D = system_3D.solve([0;1;0], [0,20], [0,100], config);sol_8D = HybridArc(sol。T, sol.j, sol.x(:, 1)*(1:8));
基本绘图
混合方程工具箱提供了两种方法来绘制混合解决方案,这取决于所需的控制级别。为快速查看解而设计的第一种方法是传递一个HybridArc对象plotFlows,plotJumps,plotHybrid,或plotPhase.的plotFlows函数画出解的每个分量与离散时间的关系.
plotFlows (sol);% x vs. t
的plotJumps函数画出解的每个分量与离散时间的关系.
plotJumps (sol);% x vs. j
的plotHybrid函数绘制出解的每个组成部分与混合时间的关系.
plotHybrid (sol);% x vs. (t, j)
的plotPhase函数绘制二维或三维解向量x在相空间中。
plotPhase (sol);% x1 vs. x2标题(“2D相位图”) snapnow;clf plotPhase(sol_3D) title(“3D相位图”)视图([63.6 28.2])调整视角。
对于含有四个或更少组分的溶液,plotFlows,plotJumps,plotHybrid如图所示,在单独的子图中绘制每个组件。包含五个或更多组件的解决方案被绘制在单个子图中,每种颜色和图例都包括用于标记每个组件。
plotFlows (sol_8D)
第二种绘图方法是使用HybridPlotBuilder类(第一种方法也使用HybridPlotBuilder“在引擎盖下”绘制情节)。这种方法允许广泛的自定义,因此更适合创建用于发布的图。本文的其余部分将讨论如何使用第二种方法。的实例HybridPlotBuilder.
hpb = HybridPlotBuilder();
属性通过调用函数(如下所述)来设置HybridPlotBuilder对象。
hpb.flowColor (“黑”);设置流量颜色为黑色。
要创建绘图,绘图函数之一plotFlows,plotJumps,plotHybrid,或plotPhase被称为。注意,默认情况下不创建子图。
hpb.plotFlows (sol)
在MATLAB R2016a及以后版本中,如果绘图生成器只使用一次,则可以立即使用,而无需将其分配给变量by链接一系列函数调用。
HybridPlotBuilder () .flowColor (“黑”) .plotFlows (sol);
在MATLAB R2016a之前,函数调用不能直接链接到构造函数之后,因此上面的代码必须被分割成一个变量赋值,然后是函数调用:
hpb = HybridPlotBuilder();hpb.flowColor (“黑”) .plotFlows (sol);
自动次要情节
自动子图可以通过调用来启用HybridPlotBuilder.subplots(上).当auto-subplots是“上”而且plotFlows,plotJumps,或plotHybrid调用时,则为每个绘制的状态组件创建子图。另一方面,如果plotPhase调用时,则创建单个子图。如果当前图形以前没有正确的子图数量,则在绘图之前清除该图形。
HybridPlotBuilder () .subplots (“上”) .plotFlows (sol)
当auto-subplots是“关闭”时,所有的图都被放置在当前轴上(默认值为“关闭”).
clf%清晰数字。否则,前面的子情节将被重用。subplot(2, 1, 1)“关闭”).plotFlows(sol_8D) subplot(2,1,2)“关闭”) .plotPhase (sol)轴垫
此时,如果我们调用带有auto-subplots的绘图函数“上”,则该图将重置为正确的子图数。
% <-这里没有'clf'。HybridPlotBuilder () .subplots (“上”) .plotPhase (sol)
选择绘制组件
类中的部分组件通常需要绘制HybridArc对象hybrid_arc.选择…的特定组成部分hybrid_arc,叫hybrid_arc.select (ndxs)在哪里ndxs包含要绘制的分量的指标的向量。然后,简单地将输出传递给其中一个绘图函数。例如,要绘制组件1和2,传递数组[1,2]或(等价)1:2来选择.
clf plotPhase (sol_3D.select ([1, 2]));
若要切换图中组件的顺序,只需切换数组中的顺序。注意标签而且不要更新以反映切换的顺序。
HybridPlotBuilder () .plotPhase (sol_3D.select ((2,1)));
绘制其他值
当使用给定的混合时域时,可以绘制数组中包含的值HybridArc.要完成此操作,请传递aHybridArc对象作为绘图函数的第一个参数,并将值数组作为第二个参数传递。值数组中的行数必须与中的条目数匹配sol.t.
CLF高度= sol.x(:, 1);提取高度分量HybridPlotBuilder()。plotFlows(sol, -height)%地块负高度标题(“消极的高度”) ylabel (“x_1美元”)
方法中的每个时间步都可以计算和绘制函数句柄HybridArc.函数的求值是通过HybridArc.evaluateFunction ().
G = system.gamma;%的重力HybridPlotBuilder()。plotFlows(sol, @(x) g*x(1) + 0.5*x(2)^2); title(的总能量) ylabel (“E美元”)
传递给绘图函数的函数句柄必须有输入参数@ (x),@ (x, t)或@(x, t, j)然后返回一个列向量。
自定义地块外观
下面的函数修改流的外观。
HybridPlotBuilder ()....flowColor (“黑”)....flowLineWidth (2)....flowLineStyle (':')....plotFlows (sol.select (1))
类似地,我们可以改变跳转的外观。
HybridPlotBuilder ()....jumpColor (“米”)...%洋红色.jumpLineWidth (1)....jumpLineStyle (“-”。)....jumpStartMarker (“+”)....jumpStartMarkerSize (16)....jumpEndMarker (“o”)....jumpEndMarkerSize (10)....plotPhase (sol_3D.select (1:2))
来配置上的跳转标记这两个只调用一个函数,忽略函数名中的'Start'和'End':
HybridPlotBuilder ()....jumpMarker (“年代”)...%广场.jumpMarkerSize (12)....plotPhase (sol_3D.select (1:2))
要隐藏跳转或流,将相应的颜色设置为“没有”.若要仅隐藏跳转标记,但显示跳转线,请将标记样式设置为“没有”.类似地,若要只隐藏跳转行,请将跳转行样式设置为“没有”.
HybridPlotBuilder ()....flowColor (“没有”)....jumpEndMarker (“没有”)....jumpLineStyle (“没有”)....plotFlows (sol.select(2)标题(“每跳的开始”)添加标题的另一种方法如下所示。ylabel (“x_2美元”)
可以通过将单元格数组传递给颜色函数来设置颜色序列。当自动子绘图关闭时,每个组件绘制的颜色将通过给定的颜色旋转。下面的命令创建一个绘图,其中第一个组件用蓝色流和红色跳转绘制,第二个组件用黑色流和绿色跳转绘制。(如果解决方案有第三个组件,颜色将循环回到蓝色流动和红色跳跃。)
clf HybridPlotBuilder () .subplots (“关闭”)....flowColor ({“蓝”,“黑”})....jumpColor ({“红色”,“绿色”})....legend (“组件1”,《组件2》)...'legend'函数描述如下。.plotFlows (sol);
当自动子图被启用时,通过对绘图函数的一次调用添加的所有图都是相同的颜色,并且通过对绘图函数的下一次调用添加的所有图都是下一种颜色,以此类推。注意,在这里,我们通过颜色函数。此外,matlab的论点告诉HybridPlotBuilder使用MATLAB绘图使用的默认颜色。
hpb = HybridPlotBuilder().subplots(“上”) .color (matlab的);持有在hpb.legend (“h美元”,“v美元”) .plotFlows (sol);hpb.legend (“2 h美元”,' $ 2 v $ ').plotFlows(sol, @(x) 2*x);hpb.legend (“3 h美元”,“$ 3 v $”).plotFlows(sol, @(x) 3*x);
标题、标签和传说
本节描述如何使用将文本添加到绘图中HybridPlotBuilder.内置的MATLAB函数用于添加标签和标题也可以使用,但使用HybridPlotBuilder提供了轻松配置默认设置(文本大小、解释器等)和使用自动生成的轴标签的能力。内置的传说函数不能处理由HybridPlotBuilder.
轴标签对于状态轴,标签是通过标签函数(或可选的标签如果只有一个标签,则执行该函数)。根据图的类型以及是否启用自动子图,所有组件将被分组到单个标签中,或者每个组件将有自己的标签。如果auto-subplots是,则所有组件都被分组到一个标签中“关闭”图是用plotFlows,plotJumps,或plotHybrid(换句话说,任何绘图函数除了phasePlot).
clf HybridPlotBuilder ()....subplots (“关闭”)...%这是默认值.label (所有组件的)....plotFlows (sol_8D)
或者,每个组件都有自己的组件标签当每个组件都有自己的时候轴-因为每个组件都使用自动子图放置在自己的子图中,或者每个组件在使用自动子图生成的单相图中有自己的轴plotPhase.在这种情况下,每个组件的标签是通过传递多个字符串来设置的HybridPlotBuilder.labels ().
clf HybridPlotBuilder ()....labels (“组件1”,《组件2》)....plotPhase (sol)
如果提供的标签少于组件轴的数量(或者根本不提供标签),则自动生成轴标签。默认格式为,,等等,但是可以通过向函数传递格式字符串来修改xLabelFormat.任何发生' % d '在格式中,字符串被替换为组件的索引号。
clf HybridPlotBuilder () .subplots (“上”)....xLabelFormat (美元的美元Z_ {% d}”)....plotFlows (sol_8D.select (1:4))
连续时间轴和离散时间轴的标签(即,而且)可修改如下。使用空字符串将删除标签。
clf HybridPlotBuilder ()....tLabel (“t [s]美元”)....jLabel (“j[数]美元”)....plotHybrid (sol.select (1))标题
控件可以为每个子情节设置标题标题函数(或可选的标题如果只有一个标题,则执行该函数)。
clf HybridPlotBuilder () .subplots (“上”)....titles (“组件1”,《组件2》)....plotFlows (sol)
如果auto-subplots是“关闭”或者生成一个相位图,然后只有一个子图,因此只使用一个标题。
clf HybridPlotBuilder () .title (相图的) .plotPhase (sol)
传说条目
这个函数HybridPlotBuilder.legend用于向图中添加图例条目。当使用plotPhase,只使用一个图例条目。
clf HybridPlotBuilder () .legend (相图的) .plotPhase (sol);
否则,在使用时plotFlows,plotJumps,或plotHybrid,每个状态组件使用一个图例条目(不管auto-subplots是否为)“上”或“关闭”).
clf HybridPlotBuilder () .color (matlab的)....legend (“组件1”,《组件2》,“组件3”,“组件4”)....plotFlows (sol_8D.select (1:4));
通过重用相同的图形,可以将带有图例条目的其他图形添加到相同的图形中HybridPlotBuilder对象。
clf hpb = HybridPlotBuilder().subplots(“上”) .color (matlab的);hpb.legend (“x_1美元”,“x_2美元”) .plotFlows (sol);持有在hpb.legend (“-x_1美元”,“-x_2美元”) .plotFlows (sol.transform (@ (x) - x))
若要从图例中省略一个组件,请将标签设置为空字符串。
clf HybridPlotBuilder () .subplots (“上”)....legend (”,《组件2》)....plotFlows (sol);
添加到图形中的图形对象HybridPlotBuilder可以通过传递图形句柄来添加到图例addLegendEntry.
clf pb = HybridPlotBuilder().legend(“混合阴谋”) .plotPhase (sol);持有在轴平等的画一个圆。= linspace(0,2 *);Plt_handle = plot(10*cos, 10*sin,)“黑”);将圆圈传递给带有所需图例标签“圆圈”的绘图生成器。。pb.addLegendEntry (plt_handle“圆”);
若要设置图例属性,如位置和方向,请将图例标签传递给HybridPlotBuilder.legend作为单元格数组(用大括号'{}'括起来),并在后续参数中传递名称/值对。看到医生(“传奇”)获取图例属性的描述。
clf HybridPlotBuilder () .subplots (“上”)....legend ({“h”,“v”},“位置”,“eastoutside”)....plotFlows (sol);
上述方法对所有子图中的图例应用相同的设置。要为每个子图分别修改图例选项,请使用configurePlots函数描述如下。
使用了多少标签、标题和图例条目的摘要在本小节中,我们总结并举例说明使用了多少标签、标题和图例条目,这取决于是否启用自动子绘图以及绘图功能的选择。
A *表示该行中的属性对该列中的文本属性没有影响。组件标签标题图例条目Auto-subplots 'off' Auto-subplots 'on' plotPhase() plotFlows(), plotleaps()或plotHybrid()单个(除非plotPhase()) | 单 | * |
多个:每个子图一个标签 | 多个:每个子情节一个标题 | * |
多个:每个轴一个标签 | * | 单 |
单个(除非auto-subplots 'on') | * | 多个:每个组件一个图例条目 |
例子:auto-subplots“关闭”和使用plotFlows,plotJumps或plotHybrid.
clf HybridPlotBuilder () .color (matlab的)....subplots (“关闭”)...%(默认).label (“我的标签”)...% Single: auto-subplots“关闭”并使用plotFlows。.title (“我的名字”)...% Single: auto-subplots“关闭”。.legend (“传奇1”,《传奇2》)...每个组件一个:使用plotFlows.plotFlows (sol);
例子:auto-subplots“上”和使用plotFlows,plotJumps或plotHybrid.
clf HybridPlotBuilder ()....subplots (“上”)....labels (“标签1”,《标签2》)...每个组件一个:auto-subplots是“on”.titles (“标题1”,“标题2”)...每个组件一个:auto-subplots是“on”.legend (“传奇1”,《传奇2》)...每个组件一个:使用plotFlows.plotFlows (sol);
例子:使用plotPhase(auto-subplots没有效果)。
clf HybridPlotBuilder ()....labels (“标签1”,《标签2》)...每个组件一个:使用plotPhase.title (“我的名字”)...% Single:使用plotPhase.legend (“我的传奇”)...% Single:使用plotPhase.plotPhase (sol);文本翻译
默认的文本翻译在HybridPlotBuilder是乳胶.这可以通过调用来改变HybridPlotBuilder.titleInterpreter ()或HybridPlotBuilder.labelInterpreter ()具有以下值之一:“没有”,“泰克斯”,或“乳胶”.默认标签会自动更改以匹配标签解释器。
HybridPlotBuilder () .subplots (“上”)....titleInterpreter (“没有”)....labelInterpreter (“泰克斯”)....titles (在这个图中,“tex”用于标签,“none”用于标题。,...在“tex”中,美元符号并不表示切换到数学模式)....labels (“z_1”,“z_2美元”)....plotFlows (sol)
过滤解决方案
方法可以隐藏解的部分过滤器函数。在这个例子中,我们创建了一个过滤器,它只包含第二个分量(速度)为负的点。(如果沿着流的时间步长很大,连接到过滤点的删除线可能会延伸一个明显的距离到应该可见的解的部分。)
Is_falling = sol.x(:,2) < 0;HybridPlotBuilder () .subplots (“上”)....filter (is_falling)....plotFlows (sol)示例:绘制系统模式
当系统的整值组件表示系统的模式时,过滤非常有用。在这里,我们创建了一个具有连续变量的3D系统一个离散变量.解中的点在哪里用蓝色标出,点在哪里用黑色标出。相同的HybridPlotBuilder对象用于两个绘图,方法是将其保存到构建器变量(这允许我们只指定一次标签,并为两个图添加一个图例)。
clf system_with_modes = hybrid.examples.ExampleModesHybridSystem();创建初始条件并求解。Z0 = [-7;7);Q0 = 0;Sol_modes = system_with_modes.solve([z0;Q0], [0,10], [0,10],“沉默”);提取q分量的值。Q = sol_modes。x (: 3);的[1,2]分量(即前两个分量)% sol_modes在q == 0的所有时间步。builder = HybridPlotBuilder();builder.title (相图的)....labels (“x_1美元”,“x_2美元”)....legend ('$q = 0$')....filter(q == 0)...%只有q = 0的点。.plotPhase (sol_modes.select ([1, 2]))在参见下面关于“坚持”的部分用黑色标出一直以来的解(仍然只有[1,2]组分)%步骤,其中q == 1。builder.flowColor (“黑”)....jumpColor (“没有”)....legend ('$q = 1$')....filter(q == 1)...%只有q = 1的点。.plotPhase (sol_modes.select([1, 2]))轴垫轴平等的示例:显示弹跳球上升和下降的时间
对于弹跳球系统,我们可以根据球是否下落来改变图的颜色。
CLF is_falling = sol.x(:, 2) < 0;pb = HybridPlotBuilder().....subplots (“上”)....filter (is_falling)....jumpColor (“没有”)....flowColor (“k”)....legend (“下降”,“下降”)....plotFlows (sol);持有在pb.filter (~ is_falling)....flowColor (‘g’)....legend (“上升”,“上升”)....plotFlows (sol);
替换与添加图形
默认情况下,每次调用一个HybridPlotBuilder图函数覆盖前面的图。在下面的代码中,我们调用plotFlows两次。第一个调用以蓝色和红色绘制解决方案,但第二个调用重置图形并以黑色和绿色绘制解决方案。
Tspan = [0 10];Jspan = [0 30];Sol1 = system。解析([10,0],tspan, jspan, config);Sol2 =体系。解析([5,10],tspan, jspan, config);clf HybridPlotBuilder ()...默认绘制蓝色流和红色跳转。.plotFlows (sol1.select (1) HybridPlotBuilder () .flowColor (“黑”) .jumpColor (“绿色”)....title (“多次调用$\texttt{plotFlows}$与\texttt{hold off}”)....plotFlows (sol2.select (1))
若要在同一图形上绘制多个图形,请使用抓住,类似于标准的MATLAB绘图函数。
clf HybridPlotBuilder () .plotFlows (sol1.select (1))默认绘制蓝色流和红色跳转。持有在HybridPlotBuilder () .flowColor (“黑”) .jumpColor (“绿色”)....title (“多次调用$\texttt{plotFlows}$与\texttt{hold on}”)....plotFlows (sol2.select (1))
修改默认值
all的默认值HybridPlotBuilder可以通过调用'defaults'属性上的'set'来修改设置。参数必须是名称-值对,其中名称是与PlotSettings中的一个属性匹配的字符串(名称不区分大小写,下划线可以替换为空格)。
clf HybridPlotBuilder.defaults.set (“auto_subplots”,“上”,...的标签尺寸14岁的...“标题大小”, 16岁,...商标翻译的,“泰克斯”,...标题翻译的,“没有”,...“flow_color”,“k”,...“流线宽度”2,...“jump_color”,“k”,...“跳线宽度”2,...“跳线风格”,':',...“跳转开始标记”,“年代”,...“跳转开始标记大小”10...“跳跃结束标记”,“没有”,...“x_label_format”,“z_ {% d}’,...“t_label”,“t [s]”) HybridPlotBuilder ()....title (“标题”)....legend (“传奇”,“传说B”)....plotFlows (sol);
可以使用以下命令将缺省值重置为原始值。
HybridPlotBuilder.defaults.reset ()设置默认缩放
MATLAB对不同设备上的图形和文字的大小不一致。为了减少这种差异,设置中包含了三个值来调整文本、行和标记的大小。
clf HybridPlotBuilder.defaults.set (“文本规模”, 1.5,...“行规模”3,...“标记规模”, 2)示例输出:HybridPlotBuilder ()....title (“标题”)....legend (“高度”)....plotFlows (sol.select (1));HybridPlotBuilder.defaults.reset ()%的清理
要在每个MATLAB会话中设置默认值,请创建名为“startup”的脚本。返回的文件夹中的userpath ()命令。该脚本中的命令将在MATLAB每次启动时运行。
额外的配置
有许多选项用于配置MATLAB图的外观,这些选项没有明确包含在HybridPlotBuilder(见在这里).对于具有单个子图的图,外观可以像任何其他MATLAB图一样进行修改。
HybridPlotBuilder () .plotPhase (sol);网格在Ax = gca;斧子。YAxisLocation =“对”;
具有多个子图的图也可以按上面所述通过调用Subplot (2,1,1)做出想要的修改,然后打电话副图(2,1,2)等等,但这种方法是混乱和乏味的。相反,configurePlots函数提供了一个更干净的替代方案。函数句柄被传递给configurePlots,然后由HybridPlotBuilder在每个(子)图中。传递给的函数句柄configurePlots必须接受两个输入参数。第一个是子图的坐标轴,第二个是图中绘制的状态成分的索引。为plotFlows,plotJumps,plotHybrid,这将是一个整数,并为相图生成与情节,这将是一个由两个或三个整数组成的向量,这取决于绘图的维数。
clf HybridPlotBuilder ()....subplots (“上”)....legend (“一个”,“B”)....configurePlots (@apply_plot_settings)....plotFlows (sol);函数Apply_plot_settings (ax, component_ndxs) title(ax, sprintf(这是分量%d的图, component_ndxs))在每个图中设置图例的位置到不同的位置。开关component_ndxs情况下1 ax.Legend.Location =“东北”;情况下2 ax.Legend.Location =“东南”;结束%配置网格网格(ax,“上”)网格(ax,“小”斧头。GridLineStyle =“——”;结束