PID

相信有不少做系统控制的同学听过 PID 控制,在网上我们可以随便找到很多关于这种控 制理论的不同的解释和教程。可是经典的 PID 控制讲解都是用控制热水炉或者控制水阀 开阖以控制水的流量这两个例子进行讲解的。那么对于做四轴飞行器的同学来说,可能就 比较难把这两个案例和四轴飞行器联系起来了。而且经典的 PID 讲解,都是通过教科书 式的语言进行讲解,又用了一大堆复杂的数学符号,且非常短的数学推导过程进行讲解, 而且基本上没有对例子本身进行建模以及对模型的推到进行详细解释。

针对现存的 PID 讲解资料,特别是中文版本的相关资料,的缺陷,本文通过四轴飞行器 的简化版本,翘翘板模型,对 PID 算法进行形象化的解释,并且对翘翘板模型本身进行 详细的建模推倒,以确保即使是对物理不太熟悉的同学都能够比较好的理解 PID 算法, 以及模型的推倒过程。通过对本文的举一反三,可以比较容易对四轴飞行器进行建模,以 及使用 PID 算法进行相关的控制。

实际应用场景分析

在介绍 PID 控制之前,作者希望先简单说说为什么要有这种控制算法或者说方法。面对 一个应用场景,相比于其他的解决方式,如果通过 PID 控制来解决同样的事情,却让问 题处理起来更加复杂,那么这种方法大概就不会存在了,或者说这种方法在处理效果上必 须必其他方法有显著的优越性。对于 PID 控制来说,相比于其他的解决方式,它让问题 处理起来更加简单,而且让一类的问题有统一的解决方式,而不需要针对特定的问题进行 特定的处理,所以 PID 算法才会经久不衰。

我们就来考虑四轴飞行器这个实际应用的场景好了。四轴飞行器我们可以控制它四个马达 的 PWM 来间接地控制四轴飞行器每个螺旋桨的转速,这里有一个需要注意的地方,就是 我们是间接的控制飞行器的转速的,而不是直接决定其螺旋桨的转速的。我们可以控制的 PWM 与螺旋桨之间的关系是正相关,大致是线性的关系(即等比例增加),但是精确的 关系曲线绝对不是一条直线,即非线性的。即使这个关系是线性的,那么要通过物理学推 倒,来精确地求出在一定的飞行器姿态下,我们每个螺旋桨应该输出多少动力,这个推倒 过程也是一个苦力活,而且这种推倒就只适用于四轴飞行器,更精确地说,是通过精确测 量的那一台四轴飞行器。只要飞行器的外形变一下,例如螺旋桨到飞行器中心的轴距稍微 变化了,那么整个模型就要重新计算了。这种解决方式非常反人类。何况输出动力与螺旋 桨的实际转速根本就不是一个简单的物理学公式可以计算出来的,而且每台飞行器都有不 同的物理参数,我们也不可能真对每台飞行器进行精确的测量。所以我们必须找一种没有 复杂的建模过程、计算简单、且对细微的物理量变化不敏感的方式来解决这些现实的问题。

现在我们想象我们就是那台飞行器,或者说我们坐在那台飞行器里面,而且我们的反应足 够快,可以实时地改变飞行器的输出动力。那如果以人类的直观感知,其实要控制那台飞 行器是非常容易的:飞行器向一边歪了,我们就加大那一边的动力,让飞行器向相反的方 向动就可以了。那么问题又来了,因为动力是我们可以控制的,那么我们应该输出多少的 动力才算合适呢?其实答案也不复杂:如果往一边歪得越厉害,那么我们就越应该输出更 大的动力。

但这就是完整的答案了吗?不是的。我们还要考虑一个问题,就是飞行器的惯性:如果我 们的策略是歪得越厉害,输出的反向动力就等比例地越高,那么可以想象,当飞行器歪得 很厉害之后,由于一直输出反向动力,当飞行器的姿态处于水平位置的时候,飞行器机身 必然由于惯性,积累了一个很大的转动惯量,也就是说,即使这个时候所有螺旋桨都停止 了,飞行器还是会继续打转的。产生这种问题的原因是在转到平衡位置之前,积累了太多 的转动惯量了,所以解决这个问题的方式也很简单:只要在调整的时候,稍微让输出的动 力少一点,那么在达到平衡位置的时候积累的转动惯量就没有那么多了,经过反复的几次 动态调整,理论上飞行器就能够动态地稳定在平衡位置上了。

