On Mar 4, 2009, at 23:59, eric casteleijn wrote:
Geen idee wat je code moet doen, en dus hoe die te verbeteren.
OK, zonder KAPITALEN :-)
De bedoeling is om in een gegeven lijst met tuples, dat punt te vinden
dat met de index r in de fact colom wordt aangewezen en waarvan de
waarde dan in de data colom staat.
De waarden voor fact zijn ook tussen 0..1 en oplopend gesorteerd. Ze
markeren een gebied.
Waarbij r tussen 0..1 zoek je eerst het interval N .. N+1 waar factN <
r < factN+1
vervolgens is het resultaat de interpolatie tussen dataN en dataN+1
(ik weet niet of het zo duidelijker is geworden, mar als je de codde
draait zie jet het (waarschijnlijk) zo)
F
import random
def LinearInter(f, a, b):
return a + (b-a) * f
def FindSegment(r, lijst=None, fact=0, data=1 ):
if lijst:
if r <= lijst[0][fact]:
return lijst[0][data]
elif r >= lijst[-1][fact]:
return lijst[-1][data]
else:
l = 0
h = len(lijst)-1
while (h-l) > 1:
p = l + (h-l) / 2
if r >= lijst[p][fact]:
l = p
else:
h = p
if l == h:
return lijst[l][data]
return LinearInter( (r - lijst[l][fact]) / (lijst[h][fact] -
lijst[l][fact]), lijst[l][data], lijst[h][data] )
else:
return None
if __name__ == '__main__':
lijst1 = [ (0.0, 10), (0.5, 20), (0.75, 30), (0.8, 40), (1.0, 50) ]
lijst2 = [ (0.1, 50), (0.5, 30), (0.75, 10), (0.8, 40), (0.9, 70) ]
for i in range(101):
r = i / 100.0
print i, FindSegment(r, lijst1), FindSegment(r, lijst2),
FindSegment(random.random(), lijst2)
_______________________________________________
Python-nl mailing list
Python-nl@python.org
http://mail.python.org/mailman/listinfo/python-nl