在python中为x * sin(3 / x)编写函数

时间:2014-12-17 02:03:37

标签: python sympy

我必须在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.

2 个答案:

答案 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