为计算结果构建通用显示函数

时间:2015-08-22 08:16:20

标签: python displayobject

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

由于我想计算和显示其他几个常用函数(cosh,sinh,sin,cos,arctan,...)的结果,我想设计一个通用的显示函数。

对于这样的显示功能,我认为我需要参数,例如函数(实际计算的值),标题,x-start,x-end和步骤。

我还想为计算添加精度值。

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

1 个答案:

答案 0 :(得分: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