数值积分问题

时间:2017-06-27 23:01:19

标签: python integration numerical-methods numerical-integration

我目前陷入了一个隐藏在某个地方的非常简单的错误,希望有人可以对它有所启发。

我正在尝试将一组数据与传统方法进行数字整合,并获得我并不期望的结果。

然后我回到第一原则并制作了以下代码。出于某种原因,我无法生成y3或y4来匹配y2。

import numpy as np  
import matplotlib.pyplot as plt
import math

f1 = 'x**2 - 1' # Starting function
start, stop, step = -2, 2, 21

x = np.linspace(start, stop, step)
xdash = []
xDoubleDash = []

y1 = eval(f1)
y2 = [] # integrated function
y3 = [] # box rule
y4 = [] # trapezium rule
y5 = [] # numerical differentialtion of integrated function

for i in range(0,len(x)-1):
    xdashElement = (x[i] + x[i+1])/2
    y2.append((math.pow(xdashElement,3)/3) - xdashElement) # Integrated Function: (x**3)/3 - x
    xdash.append(xdashElement)
    y3.append((y1[i]+y1[i+1])/2 * abs(((x[i] - x[i+1])))) # box rule
    y4.append(((y1[i]+y1[i+1]) * abs(x[i] - x[i+1]))/2) # trapezium rule

for i in range(0,len(y2)-1):
    xDoubleDashElement = (xdash[i] + xdash[i+1])/2
    xDoubleDash.append(xDoubleDashElement)
    y5.append((y2[i+1]-y2[i])/(xdash[i+1] - xdash[i])) 


plt.plot(x, y1, 'b-')
plt.plot(xdash, y2, 'r-')
plt.plot(xdash, y3, 'g-')
plt.plot(xdash, y4, 'm-')
plt.plot(xDoubleDash, y5, 'c-')
plt.grid()
plt.show()

提前致谢。

编辑:我添加了y5,y2的数值差异作为健全性检查。

1 个答案:

答案 0 :(得分:0)

您的y2是一个不确定的积分,而您的y3y4在一系列间隔内是明确的积分。我不希望它们相互匹配。如果您想检查与反衍生物的数值积分,您的y3y4应与此y2匹配:

ya = (math.pow(x[i],3)/3) - x[i]
yb = (math.pow(x[i+1],3)/3) - x[i+1]
y2.append(yb-ya) # Integrated Function: (x**3)/3 - x

编辑以回复对integral的评论:

  

我期望y3和y4的值与y2的值非常相似,理论上如果增量x [i + 1] - x [i]变得无限小,理论上会匹配积分的理论定义

基于this definition of integral

\int_a^b ! f(x)dx

其中 F f 的反衍生物或不定积分。

对于y3y4x=(x[i] + x[i+1])/2您有y:

f((x[i] + x[i+1])/2) ~= F(x[i+1]) - F(x[i])

对于y2x=(x[i] + x[i+1])/2你有y:

f((x[i] + x[i+1])/2) = F((x[i] + x[i+1])/2)

当“x [i + 1] - x [i]变得无限小”时,你会有

F((x[i] + x[i+1])/2) ~= F(x[i]) ~= F(x[i+1])

F(x[i+1]) - F(x[i]) ~= 0

换句话说,当“x [i + 1] - x [i]变得无限小”时,y3y4几乎是y=0处的水平线。为什么y2y=0上的一行相匹配?

如果您确实希望y3y4符合y2的形状,则需要y0或“arbitrary constant of integration”像这样开始并制作y3y4

y0 = -.7
y3 = [y0] # box rule
y4 = [y0] # trapezium rule
for i in range(0,len(x)-1):
    xdashElement = (x[i] + x[i+1])/2
    y3.append((y1[i]+y1[i+1])/2 * abs(((x[i] - x[i+1]))) + y3[len(y3) - 1]) # box rule
    y4.append(((y1[i]+y1[i+1]) * abs(x[i] - x[i+1]))/2 + y4[len(y4) - 1]) # trapezium rule
y3.pop(0)
y4.pop(0)

然后随着step或“增量x [i + 1] - x [i]变得无限小”的增加,这些y3y4将匹配{{ 1}}。