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

2024-10-01 07:29:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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和step

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

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


Tags: 函数lenstepfunctionabsprecisionintend
1条回答
网友
1楼 · 发布于 2024-10-01 07:29:04

一种可能的改进方法是创建一个更简单的函数来显示任何类型的表。将所有数据构建为当前格式的col,然后将所有值传递给函数。然后可以计算每列中的最大条目,并相应地格式化数据:

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

相关问题 更多 >