我对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))
更清楚了吗?如果没有,请告诉我。
答案 0 :(得分:0)
首先,完整的循环不是必需的。
h = d * (a - 1 - (x[None,:]**2 + y[:,None]**2) / 12 * b)
这里的魔法来自索引中的None
。 x[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]
上面的单行提供:
一些手动计算表明这应该没问题。
对于(1e5,1e5)的角点,我们还有2e10,因此值不会很差。