生成数据。
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.结果