在Python中编写双重求和
我刚刚加入StackOverflow,而且对Python也非常陌生。
我遇到的问题是……我需要写一个双重求和,像这样:
这样做的原因是,这是用于大地水准面的重力势的角度修正。
我在写求和的时候遇到了困难。而且请你们在说“去某个资源看看”之前,或者对我不耐烦之前,知道这是我第一次接触编码/编程/不管这是什么。
在这里使用“for”循环合适吗?
我有一个.txt文件,里面有两个索引
(n,m)
和系数c_{nm}
以及s_{nm}
的数据。每个数据项都是一列。当我说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}
1 个回答
4
(2) 是的,使用“for”循环是可以的。正如 @jpmc26 提到的,生成器表达式是“for”循环的一个不错的替代方案。在我看来,如果你在意效率的话,使用 numpy 会更好。
(3) 正如 @askewchan 提到的,“usecols”是 genfromtxt 的一个参数;根据文档的说明,列的索引是从 0 开始的,所以你应该使用 0 到 3。
一个简单的实现可能没问题,因为较大的阶乘是分母,但如果你遇到数值问题我也不会感到惊讶。这里有一些可以帮助你入门的内容。注意你需要定义 P()
和 a
。我不太明白“0 到 3”是如何与 c 和 s 相关的,因为它们的索引范围要大得多。我假设每个(以及 delta)都有自己的一组值文件。
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
确保写 单元测试 来检查数学计算。注意“lambda”是一个保留字。