那么现在这是完整的答案了吗?在大多数情况下,这个答案已经够用了,可是在某些情况 下,或者说在理论上,还是有缺陷的。这个缺陷就是所谓的静态误差,即用一根绳子吊住 静止的四轴飞行器的中心点,让其自己达到平衡,但是由于飞行器在真实的物理世界中质 量分布不可能完全对称,所以即使在其静止的情况下,也会往一边偏。可是这又有什么影 响呢?这是有影响的,可是这个影响不太好想象的到。我们首先考虑飞行器没有稳态误差 的情况,即飞行器质量分布均匀。在这种情况袭,飞行器会通过前两种调整,达到平衡状 态,而平衡状态就是飞行器处于水平的位置。如果有稳态误差,实际上就是相当于在飞行 器达到了动态平衡的时候,再往某侧挂一个重物,这个时候飞行器就会由于有一个悬挂的 重物而失去平衡,相对于水平位置有一个歪斜的角度。那么这个歪斜的角度不是可以继续 通过上述的两种调整方式调节回来吗?不好想象的地方就在这里了:的确不可以。由于输 出的动力是根据倾斜的角度按照一定的比例输出的,所以倾斜的角度一定,那么输出的动 力也就是一定的,而当这个由于倾斜的角度所输出的动力,与悬挂的重物产生的重力相等 的时候,飞行器就达到了动态平衡,即稳态。可是这个稳态并不是平衡位置,而是使得输 出的动力与悬挂的重物的重力相等的倾斜角度。那么这个问题怎么解决呢?解决的方式有 一点点麻烦,但是也不至于不能想象:我们只需要每次在进行控制调整的时候,都按照当 前倾斜的角度,以一个非常非常小的比例进行反向控制的输出动力累积,累积的值叠加到 输出动力进行控制即可。这样做的效果是:由于累积的比例很小,所以当飞行器不在稳态 的时候,由于左右前后不断的颠簸,所以这个累积的值加加减减,始终没有起到什么影响; 但是当飞行器处于稳态的时候,由于一直有一个单向的倾斜,所以这个累积比例非常小的 值会慢慢增大,使得飞行器慢慢处于水平位置。这样到最后飞行器就可以始终保持在我们 期待的水平位置了。

而 PID 算法正是结合了以上三种控制特点的一种动态系统控制方式,并且分别通过三个 量化的测量值对动态系统进行有效的控制。

PID 分别是三个英语单词的缩写,即比例(Proportional)、积分(Integral)、 微分(Differential)。PID 控制的名字来源于它是对一个目标控制量的比例、积分、 微分结果不断地进行观测,并且根据观测的结果,通过可以控制的变量,对目标控制量进 行相关的控制。实际上,上述的三种控制特征就是 PID 控制名称中三个单词所对应的具 体内容:比例控制就是上述的第一点,即根据观察值的偏差等比例地反向调控输出;微分 控制对应上述的第二点,即以观察值的微分量按照一定比例削弱比例控制的调控程度,使 得动态系统能够逐渐稳定在平衡位置;积分控制则对应最后一点,即以观察值的积分按照 一个非常小的比例叠加在控制输出上,以消除稳态误差。

大家可能发现了,整个 PID 控制的过程,只需要知道观察值以及控制输出,根本没有针 对特定问题进行建模,而且 PID 控制的内涵也是可以比较直观地解释出来的。在现实生 活中,有很多模型因为有很多耦合因素,所以难以通过物理推倒得出其精确的模型;同时, 有很多参数因为条件限制,例如传感器无法测量或者精度不够,而不能满足精准模型。这 个时候,通过 PID 进行控制就有很大的优势了,因为 PID 控制虽然最后也需要量化观 察输入以及控制输出,但是相对于物理模型,它更像是通过定性分析来解决问题,而且省 略了物理模型内在的耦合变化,只需要直接地观察输入以及根据 PID 通用的法则控制相 应的反馈输出即可。所以 PID 控制实际上是提供了一种针对动态系统反馈调整的通用方 法,简便大家处理实际问题。

理论分析

//todo

跷跷板模型

