2017-06-14 123 views
0

我试图检查收敛使用中点方法作为数值方法。我可以得到一张数据表,但我不确定如何绘制图表或添加日志比例。这是我的代码到目前为止。任何帮助深表感谢。积分测试数值积分

from math import exp,pi 
import numpy as np 
import matplotlib.pyplot as plt 

def midpoint(f,a,b,n): 
    h=float((b-a)/n) 
    result=0 
    for i in range(n): 
     result+=f((a+ h/2.0)+ i*h) 
    result*= h 
    return result 

#g= lambda y: (y**3)/(exp(y)-1) 
g=lambda y: ((exp(-y)*y**3)/(1-exp(-y))) 
a=0 
b=1000 
print( 'n    midpoint') 
for i in range(1,20): 
    n=2**i 
    m=midpoint(g,a,b,n) 
    print('%7d %.16f' %(n,m)) 

"""r=(pi**4/15) 
plt.plot(n,m,label="numberical") 
plt.plot(n,r,label="analytical") 
plt.xlabel('n') 
plt.ylabel('intergral') 
plt.legend() 
plt.show()""" 

"""plt.semilogx(n,m) 
    plt.show()""" 

回答

0

我假设你想绘制近似而不是错误与间隔。要做出的关键更改为:

1)nm应该是数组或列表; 2)由于确切的结果是一个对应于水平线的常数,所以应该从(xmin, r)(xmax, r); 3)使用ax.set_xscale('log')获取日志缩放x轴。

完整的代码如下。我做了一些更改,尝试使用numpy来提高可读性。

from math import exp,pi 
import numpy as np 
import matplotlib.pyplot as plt 

def midpoint(f,a,b,n): 
    h = float((b - a)/n) 
    result = 0 
    for i in range(n): 
     result += f((a + h/2.0) + i * h) 
    result *= h 
    return result 

g = lambda y: ((exp(-y) * y ** 3)/(1 - exp(-y))) 
a = 0 
b = 1000 
n = 2 ** np.arange(1, 20) 
f = np.vectorize(midpoint) 
m = f(g, a, b, n) 
r = (pi**4/15) 

plt.plot(n, m, label="numberical") 
ax = plt.gca() 
ax.set_xscale('log') 
ax.set_ylim(auto=False) 
xmin, xmax = plt.xlim() 
plt.plot([xmin, xmax], [r, r], label="analytical") 
plt.xlabel('n') 
plt.ylabel('intergral') 
plt.legend() 
plt.show() 

enter image description here

+0

谢谢你,这是超级有帮助的。即时消息不确定你做了什么来制作图表。什么是plt.gca()? –

+0

如[文档](https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.gca)中所述,它是“在当前图上获取当前轴实例”。我用它来让我自己访问'xscale'和'ylim'。 –

+0

谢谢。我也试图把百分比误差作为一个对数函数。我保持大部分上述螺母尝试改变y轴的百分比。这是我在初始中点功能后得到的。我加了perc = log((abs(f-r)/(r))) plt.plot(n,perc)。但我不知道如何使它成为一个日志,并不断发出错误。 –