1

我试图从 中使用 Jacobi 椭圆函数mpmath,但得到下面给出的简单代码的错误:

import numpy as np
import scipy.integrate as spi
from scipy import special as sp
import matplotlib.pyplot as plt
from math import sqrt, pow, log
from mpmath import ellipfun

sn = ellipfun('sn')
y=sn(0.5,-1)
print y

y1=y.real
print y1, np.arcsin(y), np.arcsin(y1)

即使我只传递函数的实部,我也会收到错误消息sn(0.5,-1)。我不知道我是否犯了错误。请帮忙。提前致谢。

4

1 回答 1

5

y是一个mpc对象,并且y.real是一个mpf对象。numpy 对此类对象一无所知,因此当您调用 时np.arcsin(y),numpy 代码会检查参数是否具有arcsin()方法(即,它会查找y.arcsin())。如果是,它将调用该函数来计算 arcsin。mpcmpf对象没有这样的方法,这会导致您看到的错误。(如果错误消息说“numpy 不知道如何计算 mpf 对象的 arcsin”之类的话,那就太好了。)

以下是使用不同对象演示的相同行为:

In [10]: class Foo:
    ...:     pass
    ...: 

In [11]: f = Foo()

In [12]: np.arcsin(f)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-aa4b1a80cd4e> in <module>()
----> 1 np.arcsin(f)

AttributeError: Foo instance has no attribute 'arcsin'

正如 Hannebambel 在评论中指出的那样,您可以使用mpmath.asin而不是np.arcsin

In [6]: import mpmath

In [7]: y = sn(0.5, -1)

In [8]: mpmath.asin(y)
Out[8]: mpc(real='0.52001273608158616', imag='0.0')

要使用 numpy函数,首先通过将和对象分别传递给内置函数和arcsin来转换为普通浮点数或复数:mpcmpfcomplex()float()

In [19]: y
Out[19]: mpc(real='0.49689119041931196', imag='0.0')

In [20]: np.arcsin(float(y.real))
Out[20]: 0.52001273608158627

In [21]: np.arcsin(complex(y))
Out[21]: (0.52001273608158616+0j)

或使用math.asin代替numpy.arcsin

In [25]: import math

In [26]: math.asin(y.real)
Out[26]: 0.5200127360815863
于 2017-06-19T13:50:24.160 回答