“浮动”对象没有属性“罪恶”

时间:2019-10-31 17:35:08

标签: python numpy scipy sympy

当我打印矩阵时,它会显示一条错误消息,指出“浮点”对象没有属性“ sin”。

在Python中进行编码时,我尝试使用sym.matrix以符号形式打印矩阵,但我在数字上定义了矩阵。当我去打印矩阵时,它会显示一个错误,指出“ Float”对象没有属性“ sin”。似乎由于某种原因,我的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 个答案:

答案 0 :(得分:1)

通过导入各个函数并使用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,所以您发布的代码不是产生该错误的代码,因为编译器将首先跳过该错误。您可以张贴产生此错误的实际代码,还是理想情况下的一个简单示例。

答案 1 :(得分:1)

修复导入

请首先检查@Ari Cooper-Davis的答案以获取这些修复程序。如果要包含导入语句,请确保发布的代码可以编译。

这是一种方法:

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

您将不需要numpy的sin,cos和pi方法,因为我们将使用sympy的方法。

空白

确保当您有表达式时,运算符周围的空格是偶数。换句话说,您可以拥有1 + 21+2,但不能拥有1 +21+ 2。这只是提高可读性的好方法,从长远来看可以帮助您捕获错误。这种长表达式字符串会很快使您感到困惑。

象征性与脾气暴躁

这两个库往往不能很好地配合使用。一个是符号,另一个是数字。

作为解决此问题的一种方法,将所有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)

答案 2 :(得分:1)

如果使用混合对象(例如数字,字符串或符号)创建一个numpy数组,则会得到一个对象dtype数组。

在此类数组上的

np.sin(arr)是通过调用[x.sin() for x in arr]来执行的,即,它将任务委托给每个元素的sin方法。大多数对象(包括浮点数)都没有这种方法,因此会失败。其他numpy功能,例如expsqrt也是如此。可以委派一些东西,例如加法。

您使用sympy的唯一指示是sym.Matrix呼叫。我不明白您打算怎么做。您期望什么样的符号形式? sympy不会“进入” scipy/numpy代码并将其转换为符号。充其量,它将尝试通过将符号传递给numpy代码来评估代码,从而导致此错误。

将sympy和numpy混合是很棘手的,而且常常不是错误的。

Why sympy lambdify function cannot identify numpy sum function and multiply function

是尝试一起使用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进一步使事情变得复杂,后者又将积分变量xnr传递到Phi_V


仍在isympy会话中,

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

使用@Ian建议的功能,使用sympy的{​​{1}}版本,等等:

sin

但这不会显示有关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中的目标函数。