2015-08-22 3 views
0

Я совершенно новый для python и для научного вычислительного мира.Создание общей функции отображения для результатов вычислений

В качестве начала я создаю модуль, содержащий определения обычных математических функций с степенными рядами.

В качестве примера, вот код для экспоненциальной функции:

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 

Далее, я хочу, чтобы отобразить результаты вычислений из этой функции в хорошей таблице, такие как:

### 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 

Эта таблица генерируется код ниже:

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)) 

Как я хочу, чтобы вычислить d отображает результаты для нескольких других обычных функций (cosh, sinh, sin, cos, arctan, ...), я хотел бы создать общую функцию отображения.

Для такой функции отображения мне понадобятся такие параметры, как функция (какие значения фактически вычисляются), заголовок, x-start, x-end и шаг.

Я также хочу добавить значение точности для вычислений.

Я с нетерпением жду любых советов, которые могут помочь мне разработать эту функцию отображения.

ответ

0

Один из возможных способов улучшить то, что у вас есть, - создать более простую функцию для отображения любой таблицы. Вы создаете все свои данные в cols, отформатированные так, как вы сейчас, и передаете все значения функции. Это может затем вычислить наибольший элемент в каждом столбце и форматировать данные соответственно:

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) 

Такой подход, по крайней мере, избавиться от необходимости добавлять пробелы, и сделает дисплей как можно более компактным:

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 
Смежные вопросы