对于初学者,在演示 PID 算法的效果时,使用的模型越简单越容易理解,当掌握了相关 的知识和原理后,可以再举一反三地进行类比和应用。所以在本文中,我们将使用最简单 的动态系统,即翘翘板模型,以演示 PID 算法的效果。之所以说翘翘板模型简单,是因 为该模型只有一个自由度,几乎没有需要考虑的动态变化耦合。当然 PID 算法比较经典 的应用场景是四轴飞行器的动态稳定控制,但是在初学的时候就马上研究这种复杂的动态 系统模型对于理解 PID 算法的本质很不利,因为更多的时间都被用来考虑四轴飞行器建 模本身了,而不是 PID 算法的本质。所以在本文中,我们尽量选用最简单的模型进行讲 解,以便大家理解 PID 算法的本质。

考虑如下图的跷跷板模型:

Seesaw model

跷跷板中间位置附近有一个固定点,跷跷板可以绕其旋转,但是没有地面,所以不会触地, 因此能够 360 度旋转。跷跷板左右两侧分别有两个螺旋桨,可以提供向上的升力,但是 不能够反向旋转提供向下的拉力。我们的目标是通过控制两侧螺旋桨的转动,使得跷跷板 保持水平。

为了简化模型,我们假定跷跷板的质量密度均匀分布,左右两侧的螺旋桨质量忽略不计。 而跷跷板的固定点并不在中心,所以总是会向某一个方向倾斜。在进行跷跷板模型模拟的 时候,我们可以得知跷跷板的模型参数,但是在进行控制的时候,我们假定控制机构无法 得知这些外部信息,只能够通过有限的可感知信息进行控制调整。这个时候跷跷板由于重 力影响而不能在水平姿态上平衡,这种效果可以模拟由于外部因素而导致的系统处于非稳 态的情况。而进一步的模拟设置可以考虑增加随机噪声影响,用于模拟更真实的外部因素 影响情况。

这个模型是有实际意义的,原因在于在:

  1. 该模型中,两侧的跷跷板可以考虑为一个质点。而由于质量密度均匀,所以质点总 是在跷跷板的中心。而在实际中,我们可以通过对真实跷跷板的测量,得到两侧跷跷板 的质心与它们的质量。这个时候就可以与本模型进行相同的处理了。

  2. 对于外部因素而导致的无法处于水平稳态的情况,可以通过重力、随机噪声两个因 素模拟,得到与真实环境相似的效果。

  3. 输入给控制机构的可感知参数可以进行限制,使得控制机构只能够获得部分参数。 这些参数可以根据现实中传感器可获知的参数进行确定。而且可以在进行参数输入之 前,加入随机噪声,模拟更真实的传感器感知情况。

我们的模拟系统包括两个部分,分别是跷跷板模型的模拟,以及控制机构。

物理学概念

在该模型中,我们需要用到一些物理学概念进行建模。为了方便回顾相关的物理学知识, 以下提供在该模型建模过程中需要用到的物理学概念。

力矩 $( M )$

力矩(Moment of Force)力对物体产生转动作用的物理量,是矢量。力矩在物理学里 是指作用力使物体绕着转动轴或支点转动的趋向。力矩的单位是牛顿-米。力矩希腊字母 是 $( \tau )$。力矩能够使物体改变其旋转运动。推挤或拖拉涉及到作用力,而扭转 则涉及到力矩。力矩等于径向矢量与作用力的叉积。

$$ \vec{M} = \vec{L} \times \vec{F} $$

其中 $( \vec{L} )$ 是从转动轴到着力点的距离矢量,$( \vec{F} )$ 是矢量力, 力矩也是矢量。

转动惯量 $( I )$

转动惯量(Moment of Inertia)是刚体绕轴转动时惯性(回转物体保持其匀速圆周 运动或静止的特性)的量度,是标量。转动惯量用字母 $( I )$ 或 $( J )$ 表示, 单位为 $( kg \cdot m^{2} )$ 。

对于一个质点,

$$ I = mr^{2} $$

其中 $( m )$ 是其质量,$( r )$ 是质点和转轴的垂直距离。转动惯量在旋转动力 学中的角色相当于线性动力学中的质量,可形式地理解为一个物体对于旋转运动的惯性, 用于建立角动量、角速度、力矩和角加速度等数个量之间的关系。

角加速度 $( \alpha )$

