У объекта 'Float' нет атрибута 'sin' - PullRequest
0 голосов
/ 31 октября 2019

Когда я иду печатать свою матрицу, она печатает ошибку, которая говорит, что у объекта 'Float' нет атрибута 'sin'.

Во время кодирования в Python я пытаюсь напечатать матрицу в символической форме, используяsym.matrix, но я определяю свою матрицу численно. Когда я иду печатать свою матрицу, она печатает ошибку, которая говорит, что у объекта 'Float' нет атрибута 'sin'. Похоже, что по какой-то причине моя функция греха не читается или не выводится должным образом.


import numpy as np
from scipy.integrate import quad
from numpy import sin, cos, pi

N = 5 

L = 1

r_e = 1.4

mu = 916

def Phi_V(x,n,r):
    return (2/L)**(1/2) * sin(n*np.pi*x/L +n*np.pi/2) * 4.7 * (1-np.exp(-x))**2 * (2/L)**(1/2) * sin(r*np.pi*x/L +r*np.pi/2)
def V_Func(n,r,j):
    return quad(Phi_V, -L/2, L/2, args = (n,r))[0] + (j*j+1)/(2*mu*r_e**2)

V = sym.Matrix(N,N, lambda n,r: V_Func(n + 1 ,r + 1,10))

V

Я получаю это сообщение об ошибке:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-38-8624393320b4> in <module>()
     16     return quad(Phi_V, -L/2, L/2, args = (n,r))[0] + (j*j+1)/(2*mu*r_e**2)
     17 
---> 18 V = sym.Matrix(N,N, lambda n,r: V_Func(n + 1 ,r + 1,10))
     19 
     20 V

/anaconda3/lib/python3.7/site-packages/sympy/matrices/dense.py in __new__(cls, *args, **kwargs)
    418 class MutableDenseMatrix(DenseMatrix, MatrixBase):
    419     def __new__(cls, *args, **kwargs):
--> 420         return cls._new(*args, **kwargs)
    421 
    422     @classmethod

/anaconda3/lib/python3.7/site-packages/sympy/matrices/dense.py in _new(cls, *args, **kwargs)
    430             rows, cols, flat_list = args
    431         else:
--> 432             rows, cols, flat_list = cls._handle_creation_inputs(*args, **kwargs)
    433             flat_list = list(flat_list) # create a shallow copy
    434         self = object.__new__(cls)

/anaconda3/lib/python3.7/site-packages/sympy/matrices/matrices.py in _handle_creation_inputs(cls, *args, **kwargs)
   2111                     flat_list.extend(
   2112                         [cls._sympify(op(cls._sympify(i), cls._sympify(j)))
-> 2113                          for j in range(cols)])
   2114 
   2115             # Matrix(2, 2, [1, 2, 3, 4])

/anaconda3/lib/python3.7/site-packages/sympy/matrices/matrices.py in <listcomp>(.0)
   2111                     flat_list.extend(
   2112                         [cls._sympify(op(cls._sympify(i), cls._sympify(j)))
-> 2113                          for j in range(cols)])
   2114 
   2115             # Matrix(2, 2, [1, 2, 3, 4])

<ipython-input-38-8624393320b4> in <lambda>(n, r)
     16     return quad(Phi_V, -L/2, L/2, args = (n,r))[0] + (j*j+1)/(2*mu*r_e**2)
     17 
---> 18 V = sym.Matrix(N,N, lambda n,r: V_Func(n + 1 ,r + 1,10))
     19 
     20 V

<ipython-input-38-8624393320b4> in V_Func(n, r, j)
     14     return (2/L)**(1/2) * sin(n*np.pi*x/L +n*np.pi/2) * 4.7 * (1-np.exp(-x))**2 * (2/L)**(1/2) * sin(r*np.pi*x/L +r*np.pi/2)
     15 def V_Func(n,r,j):
---> 16     return quad(Phi_V, -L/2, L/2, args = (n,r))[0] + (j*j+1)/(2*mu*r_e**2)
     17 
     18 V = sym.Matrix(N,N, lambda n,r: V_Func(n + 1 ,r + 1,10))

