我试图通过仅获取有限数量的点来绘制无限系列。就我而言,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\rfloor
是n/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之间?
答案 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。