角加速度描述刚体角速度的大小和方向对时间变化率的物理量,在国际单位制中,单位 是弧度/秒平方,通常是用希腊字母 $( \alpha )$ 来表示。

$$ \vec{\alpha} = \frac{ d \vec{\omega} }{ dt } $$

其中 $( \vec{\omega} )$ 是角速度,$( t )$ 是时间。

$$ \vec{\alpha} = \frac{ \vec{M} }{ I } $$

其中 $( \vec{M} )$ 是力矩,$( I )$ 是转动惯量。

模型建模

这个建模的目的是进行控制机构外部环境的模拟,而并不是为了给控制机构的控制提供模 型。我们通过角加速度在时间上的累积进行跷跷板模型的模拟,所以在建模步骤,只要得 到最终的跷跷板角加速度即可。

如本节最开始的跷跷板模型示意图所示,我们对跷跷板的模型参数进行标记:

  • 跷跷板左右两侧的板长分别是 $( l_{1} )$ 和 $( l_{2} )$;

  • 跷跷板左右两侧的板质量分别是 $( m_{1} )$ 和 $( m_{2} )$;

  • 由于我们已经假设跷跷板的质量密度均匀,所以跷跷板两侧板的质心都分别在它们的 中心,因此由转轴指向质心的径向矢量分别从跷跷板的固定点指向两侧板的中心位置, 并记作 $( \vec{L_{1}} )$ 和 $( \vec{L_{2}} )$;

  • 跷跷板两侧螺旋桨提供的升力分别记作 $( \vec{F_{1}} )$ 和 $( \vec{F_{2}} )$, 设它们的大小分别为 $( f_{1} )$ 和 $( f_{2} )$;

  • 跷跷板倾斜的角度通过右侧板与水平位置的夹角进行确定,当跷跷板右侧板向上倾斜 的时候为正方向,反之为反方向,记作 $( \theta )$,范围是 $( \left[ - \infty, \infty \right] )$。

我们首先忽略螺旋桨提供的升力,对跷跷板仅受重力的情况进行建模。跷跷板受到的重力 作用在其两侧的板上会产生相应的力矩。而因为左右两侧的板长并不一样,因此不平衡的 力矩会产生相应的角加速度。由于向量外积运算需要在三维空间中进行,所以以下运算均 在 $( Oxyz )$ 空间中进行,且跷跷板在 $( Oxy )$ 平面上。

两侧跷跷板受重力作用产生的力矩分别记作 $( \vec{M_{1}} )$ 和 $( \vec{M_{2}} )$, 分别为:

$$ \vec{M_{1}} = \vec{L_{1}} \times \vec{G_{1}} $$

$$ \vec{M_{2}} = \vec{L_{2}} \times \vec{G_{2}} $$

其中 $( \vec{L_{1}} )$ 和 $( \vec{L_{2}} )$ 分别是跷跷板固定点,即转 轴,到跷跷板两侧质心的径向矢量。而 $( \vec{G_{1}} )$ 和 $( \vec{G_{2}} )$ 分别是左右两侧跷跷板受到的重力。

转轴到跷跷板两侧质心的径向矢量分别为:

$$ \vec{L_{1}} = \left( - \frac{1}{2} l_{1} \cos \theta , - \frac{1}{2} l_{1} \sin \theta , 0 \right) $$

$$ \vec{L_{2}} = \left( + \frac{1}{2} l_{2} \cos \theta , + \frac{1}{2} l_{2} \sin \theta , 0 \right) $$

跷跷板两侧受到的重力分别为:

$$ \vec{G_{1}} = \left( 0 , - m_{1} g , 0 \right) $$

$$ \vec{G_{1}} = \left( 0 , - m_{2} g , 0 \right) $$

根据向量外积计算法则:

$$ \vec{V_{1}} \times \vec{V_{2}} = \left( l , m , n \right) \times \left( o , p , q \right) = \left( mq - np , no - lq , lp - mo \right) $$

可以得到跷跷板两侧由于重力作用产生的力矩分别为:

$$ \vec{M_{1}} = \vec{L_{1}} \times \vec{G_{1}} = \left( 0 , 0 , + \frac{1}{2} l_{1} m_{1} g \cos \theta \right) $$

$$ \vec{M_{2}} = \vec{L_{2}} \times \vec{G_{2}} = \left( 0 , 0 , - \frac{1}{2} l_{2} m_{2} g \cos \theta \right) $$

