我们的任务是使用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。
我知道很多单词和代码,但是有人知道错误吗?
答案 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]
无法做出那么多贡献。
顺便说一句 - 你的辛普森实施似乎已经结束了。