<p>这并不是一个真正的答案,而是我注意到的对您代码的一些注释。在</p>
<p>正如@qmorgan指出的,您已经将<code>controller</code>函数中的一个参数命名为与另一个函数相同:<code>velocity</code>请尝试在变量名中保持一致,以避免发生此类情况。例如,所有常量都是简短的缩写。所以,当你命名函数中的参数时,也许用词,这样你就有了一个习惯,知道你在哪里用了什么。在</p>
<p>你也犯了一些类似的错误:你在函数中有一个参数,但是在函数体中却忽略了它,而是使用了一个常量。例如,您定义了<code>velocity</code>来获取<code>(mass, desired, theta, t)</code>,但是您传递了它<code>(m, v, theta, time)</code>,其中<code>v</code>是您的<em>开始</em>速度。小心!您没有注意到这个错误,因为事实上,<code>velocity</code><em>忽略了</em><code>desired</code>,而是使用了全局常量<code>vr</code>。相反,这一部分应该有</p>
<pre><code>def velocity(mass, desired, theta, t):
return integrate.odeint(vderivs, desired, t)
plt.plot(time, velocity(m, vr, theta, time), 'k-')
</code></pre>
<hr/>
<p>要将列表转换为numpy数组,可以使用<code>np.array(vel, float)</code>而不是<code>np.array([x for x in vel], float)</code>,因为<code>[x for x in vel]</code>与{<cd13>}本身相同。在</p>
<hr/>
<p>在<code>vderivs</code>中,通过<code>t</code>的循环可以完全消除,但至少我认为它应该更像:</p>
^{pr2}$
<p>它不会忽略输入<code>t</code>。在</p>
<hr/>
<p>现在,<code>uderivs</code>取当前速度和全局定义的期望速度,并返回它们的差:</p>
<pre><code>def uderivs(v, t):
return vr - v
</code></pre>
<p>但是您总是传递它<code>vr</code>(请参见<code>controller</code>的定义),所以每次您对它进行积分时,它都会返回一个长度为<code>t.size</code>和值为<code>vr</code>的平面数组。在</p>
<hr/>
<p>您可能希望<code>theta = 4</code>而不是<code>theta = 4</code></p>
<hr/>
<p>numpy中已经存在函数<code>np.sign</code>,不需要实现自己的函数。在</p>