现在,我们考虑两侧螺旋桨提供的升力影响。

两侧跷跷板受升力作用产生的力矩分别记作 $( \vec{M_{F_{1}}} )$ 和 $( \vec{M_{F_{2}}} )$,分别为:

$$ \vec{M_{F_{1}}} = \vec{L_{F_{1}}} \times \vec{F_{1}} $$

$$ \vec{M_{F_{2}}} = \vec{L_{F_{2}}} \times \vec{F_{2}} $$

其中 $( \vec{L_{F_{1}}} )$ 和 $( \vec{L_{F_{2}}} )$ 分别是 跷跷板转轴,到跷跷板两侧螺旋桨的径向矢量。而 $( \vec{F_{1}} )$ 和 $( \vec{F_{2}} )$ 分别是左右两侧跷跷板受到的升力。

由于升力在跷跷板两端,所以由转轴到升力的径向矢量分别为:

$$ \vec{L_{F_{1}}} = \left( - l_{1} \cos \theta , - l_{1} \sin \theta , 0 \right) $$

$$ \vec{L_{F_{2}}} = \left( + l_{2} \cos \theta , + l_{2} \sin \theta , 0 \right) $$

由于我们已设跷跷板两侧受到的升力大小分别为:

$$ \left| \vec{F_{1}} \right| = f_{1} $$

$$ \left| \vec{F_{2}} \right| = f_{2} $$

所以升力分别为:

$$ \vec{F_{1}} = \left( - f_{1} \sin \theta , f_{1} \cos \theta, 0 \right) $$

$$ \vec{F_{2}} = \left( - f_{2} \sin \theta , f_{2} \cos \theta, 0 \right) $$

根据向量外积定义,可以得到跷跷板两侧受升力作用产生的力矩分别为:

$$ \vec{M_{F_{1}}} = \vec{L_{F_{1}}} \times \vec{F_{1}} = \left( 0 , 0 , - l_{1} f_{1} \left( \sin^{2} \theta + \cos^{2} \theta \right) \right) = \left( 0 , 0 , - l_{1} f_{1} \right) $$

$$ \vec{M_{F_{2}}} = \vec{L_{F_{2}}} \times \vec{F_{2}} = \left( 0 , 0 , + l_{2} f_{2} \left( \sin^2 \theta + \cos^2 \theta \right) \right) = \left( 0 , 0 , + l_{2} f_{2} \right) $$

综上,跷跷板受到的合力矩为:

$$ \vec{M_{G+F}} = \vec{M_{G}} + \vec{M_{F}} = \left( \vec{M_{1}} + \vec{M_{2}} \right) + \left( \vec{M_{F_{1}}} + \vec{M_{F_{2}}} \right) $$

其中,$( \vec{M_{G}} )$ 为跷跷板受到的由于重力作用所产生的合力矩, $( \vec{M_{F}} )$ 为跷跷板受到的由于升力作用所产生的合力矩。

计算可得,跷跷板受到的合力矩为:

$$ \vec{M_{G+F}} = \left( 0 , 0 , + \frac{1}{2} l_{1} m_{1} g \cos \theta - \frac{1}{2} l_{2} m_{2} g \cos \theta - l_{1} f_{1} + l_{2} f_{2} \right) $$

需要获得跷跷板的角加速度,还需要得到跷跷板的转动惯量。

根据定义,可知两侧跷跷板的转动惯量分别为:

$$ I_{1} = m_{1} \left| \vec{L_{1}} \right|^2 = \frac{1}{4} m_{1} l_{1}^2 $$

$$ I_{2} = m_{2} \left| \vec{L_{2}} \right|^2 = \frac{1}{4} m_{2} l_{2}^2 $$

根据转动惯量叠加原理,跷跷板的合转动惯量为

$$ I = I_{1} + I_{2} = \frac{1}{4} \left( m_{1} l_{1}^2 + m_{2} l_{2}^2 \right) $$

根据定义,可以得到跷跷板的角加速度为:

$$ \vec{\alpha} = \frac{ \vec{M_{G+F}} }{ I } = \left( 0 , 0 , \frac{ + \left( \frac{l_{1}}{2} \right) m_{1} g \cos \theta - \left( \frac{l_{2}}{2} \right) m_{2} g \cos \theta - l_{1} f_{1} + l_{2} f_{2} }{ \left( \frac{l_{1}}{2} \right)^2 m_{1} + \left( \frac{l_{2}}{2} \right)^2 m_{2} } \right) $$

