Python:仅通过获取有限点来绘制无限系列

时间:2013-05-17 19:47:02

标签: python plot series

我试图通过仅获取有限数量的点来绘制无限系列。就我而言,3分和10分就足够了。

该等式是e偏心率中的拉格朗日幂系列。

E = Me + \sum_{n = 1}^{\infty}a_n e ** n

其中a_n

a_n = (1 / 2 ** (n - 1) * \sum_{k = 0}^{\lfloor n/2\rfloor} (-1) ** k / 
      ((n - 2 * k)! * k!) * (n - 2 * k) ** (n - 1) * np.sin((n - 2 * k) * Me)) 

所以\lfloor n/2\rfloorn/2的地板函数的乳胶。

自变量是E并且依赖Me所以函数不会写为正常会遇到这样的函数但是我没有看到明确求解Me的方法所以我们可以写Me(E)

所以到目前为止我所做的是(见下文)哪个错误,因为它不起作用。我能做些什么让代码和情节有效?

import numpy as np
import pylab as py
import math
from scipy.misc import factorial as fact

Me = np.linspace(0, 2 * np.pi, 50000.0)
e = 0.65
a = [1.0 / 2.0 ** (math.floor(n / 2.0) - 1.0) *
     sum([(-1.0) ** math.floor(n / 2.0) /
          (fact(math.floor(n / 2.0) - k) * fact(k)) *
          (math.floor(n / 2.0) - 2.0 * k) ** (math.floor(n / 2.0) - 1.0) *
          np.sin((math.floor(n / 2.0) - 2.0 * k) * Me)
          for k in range(1, 4, 1)])
          for n in range (1, 4, 1)]

print a

def E2(x):
    return Me + sum(a[n] * e ** n for n in range(1, 4, 1)) - x

fig = py.figure()
ax = fig.add_subplot(111)
ax.plot(Me, E2(Me))
py.xlim((0, 2 * np.pi))
py.ylim((0, 2 * np.pi))
py.show()

通过这个程序,我正在

In [2]: /usr/bin/ipython:17: RuntimeWarning: divide by zero encountered in double_\
scalars
/usr/bin/ipython:17: RuntimeWarning: invalid value encountered in multiply
/usr/bin/ipython:17: RuntimeWarning: invalid value encountered in add
[array([ nan,  inf,  inf, ..., -inf, -inf, -inf]), array([ nan,  inf,  inf, ..., -\
inf, -inf, -inf]), array([ nan,  inf,  inf, ..., -inf, -inf, -inf])]

Infinity根本不应该是一个值,所以我不确定如何得到它。

最终错误为list of index out of range

/home/dustin/Documents/School/UVM/Engineering/OrbitalMechanics/lagrangeseries.py i\
n <genexpr>((n,))
     17
     18 def E2(x):
---> 19     return Me + sum(a[n] * e ** n for n in range(1, 4, 1)) - x
     20
     21 fig = py.figure()

IndexError: list index out of range

这怎么超出范围?一切都在1到3之间?

2 个答案:

答案 0 :(得分:0)

由于Python中的分割方式,我不需要使用floor函数。

import numpy as np
import pylab as py
from scipy.misc import factorial as fact

e = 0.65


def E(M):
    return (M + sum((1.0 / 2.0 ** (n - 1) *
                     sum((-1) ** (k) / (fact(n - k) * fact(k)) *
                         (n - 2 * k) ** (n - 1) *
                         np.sin((n - 2 * k) * M)
                         for k in range(0, n / 2, 1))) * e ** n
                         for n in range(1, 4, 1)))


M = np.linspace(0, 2 * np.pi, 50000.0)

fig = py.figure()
ax = fig.add_subplot(111)
ax.plot(E(M), M)
py.xlim((0, 2 * np.pi))
py.ylim((0, 2 * np.pi))
py.show()

答案 1 :(得分:0)

对于k计数器,范围值中的索引应该增加1,因此不是:

表示范围内的k(0,n / 2,1)

它应该是: 对于范围内的k(0,n / 2 + 1,1)

否则n = 4范围(0,2,1)根据需要返回0,1而不是0,1,2。