python程序精确法求解反应谱,傅里叶谱,功率谱

主要用于地震动处理种的代码:

  1. 傅里叶谱
        def myfft(inp,delta): #输入的x为竖向的array
            from scipy.fftpack import fft,ifft
            inp=np.array(inp).reshape(-1,1)
            inpf=np.fft.fft(inp,axis=0) #默认的是对行向量fourier变换,所以此处要定义下轴
            inpf=inpf*2/inp.shape[0]
            inpf2=inpf[0:int((inp.shape[0]+1)/2)]#取一半
            n_points=inpf2.shape[0]#地震波点数
            frequency=1/delta
            fseries=np.linspace(0,frequency/2,n_points)
            #     plt.plot(fseries,inpf2)
            return inpf2,fseries

     

  2. 功率谱
        def mypowverspectra(inp,delta):
            from scipy.fftpack import fft,ifft
            inp=np.array(inp).reshape(-1,1)
            inpf=np.fft.fft(inp,axis=0) #默认的是对行向量fourier变换,所以此处要定义下轴
            inpf=inpf*2/inp.shape[0]
            inpf2=inpf[0:int((inp.shape[0]+1)/2)]#取一半
            inpf2=np.abs(inpf2)**2
            n_points=inpf2.shape[0]#地震波点数
            frequency=1/delta
            fseries=np.linspace(0,frequency/2,n_points)
            #     plt.plot(fseries,inpf2)
            return inpf2,fseries

     

  3. 反应谱
    def myresponse(inpacc,delta,damp,Tmax):
        #Tmax是反应谱周期最大值
        inpacc=np.array(inpacc).reshape(-1,1)
        count=inpacc.shape[0]
        displace=np.zeros([count])
        velocity=np.zeros([count])
        absacce=np.zeros([count])
        ta=np.arange(delta,Tmax,delta)  # 频段范围-1/deltaHZ
        mdis=np.zeros([len(ta)])#只记录一种阻尼比的响应幅值
        mvel=np.zeros([len(ta)])
        macc=np.zeros([len(ta)])
        frcy=2*math.pi/ta
        damfrcy=frcy*np.sqrt(1-damp**2)
        e_t=np.exp(-damp*frcy*delta)
        s=np.sin(damfrcy*delta)
        c=np.cos(damfrcy*delta)
        d_f=(2*damp**2-1)/(frcy**2*delta)
        d_3t=damp/(frcy**3*delta)
        for i in range(len(ta)):
            A=np.zeros([2,2])
            A[0,0]=e_t[i]*(s[i]*damp/np.sqrt(1-damp**2)+c[i])
            A[0,1]=e_t[i]*s[i]/damfrcy[i]
            A[1,0]=-frcy[i]*e_t[i]*s[i]/np.sqrt(1-damp**2)
            A[1,1]=e_t[i]*(-s[i]*damp/np.sqrt(1-damp**2)+c[i])
            B=np.zeros([2,2])
            B[0,0]=e_t[i]*((d_f[i]+damp/frcy[i])*s[i]/damfrcy[i]+(2*d_3t[i]+1/frcy[i]**2)*c[i])-2*d_3t[i]
            B[0,1]=-e_t[i]*(d_f[i]*s[i]/damfrcy[i]+2*d_3t[i]*c[i])-1/frcy[i]**2+2*d_3t[i]
            B[1,0]=e_t[i]*((d_f[i]+damp/frcy[i])*(c[i]-damp/np.sqrt(1-damp**2)*s[i])-(2*d_3t[i]+1/frcy[i]**2)*(damfrcy[i]*s[i]+damp*frcy[i]*c[i]))+1/(frcy[i]**2*delta)
            B[1,1]=e_t[i]*(1/(frcy[i]**2*delta)*c[i]+s[i]*damp/(frcy[i]*damfrcy[i]*delta))-1/(frcy[i]**2*delta)
            for k in range(0,count-1):
                displace[k+1]=A[0,0]*displace[k]+A[0,1]*velocity[k]+B[0,0]*inpacc[k]+B[0,1]*inpacc[k+1]
                velocity[k+1]=A[1,0]*displace[k]+A[1,1]*velocity[k]+B[1,0]*inpacc[k]+B[1,1]*inpacc[k+1]
                absacce[k+1]=-2*damp*frcy[i]*velocity[k+1]-frcy[i]**2*displace[k+1]
            mdis[i]=np.max(np.abs(displace))
            mvel[i]=np.max(np.abs(velocity))
            if i==0:
                macc[i]=np.max(np.abs(inpacc))
            else:
                macc[i]=np.max(np.abs(absacce))
    #     plt.plot(ta,macc)
        return macc,ta

    反应谱是matlab代码修改的算法,详细见http://blog.sciencenet.cn/blog-419879-446739.html

你可能感兴趣的:(地震动处理)