计算值数组 - Python

时间:2014-09-24 09:14:00

标签: python for-loop numpy plot scipy

我正在尝试计算并绘制时间相关amp微分运动方程(见t)解的振幅rhs6,作为wd的函数对于f中找到的力系数f_array的多个值。

到目前为止,我已经将代码用于针对amp绘制wd以获得f的单个值。结果是共振峰:

Resonance peak

下面给出了ampwd的{​​{1}}的一个值(产生上述图像)的代码。

f

现在,我希望针对from pylab import * from scipy.integrate import odeint from numpy import * import math #Parameters. k = 2.0 m = 1.0 w0 = (k/m)**(1/2) alpha = 0.2 l = alpha/(2*m) f = 1.0 wd = w0 + 0.025 beta = 0.2 t_fixed = 2.0 #Arrays. t = linspace(0.0, 400.0, 400.0) wd_array = linspace(w0-1.0, w0+1, 400.0) f_array = linspace(10.0, 100.0, 3.0) #Time step. init_x = 0.0 init_v = 0.0 dx = 15.0 dv = 0.0 init_cond = [init_x,init_v] init_cond2 = [init_x + dx,init_v + dv] def rhs6(c,t,wd): c0dot = c[1] c1dot = -2*l*c[1] - w0*w0*c[0] + (f/m)*cos((wd)*t) return [c0dot, c1dot] amp_array=[] for wd in wd_array: res = odeint(rhs6, init_cond, t, args=(wd,)) amp = max(res[:,0]) amp_array.append(amp) plot(wd_array, amp_array) xlabel('Driving frequency, wd') ylabel('Ampltiude, amp') show() 找到amp多个wd的值。我试图通过基本上在f上创建一个for循环语句来做到这一点。但是,我的方法不起作用,我收到错误:

f_array

因为展示尝试是好的,所以下面是我的。

setting an element with a sequence

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的问题是full_array是一个numpy数组,您正在尝试将其中的元素设置为列表,因此setting an element with a sequence

要解决此问题,您可以改为创建一个二维numpy数组,然后将每行设置为amp_array,如下所示

from pylab import *
from scipy.integrate import odeint
from numpy import *
import math

#Parameters.
k = 2.0
m = 1.0
w0 = (k/m)**(1/2)
alpha = 0.2
l = alpha/(2*m)
f = 1.0
wd = w0 + 0.025
beta = 0.2
t_fixed = 2.0

#Arrays.
t = linspace(0.0, 200.0, 200.0)
wd_array = linspace(w0-1.0, w0+1, 200.0)
f_array = linspace(10.0, 200.0, 3.0)

#Time step.
init_x = 0.0
init_v = 0.0
dx = 15.0
dv = 0.0
init_cond = [init_x,init_v]
init_cond2 = [init_x + dx,init_v + dv]

def rhs6(c,t,wd,f):
    c0dot = c[1]
    c1dot = -2*l*c[1] - w0*w0*c[0] + (f/m)*cos((wd)*t)
    return [c0dot, c1dot]

full_array = zeros((len(f_array),len(wd_array)))
for index,force in enumerate(f_array):
    amp_list = []
    for wd in wd_array:
        res = odeint(rhs6, init_cond, t, args=(wd,force))
        amp = max(res[:,0]) 
        amp_list.append(amp)
        # print(res)
    amp_array = array(amp_list)
    full_array[index,:] = amp_array

for f in full_array:
    plot(wd_array, f)

show()

或者,您可以关注gboffi's建议并使用np.vstacknp.hstack来创建full_array

最后绘制数组的for循环也不正确,所以我编辑了它。图表看起来像 Plot