当我打印矩阵时,它会显示一条错误消息,指出“浮点”对象没有属性“ 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'
答案 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 + 2
和1+2
,但不能拥有1 +2
或1+ 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
功能,例如exp
和sqrt
也是如此。可以委派一些东西,例如加法。
您使用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
进一步使事情变得复杂,后者又将积分变量x
加n
和r
传递到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
中的目标函数。