2015-08-22 4 views
0

I est une nouveauté en python et dans le monde du calcul scientifique. En guise de début, je construis un module contenant les définitions des fonctions mathématiques habituelles avec les séries de puissances.Construire une fonction d'affichage générique pour les résultats de calculs

À titre d'exemple, voici le code de la fonction exponentielle:

def exponential(x): 
"""Exponential function""" 
exp=1.0 
term=1.0 
iteration=1 
factorial=1 
while(abs(term/factorial)>1e-15): 
    factorial*=iteration 
    term*=x 
    exp+=term/factorial 
    iteration+=1 
return exp 

Ensuite, je veux afficher les résultats de calcul de cette fonction dans une belle table, comme les suivantes:

### Evaluations for the exponential function ### 

x=-4.00 --- exp(-4.00)=0.018315638888734  --- precision=0.000000000000000 
x=-3.50 --- exp(-3.50)=0.030197383422319  --- precision=0.000000000000001 
x=-3.00 --- exp(-3.00)=0.049787068367864  --- precision=0.000000000000000 
x=-2.50 --- exp(-2.50)=0.082084998623899  --- precision=0.000000000000000 
x=-2.00 --- exp(-2.00)=0.135335283236613  --- precision=0.000000000000000 
x=-1.50 --- exp(-1.50)=0.223130160148430  --- precision=0.000000000000000 
x=-1.00 --- exp(-1.00)=0.367879441171442  --- precision=0.000000000000000 
x=-0.50 --- exp(-0.50)=0.606530659712633  --- precision=0.000000000000000 
x=+0.00 --- exp(+0.00)=1.000000000000000  --- precision=0.000000000000000 
x=+0.50 --- exp(+0.50)=1.648721270700128  --- precision=0.000000000000000 
x=+1.00 --- exp(+1.00)=2.718281828459046  --- precision=0.000000000000000 
x=+1.50 --- exp(+1.50)=4.481689070338066  --- precision=0.000000000000002 
x=+2.00 --- exp(+2.00)=7.389056098930649  --- precision=0.000000000000002 
x=+2.50 --- exp(+2.50)=12.182493960703471 --- precision=0.000000000000002 
x=+3.00 --- exp(+3.00)=20.085536923187661 --- precision=0.000000000000007 
x=+3.50 --- exp(+3.50)=33.115451958692326 --- precision=0.000000000000014 
x=+4.00 --- exp(+4.00)=54.598150033144265 --- precision=0.000000000000028 

Ce tableau est généré par le code ci-dessous:

from math import exp 
start=-4.0 
end=4.0 
step=0.5 
spacesx0=(1+len(str(int(end)))) 
spaces0=(1+len(str(int(exp(abs(end)))))) 

print("### Evaluations for the exponential function ###") 
print("") 

for i in range(int(start/step),int(end/step)+1): 

    # computations 
    x=step*i 
    expx=exponential(x) 
    precision=abs(expx-exp(x)) 

    # spaces calculations 
    spacesx=spacesx0+1-(len(str(int(abs(x))))) 
    spaces=spaces0+1-(len(str(int(expx))))+spacesx 

    # text formating 
    if x<0: 
     s="x=%.2f"+" "*spacesx+"--- exp(%.2f)=%.15f"+" "*spaces+"--- precision=%.15f" 
    else: 
     s="x=+%.2f"+" "*spacesx+"--- exp(+%.2f)=%.15f"+" "*spaces+"--- precision=%.15f" 
    # end text formating 

    # display 
    print(s % (x,x,expx,precision)) 

Comme je veux calculer une d afficher les résultats pour plusieurs autres fonctions habituelles (cosh, sinh, sin, cos, arctan, ...), je souhaiterais concevoir une fonction d'affichage générique.

Pour une telle fonction d'affichage, j'ai besoin de paramètres tels qu'une fonction (dont les valeurs sont réellement calculées), un titre, un x-start, un x-end et un pas, je pense.

Je veux aussi ajouter une valeur de précision pour les calculs.

J'attends tous les conseils qui m'aideront à concevoir cette fonction.

Répondre

0

Une façon possible d'améliorer ce que vous avez est de créer une fonction plus simple pour afficher n'importe quel type de table. Vous construisez toutes vos données en colonnes formatées comme vous l'avez actuellement, puis passez toutes les valeurs à une fonction. Cela peut alors calculer la plus grande entrée dans chaque colonne et formater les données en conséquence:

def col_display(data): 
    widths = [0] * len(data[0]) 

    for row in data: 
     widths[:] = [max(widths[index], len(col)) for index, col in enumerate(row)] 

    for row in data: 
     print(" ".join(["%-*s" % (widths[index], col) for index, col in enumerate(row)])) 

start=-4.0 
end=4.0 
step=0.5 
spacesx0=(1+len(str(int(end)))) 
spaces0=(1+len(str(int(exp(abs(end)))))) 

print("### Evaluations for the exponential function ###") 
print("") 

output = [] 
for i in range(int(start/step),int(end/step)+1): 

    # computations 
    x=step*i 
    expx=exponential(x) 
    precision=abs(expx-exp(x)) 

    # text formatting 
    if x<0: 
     output.append(["x=%.2f" % x, "--- exp(%.2f)=%.15f" % (x,expx), "--- precision=%.15f" % precision]) 
    else: 
     output.append(["x=+%.2f" % x, "--- exp(+%.2f)=%.15f" % (x,expx), "--- precision=%.15f" % precision]) 

    # end text formatting 

col_display(output) 

Cette approche éliminer au moins la nécessité d'ajouter des espaces, et rendrait l'écran le plus compact possible:

x=-4.00 --- exp(-4.00)=0.018315638888734 --- precision=0.000000000000000 
x=-3.50 --- exp(-3.50)=0.030197383422319 --- precision=0.000000000000001 
x=-3.00 --- exp(-3.00)=0.049787068367864 --- precision=0.000000000000000 
x=-2.50 --- exp(-2.50)=0.082084998623899 --- precision=0.000000000000000 
x=-2.00 --- exp(-2.00)=0.135335283236613 --- precision=0.000000000000000 
x=-1.50 --- exp(-1.50)=0.223130160148430 --- precision=0.000000000000000 
x=-1.00 --- exp(-1.00)=0.367879441171442 --- precision=0.000000000000000 
x=-0.50 --- exp(-0.50)=0.606530659712633 --- precision=0.000000000000000 
x=+0.00 --- exp(+0.00)=1.000000000000000 --- precision=0.000000000000000 
x=+0.50 --- exp(+0.50)=1.648721270700128 --- precision=0.000000000000000 
x=+1.00 --- exp(+1.00)=2.718281828459046 --- precision=0.000000000000000 
x=+1.50 --- exp(+1.50)=4.481689070338066 --- precision=0.000000000000002 
x=+2.00 --- exp(+2.00)=7.389056098930649 --- precision=0.000000000000002 
x=+2.50 --- exp(+2.50)=12.182493960703471 --- precision=0.000000000000002 
x=+3.00 --- exp(+3.00)=20.085536923187661 --- precision=0.000000000000007 
x=+3.50 --- exp(+3.50)=33.115451958692326 --- precision=0.000000000000014 
x=+4.00 --- exp(+4.00)=54.598150033144265 --- precision=0.000000000000028