则跷跷板的角加速度在 $( Oz )$ 轴的分量为:

$$ \alpha_{z} = \frac{ + \left( \frac{l_{1}}{2} \right) m_{1} g \cos \theta - \left( \frac{l_{2}}{2} \right) m_{2} g \cos \theta - l_{1} f_{1} + l_{2} f_{2} }{ \left( \frac{l_{1}}{2} \right)^2 m_{1} + \left( \frac{l_{2}}{2} \right)^2 m_{2} } $$

因为跷跷板的角加速度分量完全在 $( Oz )$ 轴上,所以其大小可以表示为:

$$ \left| \vec{\alpha} \right| = \left| \alpha_{z} \right| $$

从 $( Oz )$ 轴正方向看下去,当 $( \alpha_{z} < 0 )$ 时,跷跷板往顺时针方 向加速;当 $( \alpha_{z} > 0 )$ 时,跷跷板往逆时针方向加速。

模型模拟

对跷跷板模型的模拟,模拟的结果是得到跷跷板的当前状态,包括跷跷板的当前姿态、角 速度、角加速度等。在上一节的跷跷板模型建模中,我们得到了跷跷板最终的角加速度 $( \alpha )$。我们可以通过其在时间上的累积进行相应的模拟。

跷跷板当前的角速度为:

$$ \vec{\omega} = \vec{\omega_{0}} + \int_{t_{0}}^{t} \vec{\alpha(t)} dt $$

其中 $( \vec{\omega_{0}} )$ 是在模拟起始时刻跷跷板的角速度,$( t_{0} )$ 是模拟的起始时刻,$( \vec{\alpha(t)} )$ 是跷跷板在 $( t )$ 时刻的角加速 度。在任意时刻的即时角加速度,只需要将该时刻的跷跷板姿态等参数代入上一节建立的 跷跷板模型,即可通过计算得到。

由于在计算机中只能计算离散量,所以需要将上述公式离散化,只需要把模拟器的时间精 度 $( \Delta t )$ 当作时间的微分 $( dt )$ 即可。离散化后的角速度为:

$$ \vec{\omega} = \vec{\omega_{0}} + \sum_{t = 0}^{N} \vec{\alpha(t)} \cdot \Delta t $$

其中 $( \vec{\omega_{0}} )$ 是在模拟起始时刻跷跷板的角速度。$( t )$ 为 模拟器当前的模拟轮循次数,由第 $( 0 )$ 轮开始,一直到第 $( N )$ 轮结束。 $( \vec{\alpha(t)} )$ 是跷跷板在第 $( t )$ 轮的角加速度。$( \Delta t )$ 是模拟器的时间精度。

跷跷板当前的倾斜角为:

$$ \vec{\theta} = \vec{\theta_{0}} + \int_{t_{0}}^{t} \vec{\omega (t)} dt $$

其中 $( \vec{\theta_{0}} )$ 是在模拟器起始时刻跷跷板的倾斜角度,$( t_{0} )$ 是模拟的起始时刻,$( \vec{\omega(t)} )$ 是跷跷板在 $( t )$ 时刻的角速度。 跷跷板在 $( t )$ 时刻的角速度可以通过前面叙述的方式累积得到。

同理,跷跷板当前的倾斜角度也必须经过离散化才能在计算机中进行模拟。离散化后的倾 斜角度为:

$$ \vec{\theta} = \vec{\theta_{0}} + \sum_{t = 0}^{N} \vec{\omega(t)} \cdot \Delta t $$

其中 $( \vec{\theta_{0}} )$ 是在模拟起始时刻跷跷板的倾斜角度,$( t )$ 是模拟器当前的模拟轮循次数,$( \vec{\omega(t)} )$ 是跷跷板在第 $( t )$ 轮的角速度,$( \Delta t )$ 是模拟器的时间精度。

PID 控制

$$ \Delta O = O_{1} - O_{2} = p \cdot e \left( t \right) + d \cdot \frac{ d e \left( t \right) }{ dt } + i \cdot \int_{t_{0}}^{t} e \left( t \right) dt $$

$$ p = 1.00 $$ $$ d = 0.20 $$ $$ i = 0.02 $$

//todo