使用辛普森规则计算积分的错误值

时间:2017-12-06 18:36:29

标签: python integration simpsons-rule

我为辛普森的规则整合编写了以下代码来近似犯罪。等式在attachment中。我为偶数和奇数术语编写了单独的循环,因为它们显示在附件中。

import math 

x1=0
x2=math.pi
N=6
delta_x=(x2-x1)/N
f=math.sin
sum=f(0)

#odd summation
for i in range (1,N+1):
    sum=sum+f(x1+(2*i+1)*delta_x)

sum=4*sum
print(sum)

#even summation

for i in range(2,N+1):
    sumeven=0
    sumeven=sumeven+f(x1+(2*i)*delta_x)
sumeven=2*sumeven

sumeven=sumeven+f(N)
print(sumeven)

integral=(delta_x/3)*(sum+sumeven) 
print(integral)   

但是当我打印这些值时,它给出了非常小的负数。

任何人都可以看到我的代码出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

首先,学习一些基本的调试。对于此代码,您只完成了两条简单的$('.product_tile .addtocartbutton').each(function(){ $(this).prop('disabled') ? $(this).css('background','#ccc') : $(this).css('background','#EEDED1'); }); 行,这两行都没有跟踪更详细的问题。查看这个可爱的debug博客以获取帮助。我添加了一些工具,清理了一些样式,然后再次运行代码,更好地跟踪逻辑和数据流。诊断如下。

print

输出:

sum_odd = f(0)

# odd summation
for i in range (1, N+1):
    x_val = x1 + (2*i+1)*delta_x
    sum_odd = sum_odd + f(x_val)
    print (x_val/math.pi, "pi", f(x_val), sum_odd)

sum_odd = 4*sum_odd

print(sum_odd)

# even summation
for i in range(2, N+1):
    sum_even = 0
    x_val = x1 + (2*i)*delta_x
    sum_even = sum_even + f(x_val)
    print (x_val/math.pi, "pi", f(x_val), sum_even)

<强>诊断

你有两个直接的问题:

  1. 在循环中初始化sum_even ,这会丢弃系列中那一半的先前计算。在循环之前移动它。
  2. 您在上整合了两次指定的范围;这个,单独,会得到一个很小的值(理想情况下,这将是0,这是函数完整周期的积分)。
  3. 修复初始化,修复限制,你应该看到好的结果,更像是这样:

    0.5 pi 1.0 1.0
    0.8333333333333333 pi 0.5000000000000003 1.5000000000000004
    1.1666666666666665 pi -0.4999999999999997 1.0000000000000007
    1.5 pi -1.0 6.661338147750939e-16
    1.8333333333333333 pi -0.5000000000000004 -0.4999999999999998
    2.1666666666666665 pi 0.4999999999999993 -4.996003610813204e-16
    -1.9984014443252818e-15
    0.6666666666666666 pi 0.8660254037844387 0.8660254037844387
    1.0 pi 1.2246467991473532e-16 1.2246467991473532e-16
    1.3333333333333333 pi -0.8660254037844384 -0.8660254037844384
    1.6666666666666665 pi -0.866025403784439 -0.866025403784439
    2.0 pi -2.4492935982947064e-16 -2.4492935982947064e-16
    -0.27941549819892636
    -0.04876720424671586
    

    另外,我强烈建议你学习有关调试和编码风格的教程;这些将在未来的工作中帮助您。我从经验中知道。 : - )