我必须在python中编写一个函数,s(x)= x * sin(3 / x),它能够获取单个值或向量/数组,但我在处理这些案例时遇到一些麻烦当x为零(或者有一个零为零的元素)时。这就是我到目前为止所做的:
def s(x):
result = zeros(size(x))
for a in range(0,size(x)):
if (x[a] == 0):
result[a] = 0
else:
result[a] = float(x[a] * sin(3.0/x[a]))
return result
哪个...对x = 0不起作用。它有点混乱。更糟糕的是,我无法在其上使用sympy的集成功能,或者在我自己的simpson / trapezoidal规则代码中使用它。有什么想法吗?
当我在此函数上使用integrate()
时,收到以下错误消息:"Symbol" object does not support indexing.
答案 0 :(得分:1)
每次integrate
电话大约需要30秒:
import sympy as sp
x = sp.Symbol('x')
int2 = sp.integrate(x*sp.sin(3./x),(x,0.000001,2)).evalf(8)
print int2
int1 = sp.integrate(x*sp.sin(3./x),(x,0,2)).evalf(8)
print int1
结果是:
1.0996940
-4.5*Si(zoo) + 8.1682775
显然,您希望从小的正数开始积分,以避免x = 0处的问题。
您还可以将x*sin(3./x)
分配给变量,例如:
s = x*sin(3./x)
int1 = sp.integrate(s, (x, 0.00001, 2))
我的原始答案使用scipy来计算积分:
import scipy.integrate
import math
def s(x):
if abs(x) < 0.00001:
return 0
else:
return x*math.sin(3.0/x)
s_exact = scipy.integrate.quad(s, 0, 2)
print s_exact
有关更多集成选项,请参阅the scipy docs。
答案 1 :(得分:0)
如果您想使用SymPy的集成,则需要一个符号功能。一个点上的错误值对于积分(至少在数学上)并不重要,所以你不应该担心它。
似乎SymPy中存在一个错误,它在zoo
为0时给出答案,因为它没有正确使用limit
。您需要手动计算限制。例如,从0到1的积分:
In [14]: res = integrate(x*sin(3/x), x)
In [15]: ans = limit(res, x, 1) - limit(res, x, 0)
In [16]: ans
Out[16]:
9⋅π 3⋅cos(3) sin(3) 9⋅Si(3)
- ─── + ──────── + ────── + ───────
4 2 2 2
In [17]: ans.evalf()
Out[17]: -0.164075835450162