如何使用sympy来找出定积分逼近的误差?

时间:2014-12-17 02:26:52

标签: python sympy

我们的任务是使用sympy来评估函数的精确定积分,然后将它与我们编写的另一个python函数得到的定积分的近似值进行比较。使用简单的多项式函数,我的代码工作正常,但是具有复杂的正弦函数,它可以保持破坏或返回nan。

from numpy import *
def simpson(f,a,b,n):
  if n<=0 or n%2!=0:
    print('Error: the number of subintervals must be a positive even number')
    return float('NaN')
  h = float(b - a) / float(n)
  x = arange(a,b+h,h)
  fx = f(x)
  fx[1:n:2] *= 4.0
  fx[2:n:2] *= 2.0
  return (h/3.)*sum(fx)

这是在一个文件(simpandtrap)中,并使用simpson规则逼近n个子区间给出f从a到b的定积分的近似值

from pylab import *

def s(x):
  return x*sin(3./(x+(x==0)))    

这是一个给我带来麻烦的函数,在一个名为assignment8functions

的文件中
import assignment8functions as a
import SimpAndTrap as st
import sympy as sp
x = sp.symbols('x')
Exact_int_q = sp.integrate(a.q(x),(x,0,2)).evalf(25)
Exact_int_s = sp.integrate(x*sp.sin(3./(x)),(x,0,2)).evalf(25)

q(x)是我们应该使用的另一个函数,一切正常 - 它只是一个多项式。当我尝试以相同的方式进行集成时,我必须将s(x)的函数直接放入调用而不是从另一个文件中导入一个

n = a.array([10,100,1000,10000,10000,1000000])
s_error_simp_array = a.zeros(6)
for i in a.arange(6):
  s_error_simp_array[i] = abs(Exact_int_s - st.simpson(a.s,0,2,n[i])

这里我试着在近似中找到错误。问题首先是Exact_int_s显然是-4.5 * Si(动物园)+ 8.16827746848576,我不知道那是什么意思,而且simpson函数总是返回nan。

我知道很多单词和代码,但是有人知道错误吗?

1 个答案:

答案 0 :(得分:1)

要避免回答-4.5*Si(zoo)+ 8.---,只需以小的正数开始积分,例如:

x = sp.Symbol('x')
print sp.integrate( x * sin(3./x), (x, 0.000001, 2) )

你会得到像1.0996940...

这样的答案

您可以证明这一点是正确的,因为|s(x)| <= x适用于小x,所以时间间隔[0, epsilon]无法做出那么多贡献。

顺便说一句 - 你的辛普森实施似乎已经结束了。

相关问题