2017-06-19 81 views
0

我试图使用雅可比椭圆函数从mpmath,但得到了简单的代码的错误下面给出无属性:的Python:AttributeError的:“MPC”(或“MPF”)对象具有“ARCSIN”

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)的实际部分,我也会收到错误。 我不知道我是否犯了一个错误。请帮助。 在此先感谢。

+0

我需要为我的节目休息包等。所以我导入它们。 – user43280

回答

3

ympc对象,y.realmpf对象。 numpy对此类对象一无所知,因此当您拨打np.arcsin(y)时,numpy代码将检查参数是否有arcsin()方法(即它查找y.arcsin())。如果是这样,它会调用该函数来计算arcsin。 mpcmpf对象没有这样的方法,这会导致您看到的错误。 (如果该错误消息说,这将是很好的东西,如“numpy的不知道如何计算的强积金对象的反正弦”。)

这是同样的行为有不同的对象证明:

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功能,首先转换为纯通过传递牛逼浮点或复杂他mpcmpf对象分别通过内建函数complex()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 
+0

我宁愿使用'mpmath.asin',因为这允许保留在这个任意精度库中。返回一个mpmath.ctx_mp_python.mpf对象,而不是像'math.asin'这样的浮点数。 – Hannebambel

+0

@Hannebambel是的,这是有道理的。我认为Satadru有一个使用'np.arcsin'的理由,但也许它只是缺乏'mpmath.asin'的意识。我已经更新了我的答案。 –

+0

是的,我不知道'mpmath.asin'。其实我在蟒蛇里很骨架。 – user43280

相关问题