2013-03-16 81 views
0

嘿我試圖得到以下問題的情節: U(x)= U0,如果| x | ≥x0 U(x)= U0 * | x |/x0 if | x | < X0只有長度爲1的數組可以轉換爲Python標量

和PROGRAMM:

from pylab import* 
x_0=5 
U_0=200 
#U_x=zeros(n,1) 
#x=zeros(n,1) 
x=arange(-20,20,0.01) 
if float(abs(x))>=x_0: 
    U_x=U_0 
elif float(abs(x))<x_0: 
    U_x=U_0*(float(abs(x))/x_0) 
fig=figure() 
suptitle("a)") 
fig.subplots_adjust(hspace=0.5) 
plot(x,U_x) 
xlabel('x [m]') 
ylabel('U_x [J]') 
show() 

但我總是得到這樣的錯誤:

if float(abs(x))>=x_0: 
TypeError: only length-1 arrays can be converted to Python scalars 

請幫助:)

+0

你的'x'是一個數組。 'abs()'需要一個標量。你想達到什麼目的? – 9000 2013-03-16 12:57:47

+2

@ 9000:'abs()'不需要標量,它可以處理數組操作數;它是引發異常的'float()'。 – DSM 2013-03-16 13:01:47

回答

8

ABS(x)是一個數組,你不能將數組轉換爲浮點值,即錯誤。你可以寫一個for循環來進行計算,但如果條件爲numpy.where,numpy可以做矢量化處理。欲瞭解更多信息,請閱讀document

import numpy as np 
x = np.arange(-20, 20, 0.01) 
x0 = 5 
U0 = 200 
u = np.where(np.abs(x) >= x0, U0, U0*np.abs(x)/x0) 
plot(x, u, lw=3) 

輸出:

enter image description here

您還可以使用piecewise功能,它可以處理更復雜的情況。

相關問題