我正在尝试使用梯形规则求解 sin(x) 函数的泰勒近似的积分。代码看起来不错,但它一直给我以下错误:“TypeError: 'Add' object is not callable”
这是我的代码:
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
是一个 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
关于python - Python 中的积分 : Add object not callable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35468985/