2017-06-19 2 views
0

je tentais d'utiliser la fonction elliptique Jacobi de mpmath, mais obtenir l'erreur pour le simple code ci-dessous:Python: AttributeError: 'mpc' (ou 'mpf') objet n'a pas d'attribut '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) 

Je reçois l'erreur même lorsque je ne passe que la partie réelle de la fonction sn(0.5,-1). Je ne sais pas si je fais une erreur. Aide aimablement. Merci d'avance.

+0

J'ai besoin d'autres paquets pour le repos de mon programme. Donc je les importe. – user43280

Répondre

3

y est un objet mpc et y.real est un objet mpf. numpy ne sait rien de ces objets, donc quand vous appelez np.arcsin(y), le code numpy vérifie si l'argument a une méthode arcsin() (c'est-à-dire qu'il recherche y.arcsin()). Si c'est le cas, il appellera cette fonction pour calculer l'arcsin. Les objets mpc et mpf n'ont pas une telle méthode, ce qui entraîne l'erreur que vous voyez. (Ce serait bien si le message d'erreur dit quelque chose comme « numpy ne sait pas comment calculer la arcsin d'un objet MPF ».)

est ici le même comportement démontré par un autre objet:

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' 

comme l'a souligné dans un commentaire par Hannebambel, vous pouvez utiliser mpmath.asin au lieu de 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') 

pour utiliser la fonction numpy arcsin, d'abord convertir en virgule flottante simple ou complexe en passant t il des objets mpc et mpf à travers les fonctions BUILTIN complex() et float(), respectivement:

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) 

Ou utiliser math.asin au lieu de numpy.arcsin:

In [25]: import math 

In [26]: math.asin(y.real) 
Out[26]: 0.5200127360815863 
+0

Je préfère utiliser 'mpmath.asin' car cela permet de rester dans cette bibliothèque de précision arbitraire. Retourne un objet mpmath.ctx_mp_python.mpf, pas un flottant comme 'math.asin'. – Hannebambel

+0

@Hannebambel Oui, cela a du sens. J'ai supposé que Satadru avait une raison d'utiliser 'np.arcsin', mais peut-être que c'était juste un manque de conscience de' mpmath.asin'. J'ai mis à jour ma réponse. –

+0

Oui, je ne connaissais pas 'mpmath.asin'. En fait, je suis très induit en python. – user43280