20_Geoist三维重力反演_7

内容摘要:书接上文,在实际的反演问题中,观测的重力异常都是包含噪声污染的。这种含噪声的数据会不会影响反演结果呢?还有,重力异常都是相对量,起算基准不同可能存在系统偏差,这种情况下应该怎么开展反演?别急,这节课我们一起来说。

1、噪声污染数据

实际的观测重力异常数据都包含噪声,会不会影响反演结果呢?我们首先生成一个含噪声的观测数据,还记得前面讲过的如何在理论数据中添加噪声吧?采用contaminate函数即可,代码如下:

field = giutils.contaminate(np.array(field0).ravel(), 0.05, percent = True)
图1

在我们上一节课的模型中,有五个参数必须事先给定,分别是
am = 1000.0, ax = 100.0, ay = 100.0, az = 100.0;深度加权参数z0 = 10000,beta = 1.0 。

在该模型的超参数\lambda搜索范围设定如下:

regul_params = [10**i for i in range(-7, 10, 1)]

程序运行后L-Curve优化结果如图2所示。


图2 L-Curve曲线(log-log)

曲线的拐点还是很漂亮的,这里注意data norm的部分很大,因为,包含噪声,反演模型并没有完全拟合观测的包含噪声的异常数据结果,模型认为是噪声部分就不再拟合了。

当然,如果感觉L-Curve找到的\lambda值不合适,也可以用objectives访问指定\lambda参数的反演结果。

values = np.fromiter(density3d.objectives[8].p_, dtype=np.float)

那么,这个模型参数下的异常拟合结果如何呢?看图3左是不是还是与真实的无噪声结果不一样?是啊,这就是噪声的影响。

图3 模型重力异常和剩余异常

最后,看看反演得到的密度结构吧。注意图4中的浅部异常特征,由于观测数据中包含噪声,还是反映到反演密度结构模型中了,但是仅在浅部。

图4 反演密度结构特征

2、重力异常中的系统误差

前面在重力异常数据处理中,就讲过去趋势的方法。如果你反演使用的是剩余布格重力异常,那这个异常与真实模型可能存在一个系统误差。那么,这时候可以采用零均值反演,方法是设置movemean参数。

Density3D(np.array(field.T).ravel(), [xp, yp, zp], mesh, movemean = True)

如果开启这个参数,在异常输入模型和每次统计dnorm的时候,都可以去掉一个均值。我们在原来的异常里面,加上300mGal的偏差,来试试效果。

图5 自动去均值反演效果

反演过程中的去均值信息:

starting inversion
remove the mean value of anomaly...
(1000, 1200)
The mean 1.5485088421307581e-07 has been removed.
The mean -6.324391081798571e-08 has been removed.
The mean -1.1204735714905507e-06 has been removed.
The mean -2.3719417504490064e-06 has been removed.
The mean -2.94958342768048e-06 has been removed.
The mean -4.714087561386026e-06 has been removed.
The mean 2.127315945655184e-05 has been removed.
The mean 0.0001171615023231798 has been removed.
The mean 0.0002833518745389145 has been removed.
The mean 0.0002645561867915358 has been removed.
The mean -0.0022071256106698587 has been removed.
The mean -0.011567825931014084 has been removed.
The mean -0.04628737534019467 has been removed.
The mean -0.18042321669168682 has been removed.
The mean -0.7621151534379003 has been removed.
The mean -2.105420470427456 has been removed.
The mean -2.2641299498413847 has been removed.
The mean -0.5292459700177187 has been removed.
Hyperparameter Lambda value is 10000
res mean=-0.0463; std=3.5358

同样参数,如果不开启去均值设置后,反演结果如图6所示。由于开启了深度加权,剩余密度为正的异常体被压到底部,上面还出现了一些伴生的负异常。

图6 同样参数不开启去均值反演的效果

而对比两者的L-Curve曲线,差别不大。


图5结果的L-Curve曲线
图6结果的L-Curve曲线

一句话总结:今天讨论完后,是不是觉得距离解决实际问题又进了一步,如果每天你觉得懂得多了一点,这就是进步啦。我们这个例子只有1000个单元,1200个观测点,如果10000个单元的时候,每次反演可要一会才能完成。重力反演如果你做多了,最麻烦的其实就是调整参数了,这里面是预设6个参数,加上一个\lambda自动搜索,说实在的如果给不好一时半会也不会出来一个相对靠谱的结果。所以,调参是最折磨人的。小哥所在的课题组,近年来正在发展一种贝叶斯优化方法,可以对该反演问题中的全部参数自动调节到最优。如果你关注本教程,我们会以番外篇的形式来讨论。

附完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 26 17:45:42 2020

