0

ねえ私は次の問題のプロットを取得しようとしています:U(x)= U0、if | x | ≥x0U(x)= U0 * | x | / x0 if | x | <x0

およびプログラム:

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

助けてください:)

4

1 に答える 1

8

abs(x)は配列であり、配列を浮動小数点値に変換することはできません。これがエラーです。計算を行うためにforループを書くことができますが、numpyは条件によってベクトル化された場合に行うことができますnumpy.where。詳細については、次のドキュメントを参照してください。

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)

出力:

ここに画像の説明を入力してください

区分的関数を使用することもでき、より複雑なケースに対処できます。

于 2013-03-16T12:58:36.217 に答える