我是 StackOverflow 的新手,也是 Python 的新手。
我的问题是……我需要写一个双和,如下所示:
动机是这是对用于大地水准面的重力势能的角度校正。
我在写总和时遇到困难。请在您说“转到某某资源”或对我不耐烦之前,这是我第一次进行编码/编程/不管是什么。
这里适合使用“for”循环吗?
我有两个指数的数据
(n,m)
和系数c_{nm}
和s_{nm}
在 .txt 文件中。这些项目中的每一项都是一列。当我说usecols
,我给他们编号吗0
通过3
, 或1
通过4
?
(上面的等式)
\begin{equation}
V(r, \phi, \lambda) = \sum_{n=2}^{360}\left(\frac{a}{r}\right)^{n}\sum_{m=0}^{n}\left[c_{nm}*\cos{(m\lambda)} + s_{nm}*\sin{(m\lambda)}\right]*\sqrt{\frac{(n-m)!}{(n+m)!}(2n + 1)(2 - \delta_{m0})}P_{nm}(\sin{\lambda})
\end{equation}
最佳答案
(2) 是的,“for”循环很好。正如 @jpmc26 所指出的,生成器表达式是“for”循环的一个很好的替代方法。 IMO,如果效率对你很重要,你会想要使用 numpy。
(3) 正如@askewchan 指出的那样,“usecols”指的是 genfromtxt 的参数。 ;如该文档中所述,列索引从 0 开始,因此您需要使用 0 到 3。
一个简单的实现可能没问题,因为较大的阶乘是分母,但如果您遇到数值问题,我不会感到惊讶。这是让您入门的东西。请注意,您需要定义 P()
和 a
。我不明白“0 到 3”如何与 c 和 s 相关,因为它们的索引范围更远。我将假设每个(和增量)都有自己的值文件。
import math
import numpy
c = numpy.getfromtxt("the_c_file.txt")
s = numpy.getfromtxt("the_s_file.txt")
delta = numpy.getfromtxt("the_delta_file.txt")
def V(r, phi, lam):
ret = 0
for n in xrange(2, 361):
for m in xrange(0, n + 1):
inner = c[n,m]*math.cos(m*lam) + s[n,m]*math.sin(m*lam)
inner *= math.sqrt(math.factorial(n-m)/math.factorial(n+m)*(2*n+1)*(2-delta[m,0]))
inner *= P(n, m, math.sin(lam))
ret += math.pow(a/r, n) * inner
return ret
一定要写unittests检查数学。请注意,“lambda”是一个保留字。
关于python - 用 Python 写一个双和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417579/