/anaconda3/lib/python3.7/site-packages/scipy/integrate/quadpack.py in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
    339     if weight is None:
    340         retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,
--> 341                        points)
    342     else:
    343         retval = _quad_weight(func, a, b, args, full_output, epsabs, epsrel,

/anaconda3/lib/python3.7/site-packages/scipy/integrate/quadpack.py in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
    446     if points is None:
    447         if infbounds == 0:
--> 448             return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    449         else:
    450             return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)

<ipython-input-38-8624393320b4> in Phi_V(x, n, r)
     12 
     13 def Phi_V(x,n,r):
---> 14     return (2/L)**(1/2) * sin(n*np.pi*x/L +n*np.pi/2) * 4.7 * (1-np.exp(-x))**2 * (2/L)**(1/2) * sin(r*np.pi*x/L +r*np.pi/2)
     15 def V_Func(n,r,j):
     16     return quad(Phi_V, -L/2, L/2, args = (n,r))[0] + (j*j+1)/(2*mu*r_e**2)

AttributeError: 'Float' object has no attribute 'sin'

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Исправьте ваш импорт

Сначала проверьте ответ @Ari Cooper-Davis на эти исправления. Убедитесь, что код, который вы публикуете, компилируется, если вы собираетесь включить операторы импорта.

Вот один из способов:

import sympy as sym
import numpy as np
from scipy.integrate import quad

Вам не понадобятся методы sin, cos и pi numpy, потому чтомы будем использовать их.

Пробел

Убедитесь, что когда у вас есть выражение, пробел вокруг ваших операторов четный. Другими словами, вы можете иметь 1 + 2 и 1+2, но не 1 +2 или 1+ 2. Это просто хорошая практика для удобочитаемости и помогает выявлять ошибки в конечном счете. Строки длинных выражений очень быстро запутываются.

Sympy vs. Numpy

Эти две библиотеки не очень хорошо играют вместе. Один символический, а другой числовой.

Чтобы исправить это, замените все ваши np вызовы на sym (при условии, что вы используете import sympy as sym). У Sympy есть своя собственная версия sin и pi, которую вы обмениваетесь версиями Numpy.

Примерно так:

return ((2/L)**(1/2)) * sym.sin(n * sym.pi * (x/L) + n * sym.pi/2) * 4.7 * (1 - sym.exp(-x))**2 * (2/L)**(1/2) * sym.sin(r * sym.pi * x/L + r * sym.pi/2)
1 голос
/ 31 октября 2019

Если вы создаете массив из смешанных объектов, таких как числа, строки или символы, вы получаете массив типа dtype.

np.sin(arr) для такого массива выполняется путем вызова [x.sin() for x in arr], т.е. он делегирует задачу методу sin каждого элемента. У большинства объектов, в том числе с плавающей точкой, такого метода нет, поэтому он не работает. То же самое относится и к другим numpy функциям, таким как exp и sqrt. Некоторые функции делегируются просто отлично, например сложение.

Единственный признак того, что вы используете sympy, - это вызов sym.Matrix. Я не понимаю, что вы пытаетесь сделать с этим. Какую символическую форму вы ожидаете? sympy не собирается «доходить» до кода scipy/numpy и преобразовывать его в символы. В лучшем случае он попытается оценить код, передав символы в код numpy, что приведет к этой ошибке.

Смешивать sympy и numpy сложно, и чаще всего это не так.

Почему функция sympy lambdify не может идентифицировать функцию numy sum и функцию умножения

- это еще один пример попытки использовать sympy и numpy вместе. Мой ответ длинный и запутанный, но я оставил его таким, чтобы понять, насколько сложно использовать два пакета вместе.

В сеансе isympy:

In [8]: Matrix                                                                  
Out[8]: sympy.matrices.dense.MutableDenseMatrix

