Integració numèrica i conceptual amb Python

Fa temps vaig haver de reproduir amb Python la manera de calcular, numèricament, el volum d’una esfera (i altres coses que no venen al cas).

No he trobat cap pàgina Web que ho posi bé però fent-ho ràpid el càlcul del volum d’una esfera amb coordenades esfèriques és tal com “la integral de 0 a 2*pi de la integral de 0 a pi de la integral de 0 al radi pel jacobià de les coordenades que seria tetha”. Sento no escriure-ho 🙂 però es pot veure més avall.

Vaig fer el programa en Ptyhon. Deixo aquí la segona versió. Em va agradar molt: totalment simple, llegible i aplicació directe del què sempre havia entés com a concepte. Ho havia entés però no havia agafat un llenguatge i ho havia escrit. Ho deixo pels estudiants d’informàtica que tinguin coses de mates 😀

---------------------------
#!/usr/bin/python

import math

def jacobia(x,y,z):
return z*z*math.sin(y)

def densitat(x,y,z):
return 1

#Exemple: calcul volum d una esfera a partir de l integral
R=1

xinf=0
xsup=2*math.pi

yinf=0
ysup=math.pi

zinf=0
zsup=R

#inicialitzacions valors minims
x=xinf
y=yinf
z=zinf

resolucio=0.02
total=0

dvolum=resolucio*resolucio*resolucio

while x<=xsup: while y<=ysup: while z<=zsup: total=total+jacobia(x,y,z)*densitat(x,y,z)*dvolum z=z+resolucio y=y+resolucio z=zinf x=x+resolucio y=yinf z=zinf print "Total: ",total ---------------------------

Notes:


  • X és Theta (de 0 a 2*pi, equador)
  • Y és Ro (de 0 a pi, meridians)
  • Z és radi (de 0 a radi)

De fet les variables es diuen X, Y i Z perquè sigui general (es pot aplicar aquest sistema per qualsevol integral). En aquest cas queda més clar si en aquest cas concret es diguessin Theta, Ro i radi.

L'execució dona 4.074. Si s'aplica la fórmula de volum d'una esfera (4/3*pi*r^3) el resultat correcte és 4.1781. Es veu que s'hi acosta. Si s'augmenta la resolució doncs tarda més però el resultat és més acurat.

Nota: l'algorisme és MOLT ineficient (cost cúbic), no fa ús de cap optimització ni algorisme d'integració tal com caldria fer. És per propòsit educatiu, no per propòsit de càlcul real 🙂

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>