集成for循环以计算网格/网格上的值

时间:2014-07-16 13:26:16

标签: python for-loop numpy

我对python很新,我试图在2d网格上绘制水面的等高线图。

目前代码正在运行,但我没有得到正确的解决方案。我仔细检查了公式,我相信我的循环问题。 我想根据x和y坐标为网格上的每个点运行代码。 网格为100 x 100,结果为10000个节点。我在下面发布了我的代码,我相信问题在于集成的for循环。关于我可以尝试的任何建议都会很棒。

代码长度道歉...

import numpy as np
import matplotlib.pyplot as plt 
import math 
import sys
from math import sqrt  
import decimal

t=0
n=5
l=100000
d=100
g=9.81

nx, ny = (100,100)
x5 = np.linspace(-100000,100000,nx)
y5 = np.linspace(-100000,100000,ny)
xv,yv = np.meshgrid(x5,y5)

x = np.arange(-100000,100000,2000)
y = np.arange(-100000,100000,2000)

c=np.arange(len(x))
x2=np.arange(len(x))
y2=np.arange(len(x))
t59=np.arange (1,10001,1)
h=np.arange(len(t59))

om2=1.458*(10**-4.0)
phi=52
phirad=phi*(math.pi/180)
f=om2*math.sin(phirad)



A=(((d+n)**2.0)-(d**2.0))/(((d+n)**2.0)+(d**2.0))
w=(((8*g*d)/(l**2))+(f**2))**0.5
a=((1-(A**2.0))**0.5)/(1-(A*math.cos(w*t)))
b=(((1-(A**2.0))/(1-(A*math.cos(w*t)))**2.0)-1)
l2=l**2.0


for i in range (len(x)):
   for j in range (len(y)):
      h[i]=d*(a-1-((((x[i]**2.0)+(y[j]**2.0))/l2)*b))

h5=np.reshape(h,(100,100))



plt.figure(1)
plt.contourf(x5,y5,h5)
plt.colorbar()
plt.show()

好的道歉我没有说清楚。因此,我希望实现一个抛物线盆地输出,其h值在大约-10到10之间变化。相反,我得到了巨大的价值和完全错误的形状。我认为for循环需要更像:

for i in range (len(x)):
   for j in range (len(y)):
      h[i][j]=d*(a-1-((((x[i][j]**2.0)+(y[i][j]**2.0))/l2)*b))

更清楚了吗?如果没有,请告诉我。

1 个答案:

答案 0 :(得分:0)

首先,完整的循环不是必需的。

h = d * (a - 1 - (x[None,:]**2 + y[:,None]**2) / 12 * b) 

这里的魔法来自索引中的Nonex[None, :]表示" x将行向量复制到所需的行数,y[:, None]表示" y作为列向量复制到尽可能多的行列根据需要`。

这可能是最容易理解的一个例子:

import numpy as np

x = np.arange(5)
y = np.arange(0,50,10)

print x, y, x[None,:] + y[:, None]

上面的单行提供:

enter image description here

一些手动计算表明这应该没问题。

  • d = 100
  • a = 1.05
  • b = 0.1025

对于(1e5,1e5)的角点,我们还有2e10,因此值不会很差。