【发布时间】:2011-02-19 23:00:00
【问题描述】:
好吧,我最近有这个作业(别担心,我已经完成了,但是在 c++ 中)但我很好奇如何在 python 中完成它。问题在于大约 2 个发光的光源。细节我就不多说了。
这是代码(我在后半部分已设法对其进行了一些优化):
import math, array
import numpy as np
from PIL import Image
size = (800,800)
width, height = size
s1x = width * 1./8
s1y = height * 1./8
s2x = width * 7./8
s2y = height * 7./8
r,g,b = (255,255,255)
arr = np.zeros((width,height,3))
hy = math.hypot
print 'computing distances (%s by %s)'%size,
for i in xrange(width):
if i%(width/10)==0:
print i,
if i%20==0:
print '.',
for j in xrange(height):
d1 = hy(i-s1x,j-s1y)
d2 = hy(i-s2x,j-s2y)
arr[i][j] = abs(d1-d2)
print ''
arr2 = np.zeros((width,height,3),dtype="uint8")
for ld in [200,116,100,84,68,52,36,20,8,4,2]:
print 'now computing image for ld = '+str(ld)
arr2 *= 0
arr2 += abs(arr%ld-ld/2)*(r,g,b)/(ld/2)
print 'saving image...'
ar2img = Image.fromarray(arr2)
ar2img.save('ld'+str(ld).rjust(4,'0')+'.png')
print 'saved as ld'+str(ld).rjust(4,'0')+'.png'
我已经设法优化了大部分,但是与 2 for-s 的部分仍然存在巨大的性能差距,我似乎想不出一种方法来绕过使用常见的数组操作...我愿意接受建议:D
编辑: 针对 Vlad 的建议,我将发布问题的详细信息: 有 2 个光源,每个都以正弦波的形式发光: E1 = E0*sin(omega1*time+phi01) E2 = E0*sin(omega2*time+phi02) 为简单起见,我们考虑 omega1=omega2=omega=2*PI/T 和 phi01=phi02=phi0 通过将 x1 视为与平面上一个点的第一个光源的距离,该点的光强度为 Ep1 = E0*sin(omega*time - 2*PI*x1/lambda + phi0) 在哪里 λ = 光速 * T(振荡周期) 考虑平面上的两个光源,公式变为 Ep = 2*E0*cos(PI*(x2-x1)/lambda)sin(omega时间 - PI*(x2-x1)/lambda + phi0) 从中我们可以看出,当光的强度最大时 (x2-x1)/λ = (2*k) * PI/2 最小时 (x2-x1)/λ = (2*k+1) * PI/2 并且在两者之间变化,其中k是整数
对于给定的时刻,给定光源的坐标,对于已知的 lambda 和 E0,我们必须编写一个程序来绘制灯光的外观 恕我直言,我认为我尽可能地优化了这个问题......
【问题讨论】:
-
在我看来,您应该深入了解问题的细节。在算法中寻找优化更容易。如果只贴代码,我们必须阅读代码,从代码中找出算法,然后尝试优化。因此,请发布您的原始问题和解决方案,而不是一堆代码。
标签: python optimization numpy for-loop physics