我试图找出为什么我的代码中出现上述错误。该程序假设使用牛顿拉夫森方法在给定两个输入参数的情况下查找 4 连杆机构中连杆的位置。
该行发生错误
g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
预先感谢您的帮助。
import numpy as np
L1=1
L2=1.5 * L1
theta = 40 * np.pi / 180
#initial guesses
L3 = 1.5
alpha = 30 * np.pi / 180
epsilon = 1
n = 0
while epsilon > 0.0001:
g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
dg1dalpha = -L2 * np.sin(alpha)
dg1dL3 = -1;
g2 = L1 * np.sin(theta) - L2 * np.sin(alpha)
dg2dalpha = -L2 * np.cos(alpha);
dg2dL3 = 0
J = np.array([[dg1dalpha, dg1dL3], [dg2dalpha, dg2dL3]])
s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])
epsilon_alpha = abs(s[0] - alpha)
epsilon_L3 = abs(s[1] - L3)
epsilon = max(epsilon_alpha.all, epsilon_L3.all)
alpha = s[0]
L3 = s[1]
n = n + 1
print(n, alpha, L3)
最佳答案
在Python2.7中添加print('alpha',alpha)
在循环开始时产生:
('alpha', 0.5235987755982988)
('alpha', array([ 1.85083849, 2.29325173]))
('alpha', array([[array([ 1.98227296, 1.95343536]), 1.7138098231972174],
[array([ 1.81303794, 1.7604074 ]), 2.2932517265367176]], dtype=object))
Traceback (most recent call last):
File "stack32444132.py", line 17, in <module>
g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
AttributeError: 'numpy.ndarray' object has no attribute 'cos'
所以错误是由调用 np.cos(alpha)
引起的哪里alpha
是一个对象数组。 alpha
是 (2,2)
;第一列包含长度为 2 的数组;第二个包含 float 。
因此,在循环中的某个时刻,您要附加或连接不同长度的数组或列表。
s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])
alpha = s[0]
添加更多打印内容(在 s
之前)
('J', (2, 2), dtype('float64'))
('alpha', 0.5235987755982988)
('L3', 1.5)
....
('J', (2, 2), dtype('O'))
('alpha', array([ 1.85083849, 2.29325173]))
('L3', array([-10.61649234, 1.5 ]))
在第二个循环中J
从 2x2 float 矩阵更改为 2x2 对象矩阵。
Python3 在第一次遇到 epsilon = max(epsilon_alpha.all, epsilon_L3.all)
时更早地引发了错误表达。 epsilon_alpha.all
是一种方法; epsilon_alpha.all()
是一个 bool 值。但即使这样也会在 epsilon_alpha
时产生错误。变成一个数组。
好的,这个循环运行( alpha
仍然是标量);它不会停止,大概是因为epsilon
变得不够小;但我会把它留给你。
while epsilon > 0.0001:
# print('alpha', alpha)
g1 = L1 * np.cos(theta) + L2 * np.cos(alpha) - L3
dg1dalpha = -L2 * np.sin(alpha)
dg1dL3 = -1;
g2 = L1 * np.sin(theta) - L2 * np.sin(alpha)
dg2dalpha = -L2 * np.cos(alpha);
dg2dL3 = 0
J = np.array([[dg1dalpha, dg1dL3], [dg2dalpha, dg2dL3]])
print('J', J.shape,J.dtype) # (2,2) floats
s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])
s = s[:,0] # fudge to turn (2,2) array into a (2,) array
epsilon_alpha = abs(s[0] - alpha)
epsilon_L3 = abs(s[1] - L3)
epsilon = max(epsilon_alpha, epsilon_L3)
# max on 2 scalars is ok
alpha = s[0] # scalar
L3 = s[1] # scalar
n = n + 1
问题的根源在于
s = np.array([[alpha], [L3]]) - J/np.array([[g1], [g2]])
如果alpha
和L3
是标量,则 np.array([[alpha], [L3]])
是 (2,1)
。 np.array([[g1], [g2]])
也是如此。但自从 J
是 (2,2), s
也是(2,2)。但你一直在使用s[0]
和s[1]
,显然假设s
是`(2,)。
s = s[:,0]
使s
a (2,) 所以代码的其余部分可以工作。自 epsilon
不收敛,这可能是错误的修复。
我可以强调一下 - 开发时 numpy
代码中,请密切注意数组形状。如果形状错误,你会得到这样的错误。根据我的经验,获得正确的形状占调试工作的 80%。
关于python - 属性错误: 'numpy.ndarray' object has no attribute 'cos' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444132/