In [9]: Matrix(3,3, lambda n,r: n+r)                                            
Out[9]: 
⎡0  1  2⎤
⎢       ⎥
⎢1  2  3⎥
⎢       ⎥
⎣2  3  4⎦

Matrix создает объект sympy, передавая индексы функции. Мы видим это более ясно с помощью:

In [10]: def foo(n,r): 
    ...:     print(n,r, type(n), type(r)) 
    ...:     return n+r 
    ...:                                                                        

In [11]: Matrix(3,3,foo)                                                        
0 0 <class 'sympy.core.numbers.Zero'> <class 'sympy.core.numbers.Zero'>
0 1 <class 'sympy.core.numbers.Zero'> <class 'sympy.core.numbers.One'>
...
Out[11]: 
⎡0  1  2⎤
⎢       ⎥
⎢1  2  3⎥
⎢       ⎥
⎣2  3  4⎦

Если мы попытаемся использовать np.sin в этой функции:

In [15]: def foo(n,r): 
    ...:     return np.sin(r) 
    ...:                                                                        

In [16]: Matrix(3,3,foo)                                                        
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
AttributeError: 'Zero' object has no attribute 'sin'
...

Как я объяснил выше, попытка использовать нечисловые значения как np.sin аргументы приводят к ошибке при делегировании методу sin.

Ваш код еще больше усложняет ситуацию, передавая значения через scipy.quad, который, в свою очередь, передает переменную интегрирования x plus nи r до Phi_V.


Все еще в сеансе isympy,

In [26]: L = 1 
    ...:  
    ...: r_e = 1.4 
    ...:  
    ...: mu = 916                                                               

Использование функции, предлагаемой @Ian, использование версий sympysin и т. Д .:

In [27]: def foo(n,r): 
    ...:     return ((2/L)**(1/2)) * sin(n * pi * (x/L) + n * pi/2) * 4.7 * (1 -
    ...:  exp(-x))**2 * (2/L)**(1/2) * sin(r * pi * x/L + r * pi/2) 
    ...:                                                                        

In [28]: foo(1,2)                                                               
Out[28]: 
              2                    
     ⎛     -x⎞                     
-9.4⋅⎝1 - ℯ  ⎠ ⋅sin(2⋅π⋅x)⋅cos(π⋅x)

In [29]: Matrix(3,3,foo)                                                        
Out[29]: 
⎡0                   0                                    0                 ⎤
⎢                                                                           ⎥
⎢                     2                                2                    ⎥
⎢            ⎛     -x⎞     2                  ⎛     -x⎞                     ⎥
⎢0       9.4⋅⎝1 - ℯ  ⎠ ⋅cos (π⋅x)        -9.4⋅⎝1 - ℯ  ⎠ ⋅sin(2⋅π⋅x)⋅cos(π⋅x)⎥
⎢                                                                           ⎥
⎢                 2                                       2                 ⎥
⎢        ⎛     -x⎞                               ⎛     -x⎞     2            ⎥
⎣0  -9.4⋅⎝1 - ℯ  ⎠ ⋅sin(2⋅π⋅x)⋅cos(π⋅x)      9.4⋅⎝1 - ℯ  ⎠ ⋅sin (2⋅π⋅x)     ⎦

Но это ничего не говорит об интеграции quad. Также его нельзя использовать в качестве целевой функции в quad.

1 голос
/ 31 октября 2019

Вы немного перепутали свой импорт, импортируя отдельные функции и также ссылаясь на них, используя np.:

import numpy as np
from numpy import sin, cos, pi
[...]sin(n*np.pi*x/L +n*np.pi/2)[...]

Либо:

import numpy as np
[...]np.sin(n*np.pi*X/l + n*np.pi/2[...]

Или:

from numpy import sin, cos, pi
[...]sin(n*pi*X/l + n*pi/2[...]

Кроме того, вы никогда не импортируете sym, так что код, который вы разместили, не является кодом, который выдает эту ошибку, так как компилятор сначала отключится. Можете ли вы опубликовать реальный код, сгенерировавший эту ошибку, или в идеале минимальный пример.

...