0
点赞
收藏
分享

微信扫一扫

生成数据1.0

Xin_So 2022-01-31 阅读 68
python

生成数据。

1.模型

根据经典的多次覆盖模型,用来抽取cmp道集:
在这里插入图片描述

2.代码

# -*- coding: UTF-8 -*-import numpy as np
import  numpy as np
import  matplotlib.pyplot as plt

class GenData:
    def __init__(self,offset_of_send,offset_of_receive,S):
        '''
        :param offset_of_send: 炮点的静校正量
        :param offset_of_receive: 检波点的静校正量
        :param S: 各个地层的深度
        '''
        self.offset_of_send=offset_of_send
        self.offset_of_receive=offset_of_receive
        self.S=S
    def Draw(self,D,cmp_pos):
        '''
        画出这个道集的图像
        :param D: 各个道的地震信息
        :param cmp_pos:选中一个中心点(查看这个中心线的道集)
        :return:
        '''
        ax=plt.gca()#调整轴
        ax.xaxis.set_ticks_position('top')
        ax.invert_yaxis()
        plt.xlabel("道")
        plt.ylabel('时间')
        plt.rcParams['font.sans-serif'] = ['SimHei']#设置显示中文
        title_str="第"+str(cmp_pos+1)+"个cmp道集"
        plt.title(title_str)
        cmp_traces=D[cmp_pos]#中心点道集
        for i  in range(len(cmp_traces)):
            x_value=cmp_traces[i]+i*2
            y_value=np.arange(0,len(cmp_traces[0]))
            # plt.plot((i,i),(0,len(cmp_traces[0])),color='black')
            plt.plot(x_value,y_value,color='black')
        plt.show()



    def gen2DData(self,observationNum,CMP_TraceNum,pointNum,distance_multiple,snapInterval):
        '''
        生成每道的数目
        :param observationNum: CMP点的数目
        :param CMP_TraceNum: 每个道集的道的数目
        :param pointNum: 每道上的数目
        :param distance_multiple: 炮间距是道间距的distance_multiple倍
        :param snapInterval: 记录信号相隔的时间
        :return: 
        '''
        D=np.zeros(shape=(observationNum,CMP_TraceNum,pointNum))#得到的每条道上的数据
        for  i  in range(1,observationNum,1):#第一个炮点的位置下标为0,这个位置没有中心点
           j=0#CMP道集中,道集的炮点到中心点的距离(数组中的距离)
           while(i-j>=0):#当没有找完以该中心点为中心的道集
                start_v=np.random.uniform(low=1000,high=2000)#生成一个速度为v的波
                temp_offset_of_tace=self.offset_of_send[i-j]+self.offset_of_receive[(i-j)*distance_multiple]#CMP这条道的静校正量=炮点静校正量+检波点的静校正量
                k=0#地层数
                a = np.random.uniform(low=0, high=1)  # 地层的加速度
                t=0
                while(t<pointNum):#每道上的点
                # for  t in range(pointNum):#每道上的点
                    temp_s=self.S[k]#地层
                    temp_s=temp_s+temp_offset_of_tace#根据偏移量调整地层位置
                    L=start_v*t*snapInterval+1/2*a*a*(t*snapInterval)*(t*snapInterval)#波的当前位置
                    if(temp_s<=L):
                        D[i][j][t]=1#当前的位置上的位置设置为1
                        if(t+1<pointNum):
                             D[i][j][t+1]=-1#下一个值设置为-1
                             t=t+1#地层+1
                        k=k+1
                        if k==len(self.S):
                            break#如果到达最下面的地层,结束
                    else:
                        D[i][j][t]=0
                    t=t+1
                print("第",i,"个CMP点,第",j,'道:',D[i][j])
                j=j+1
        return D






if __name__ == '__main__':
        #观测点的数目
        send_num=6#炮点数目
        receive_num=24#检波点数目
        S_num=2#地层的数目

        np.random.seed(1)
        offset=np.array((np.random.normal(loc=0,size=[send_num+receive_num])*100),dtype=int)#炮点和的静校正量

        print(offset)
        print(sum(offset))
        # offset=[-10.0,10.0,5.0,-5.0,-30.0,30.0,-40.0,40.0,-20.0,20.0]#炮点和的静校正量
        # np.random.shuffle(offset)#打乱
        # print("offset:",offset)
        offset_of_send=offset[:send_num]#炮点的静校正量
        offset_of_receive=offset[send_num:]#检波点的静校正量

        V=np.random.randint(low=1000,high=2000,size=[send_num])#发从每个炮点发射的波的速度

        S=np.sort(np.random.uniform(low=800,high=2000,size=[S_num]))#地层的位置

        print('S:',S)

        gD=GenData(offset_of_send,offset_of_receive,S)
        observationNum = send_num  # 观测点的数目
        CMP_TraceNum = send_num  # 观测点的道集数目,(为满足矩阵,是一个最大的数)
        snapInterval=0.02#记录信号的时间间隔
        pointNum=100#一条道上的点数
        distance_multiple = 2  # 炮点距离是检波点的多少倍
        D=gD.gen2DData(observationNum,CMP_TraceNum,pointNum,distance_multiple,snapInterval)
        gD.Draw(D,cmp_pos=send_num-1)

        #把D以每行表示一道存入文件
        temp_D_data=[]#临时存放D的二维化数据
        for i  in range(D.shape[0]):#每个道集
            for j in range(D.shape[1]):#每个道
                temp_D_data.append(D[i,j])
        temp_D_data=np.array(temp_D_data)
        print(temp_D_data)
        #把temp_D_data写入文件中
        np.savetxt("data.csv",temp_D_data,delimiter=',')



3.结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

举报

相关推荐

0 条评论