在你的情况下 f 是一个 sympy 表达。你不能只是通过调用来评估它;你必须使用 evalf() 方法:
f
sympy
evalf()
... integral += 0.5*(xedge[n+1] - xedge[n])*(f.evalf(xedge[n]) + f.evalf(xedge[n+1])) ...
产生输出:
Taylor series: x**5/120 - x**3/6 + x Trapezoid rule result: 0.0079345703125*x**5 - 0.158203125*x**3 + 1.0*x End
你的命令 f = sin(x) 是无效的;这个论点是一个 sympy.Symbol ,而不是法律论据 sin 功能。
f = sin(x)
sympy.Symbol
sin
为了将来参考,这里是我如何分解问题以隔离错误。更换 f 同 sin 解决了这个问题...可能不是你的任务所需要的,但在调试中很有用。
import math import numpy import sympy as sy import numpy as np from sympy.functions import sin,cos import matplotlib.pyplot as plt x = sy.Symbol('x') print "sy.Symbol('x') is", x, type(x) f = sin(x) # Factorial function that will be used in the Taylor approximation def factorial(n): if n <= 0: return 1 else: return n*factorial(n-1) taylor_series = sin(x).series(n=None) #def fun(x): # return numpy.sin(x) # Do a trapezoid integration by breaking up the domain [a,b] into N slabs def trap(a,b,f,N): xedge = numpy.linspace(a,b,N+1) integral = 0.0 n = 0 while n < N: x0 = xedge[n] x1 = xedge[n+1] print x0, x1 sub1 = x1 - x0 f0 = math.sin(x0) f1 = math.sin(x1) sub2 = f0 + f1 integral = integral + 0.5 * sub1 * sub2 n += 1 return integral N = 3 a = 0.0 b = 1.0 # takes the number of terms desired for your generator z = sum([next(taylor_series) for i in range(N)]) print("Taylor series:",z) # Trapezoid rule result and calculaiton of error term N = 2 while (N <= 2): dd = trap(a,b,z,N) print ('Trapezoid rule result:', dd) N *= 2