@author: chens
"""
import matplotlib.pyplot as plt
import numpy as np
from geoist import gridder
from geoist.inversion import geometry
from geoist.pfm import prism
from geoist.pfm import giutils
from geoist.inversion.mesh import PrismMesh
from geoist.vis import giplt
from geoist.inversion.regularization import Smoothness,Damping
from geoist.inversion.pfmodel import SmoothOperator
from geoist.inversion.hyper_param import LCurve
from geoist.pfm import inv3d

meshfile = r"d:\msh.txt"
densfile = r"d:\den.txt"
#生成场源网格 NS-40km, EW-80km, 500个单元,z方向10层
area = (-20000, 20000, -40000, 40000, 2000, 32000) #NS EW Down
shape = (10, 20, 5) #nz ny nx
mesh = PrismMesh(area, shape)
density=np.zeros(shape)
density[3:8,9:12,1:4]=1.0 # z x y
mesh.addprop('density', density.ravel())
mesh.dump(meshfile, densfile, 'density') #输出网格到磁盘,MeshTools3D可视化
#生成核矩阵
kernel=[] 
narea = (-28750, 28750,-48750, 48750) #NS, EW
nshape = (30, 40) #NS, EW
depthz = []
xp, yp, zp = gridder.regular(narea, nshape, z=-1)
for i, layer in enumerate(mesh.layers()):
    for j, p in enumerate(layer):
        x1 = mesh.get_layer(i)[j].x1
        x2 = mesh.get_layer(i)[j].x2
        y1 = mesh.get_layer(i)[j].y1
        y2 = mesh.get_layer(i)[j].y2
        z1 = mesh.get_layer(i)[j].z1
        z2 = mesh.get_layer(i)[j].z2
        den = mesh.get_layer(i)[j].props
        model=[geometry.Prism(x1, x2, y1, y2, z1, z2, {'density': 1000.})]
        field = prism.gz(xp, yp, zp, model)
        kernel.append(field)       
        depthz.append((z1+z2)/2.0)
kk=np.array(kernel)        
kk=np.transpose(kernel)  #kernel matrix for inversion, 500 cells * 400 points
field0=np.mat(kk)*np.transpose(np.mat(density.ravel()))

field = giutils.contaminate(np.array(field0).ravel(), 0.05, percent = True)

#画图

plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.title('gravity anomlay')
plt.axis('scaled')
levels = giplt.contourf(yp * 0.001, xp * 0.001, field0, nshape, 15)
cb = plt.colorbar(orientation='horizontal')
giplt.contour(yp * 0.001, xp * 0.001, field0, nshape,
                levels, clabel=False, linewidth=0.1)
plt.subplot(1, 2, 2)
plt.title('gravity anomlay with 5% noise')
plt.axis('scaled')
levels = giplt.contourf(yp * 0.001, xp * 0.001, field, nshape, 15)
cb = plt.colorbar(orientation='horizontal')
giplt.contour(yp * 0.001, xp * 0.001, field, nshape,
                levels, clabel=False, linewidth=0.1)
plt.show()

print('starting inversion')

smop = SmoothOperator()
nz = shape[0]
ny = shape[1]
nx = shape[2]
p = np.eye(nz*ny*nx).reshape(-1,nz,ny,nx)
sx = smop.derivation(p, component = 'dx').reshape(nz*ny*nx,-1)
sy = smop.derivation(p, component = 'dy').reshape(nz*ny*nx,-1)
sz = smop.derivation(p, component = 'dz').reshape(nz*ny*nx,-1)

am = 1000.0
ax = 100.0
ay = 100.0
az = 100.0
z0 = 10000 
beta = 1.0 

wdepth = np.diag(1./(np.array(depthz)+z0)**beta)
sm = np.vstack((am*np.eye(nz*ny*nx)*wdepth,
                az*np.dot(sz.T,wdepth),
                ay*np.dot(sy.T,wdepth),
                ax*np.dot(sx.T,wdepth)))

regul = Smoothness(sm) #np.eye(nz*ny*nx)
datamisfit = inv3d.Density3D(np.array(field.T).ravel(), [xp, yp, zp], mesh)
regul_params = [10**i for i in range(-7, 10, 1)]
density3d = LCurve(datamisfit, regul, regul_params, loglog=True)
_ = density3d.fit()
print('Hyperparameter Lambda value is {}'.format(density3d.regul_param_))
density3d.plot_lcurve()

predicted = density3d[0].predicted()
residuals = density3d[0].residuals()

plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.axis('scaled')
plt.title('inversed gravity anomlay (mGal)')
levels = giplt.contourf(yp * 0.001, xp * 0.001, predicted, nshape, 15)
cb = plt.colorbar(orientation='horizontal')
giplt.contour(yp * 0.001, xp * 0.001, predicted, nshape,
                levels, clabel=False, linewidth=0.1)

plt.subplot(1, 2, 2)
plt.axis('scaled')
plt.title('residual (mGal)')
levels = giplt.contourf(yp * 0.001, xp * 0.001, residuals, nshape, 15)
cb = plt.colorbar(orientation='horizontal')
giplt.contour(yp * 0.001, xp * 0.001, residuals, nshape,
                levels, clabel=False, linewidth=0.1)

print('res mean={:.4f}; std={:.4f}'.format(residuals.mean(), residuals.std()))

densinv = r"d:\deninvbxyz.txt"
values = np.fromiter(density3d.p_, dtype=np.float)
reordered = np.ravel(np.reshape(values, mesh.shape), order='F')
np.savetxt(densinv, reordered, fmt='%.8f')    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容