2015-08-22 29 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和step等参数。

我也想为计算添加一个精度值。

我期待着任何可以帮助我设计显示功能的建议。

回答

0

改进你所拥有的一种可能的方式是创建一个更简单的函数来显示任何类型的表。您可以将所有数据按照当前格式进行格式化,然后将所有值传递给函数。然后,这个可以计算出每列中最大的记录,并相应地格式化数据:

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