我目前正在试图弄清楚如何返回正方形的周长,然后可以将其用作计算电荷密度的输入。具体来说,电荷在正方形的周长周围是均匀的,然后用于计算电势和电荷密度。
这是我收取积分费用的代码。
def Q(i,j,x_max,y_max,delta):
x_dist=math.exp(-(i*delta-x_max/2.0)*(i*delta-x_max/2.0)/(1.0*delta*delta))
y_dist=math.exp(-(j*delta-y_max/2.0)*(j*delta-y_max/2.0)/(1.0*delta*delta))
return x_dist*y_dist
我发现了这个非常吸引人的网站,暗示我可以通过使用方程x ^(一个非常大的数)+ y ^(一个非常大的数)= 1近似一个正方形来实现这一目标。这引起了我的兴趣,因此我试图在正方形上创建点以用作费用来源。
http://polymathprogrammer.com/2010/03/01/answered-can-you-describe-a-square-with-1-equation/
我尝试了以下方法,但是,当然,它只会返回1分。
return math.pow(x_dist,1000000)-1
有什么建议吗?谢谢!
答案 0 :(得分:3)
您可以直接使用np.linspace
计算周长上的点。从左到右计数x
,从下到上计数y
,您可以使用以下内容:
import numpy as np
def square(top_left, l, n):
top = np.stack(
[np.linspace(top_left[0], top_left[0] + l, n//4 + 1),
np.full(n//4 + 1, top_left[1])],
axis=1
)[:-1]
left = np.stack(
[np.full(n//4 + 1, top_left[0]),
np.linspace(top_left[1], top_left[1] - l, n//4 + 1)],
axis=1
)[:-1]
right = left.copy()
right[:, 0] += l
bottom = top.copy()
bottom[:, 1] -= l
return np.concatenate([top, right, bottom, left])
举例说明:
import matplotlib.pyplot as plt
s = square((0, 0), 2, 400)
plt.plot(s[:, 0], s[:, 1], 'o')
plt.grid()
plt.show()
如果出于某种原因不能使用numpy,则(按需求)(重新)创建功能并不是很麻烦(例如,以np.linspace
的源代码作为方向):
def linspace(a, b, n):
return [a + (b - a) / (n - 1) * i for i in range(n)]
def full(n, x):
return n * [x]
def square(top_left, l, n):
top = list(zip(
linspace(top_left[0], top_left[0] + l, n//4 + 1),
full(n//4 + 1, top_left[1])
))
left = list(zip(
full(n//4 + 1, top_left[0]),
linspace(top_left[1], top_left[1] - l, n//4 + 1)
))
right = [(x + l, y) for x, y in left]
bottom = [(x, y - l) for x, y in top]
return top + right + bottom + left
答案 1 :(得分:0)
使用numpy可以很容易地制作矩形和正方形。该图案可用作种子,如果需要矩形网格,则可以重复使用。 例如,产生一个5个单位的正方形
import numpy as np
dx = 5
dy = 5
X = [0.0, 0.0, dx, dx, 0.0] # X, Y values for a unit square
Y = [0.0, dy, dy, 0.0, 0.0]
a = np.array(list(zip(X, Y)))
对于小多边形有点矫over过正,但是einsum可以很容易地发挥作用,用于计算几何周长或数百或数千个坐标对。
a = np.reshape(a, (1,) + a.shape)
diff = a[:, 0:-1] - a[:, 1:]
d_leng = np.sqrt(np.einsum('ijk,ijk->ij', diff, diff)).squeeze()
length = np.sum(d_leng.flatten())
因此对于简单多边形(第一个点和最后一个点是重复项以确保闭合),坐标,边和总长如下所示:
d_leng
array([5., 5., 5., 5.])
length
20.0
a
array([[[0., 0.],
[0., 5.],
[5., 5.],
[5., 0.],
[0., 0.]]])
如果在开始之前需要其他原点,则可以简单地完成...
a + [10, 10]
array([[[10., 10.],
[10., 15.],
[15., 15.],
[15., 10.],
[10., 10.]]])