好吧,我最近做了这个作业(别担心,我已经做过了,但是用c++)但是我很好奇怎么用python来做。问题是两个发光的光源。我不想谈这些细节。在
下面是代码(我在后一部分中对其进行了优化):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'
我已经设法优化了它的大部分,但是在2for-s部分仍然存在巨大的性能差距,而且我似乎想不出一种方法来绕过使用普通阵列操作的方法。。。我愿意接受建议:D
编辑:
针对弗拉德的建议,我将公布问题细节:
有2个光源,每个光源都以正弦波的形式发出光:
E1=E0*sin(ω1*时间+phi01)
E2=E0*sin(ω2*时间+φ02)
为了简单起见,我们考虑ω1=ω2=ω=2*π/T和φ01=φ02=φ0
将x1看作是与平面上某一点的第一个光源的距离,则该点的光强度为
Ep1=E0*sin(ω*时间-2*π*x1/λ+φ0)
哪里
λ=光速*T(振荡周期)
考虑到平面上的两个光源,公式变成
Ep=2*E0*cos(PI*(x2-x1)/λ)sin(ω时间-PI*(x2-x1)/λ+phi0)
从中我们可以看出,当
(x2-x1)/λ=(2*k)*π/2
以及最低限度
(x2-x1)/λ=(2*k+1)*PI/2
其中k是介于和之间的整数
对于给定的时间,给定光源的坐标,对于已知的lambda和E0,我们必须编写一个程序来绘制光的外观
我想我已经尽可能地优化了这个问题。。。在