我试图通过使用梯形规则来解决sin(x)函数的泰勒近似的积分.代码似乎很好,但它一直给我以下错误:“TypeError:’添加’对象不可调用”
这是我的代码:
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')
f = sin(x)
# Factorial function
if n <= 0:
return 1
else:
return n*factorial(n-1)
taylor_series = sin(x).series(n=None)
# Do a trapezoid integration
xedge = numpy.linspace(a,b,N+1)
integral = 0.0
n = 0
while n < N:
integral += 0.5*(xedge[n+1] - xedge[n])*(f(xedge[n]) + f(xedge[n+1]))
n += 1
return integral
N = 3
a = 0.0
b = 1.0
z = sum([next(taylor_series) for i in range(N)])
print("Taylor series:",z)
# Trapezoid rule result
N = 2
while (N <= 2):
dd = trap(a,b,z,N)
print ('Trapezoid rule result:', dd)
N *= 2
追溯:
Error: Traceback (most recent call last):
File "Question1.py", line 86, in <module>
dd = trap(a,b,z,N)
File "Question1.py", line 67, in trap
integral += 0.5*(xedge[n+1] - xedge[n])*(f(xedge[n]) + f(xedge[n+1]))
TypeError: 'Add' object is not callable
解决方法:
在你的情况下,f是一个表达的表达.你不能只是通过调用来评估它;你必须使用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