将这块C物理代码翻译成python

时间:2010-01-03 01:22:02

标签: python c

我只学了几个月的python,完全是C语言的新手,我从网上得到了一个C代码,我很想学习它。但我只懂python语言,所以有人可以帮助将以下代码翻译成python会很棒。提前谢谢!

for(i=0; i<n; i++) { /* Foreach particle "i" ... */
  ax=0.0;
  ay=0.0;
  az=0.0;
  for(j=0; j<n; j++) { /* Loop over all particles "j" */
    dx=x[j]-x[i];
    dy=y[j]-y[i];
    dz=yz[j]-z[i];
    invr = 1.0/sqrt(dx*dx + dy*dy + dz*dz + eps);
    invr3 = invr*invr*invr;
    f=m[j]*invr3;
    ax += f*dx; /* accumulate the acceleration from gravitational attraction */
    ay += f*dy;
    az += f*dx;
  }
  xnew[i] = x[i] + dt*vx[i] + 0.5*dt*dt*ax; /* update position of particle "i" */
  ynew[i] = y[i] + dt*vy[i] + 0.5*dt*dt*ay;
  znew[i] = z[i] + dt*vz[i] + 0.5*dt*dt*az;
  vx[i] += dt*ax; /* update velocity of particle "i" */
  vy[i] += dt*ay;
  vz[i] += dt*az;
}

再次感谢!

4 个答案:

答案 0 :(得分:7)

将此视为学习某些C的理想机会,与Python不同,语法不是所以

它会很好地为你服务

答案 1 :(得分:2)

这是一个字面翻译

编辑 是一个字面翻译但是@hughdbrown在评论中指出的原始C代码中存在一些异常 - 看起来你正试图从代码中学习这个主题是如此完全打破它甚至不会编译,这对你来说似乎是非常不明智的,所以,无论如何,我冒昧地修复了这个Python中原始C代码的明显错误和荒谬“ “ - 翻译......):

import math

for i in range(n):
  ax = ay = az = 0.0
  for j in range(n):
    dx=x[j]-x[i]
    dy=y[j]-y[i]
    dz=z[j]-z[i]
    invr = 1.0/math.sqrt(dx*dx + dy*dy + dz*dz + eps)
    f=m[j]*invr**3
    ax += f*dx  # accumulate the acceleration from gravitational attraction
    ay += f*dy
    az += f*dz
  xnew[i] = x[i] + dt*vx[i] + 0.5*dt*dt*ax
  ynew[i] = y[i] + dt*vy[i] + 0.5*dt*dt*ay
  znew[i] = z[i] + dt*vz[i] + 0.5*dt*dt*az
  vx[i] += dt*ax  # update velocity of particle "i"
  vy[i] += dt*ay
  vz[i] += dt*az

当然它假定列表x,y,z,... vx,vy,vz都是预先存在的且长度相同n,就像C代码片段假定同名阵列。

答案 2 :(得分:1)

老实说,除了循环这个 已经非常接近python ..

 for(j=0; j < n; ++j) 
只是维护循环计数器j,它在每次循环迭代后递增。循环运行所有
0 <= j < n
。祝你好运。

答案 3 :(得分:1)

顺便提一下,这段代码是 错误,假设意图是数字整合n-body问题。

  • 计算力的循环不能正确处理i == j的情况,导致非常大(取决于eps的大小)虚假错误被添加到每个力。

    < / LI>
  • 说到eps,除了在力计算中添加错误外,它没有用处。

  • 位置和速度的更新规则是Velocity Verlet和Forward Euler的奇怪组合,最终的积分器可能具有后者的所有不良属性。 Velocity Verlet是二阶的,显式的和辛的,可以得到更好的结果,成本可以忽略不计,应该在这里使用。