15_Geoist三维重力反演_2

内容摘要:书接上文,了解了反演的目的意义后,我们开始重力反演的第一个例子,并介绍Geoist中inv3d接口的使用方法。以及通过实例了解使用Geoist反演功能需要知道的相关类和函数使用方法。

1、基本概念

(1)观测方程

Gm = d

其中,m表示场源,d表示观测到的异常场,G为核函数。

通常,G用矩阵表示,而md是一维向量。反演问题是d为已知,求m的过程。正演反之。

一般在实际计算过程中,如果观测点数量为N_d,场源m的剖分数量为N_m,用矩阵表示G的维数为N_d行×N_m列。

对于已知场源求异常的正演过程来说,上述方程计算是稳定的,没有问题,关键在于反演。

如果N_m>>N_d,方程为典型的欠定类型。这反演问题是没有唯一解的,因此,必须通过正则化等处理后才能求解。

当然,如果大家问,是否能通过增加观测点的数量来让方程数量增加,而达到有唯一解的目的呢?理论上来讲是可以的,但要求观测系统的设计满足求解重力位场泊松方程的边值问题条件。

或者简单的说一下,如果你想反演地球内部的密度分布,必须让观测系统遍布整个地球表面才行。但是这在现实中通常无法做到,因为我们的观测一般仅可以在有限的地表范围内实施,这种情况下,即使观测点数大于场源剖分的单元数量,G矩阵的条件数也会非常大,求解还是很困难的,而这时候还需要通过正则化的方法改善核矩阵的性质。

因此,下面我们说一下正则化问题。

(2)正则化

正则化(Regularization),最早由Tikhonov提出,也叫洪吉诺夫正则化。正则化后的反演目标函数数学形式可表示为:

\phi =||Gm-d||^2 + \lambda ||m||^2

上式中右端第二项可以通常称为正则项,其核心思想是引入一个罚函数\lambda,在原来的norm项中加入对模型m的约束。

其矩阵实现,等价于以下形式:

\bar G m = \bar d

其中,

\bar G = {G \choose \lambda I} \bar d = {d \choose 0}

对比上式中的\bar G和上一部分的G,扩展后的核矩阵性质发生了变化。给定一个合适的\lambda后,反演问题则可以获得唯一解。

(3)求解

通常,反演是在最小二乘解意义下求解,表示为:

\bar G^T \bar Gm = \bar G^T \bar d

方程左端\bar G^T \bar G的矩阵部分,一般是对称正定的。这时候可以用共轭梯度、加入预条件子等多种方法求解。论线性方程组的解放当然有很多种,最直接的解法就是矩阵求逆,可以表示为:

m^* = {(\bar G^T\bar G)}^{-1} \bar G^T \bar d

重磁位场反演问题,是很难的。就像你把很多个照片给ps到一起,加起来容易,但是要再分开可就难啦。

不止是重磁位场反演,对于大多数的地球物理反演问题本来在数学上是没有唯一解的,但是,工程实践中需要得到一个合理的结果。

因此,可以研究的方向有很多,我们总结几点:

(1)约束条件,也可以说是正则项的选择方法研究。要想改善反演结果,让其更接近于真实的地质情况,控制反演过程的有效方法就是正则项部分,对于很多已知的先验比如模型光滑、深度加权、参数有效范围都有很多研究成果,派生出各种针对特点问题的研究方法。特别是联合反演也可以看成此类,常见的重震联合反演,从几何相似性提出的交叉梯度联合反演等等。

(2)大规模计算,上面我们看到的核函数G,对于重力反演问题是非稀疏的(地震波层析成像的核函数G是稀疏的),因为场源对于每个观测都是有贡献的。稠密矩阵很麻烦,模型规模一大内存就扛不住了,100×100×100这么大规模的场源反演问题,对于PC或普通工作站基本都是常规方法无解的。小波压缩、分块计算等一些手段常常用于解决此类问题。

(3)反演求解,这个方向通常侧重于将线性方程解法应用于改善反演问题求解效率方面,因为对直接矩阵求逆来解方程,一般而言不太现实,常用迭代法更加节省内存开销。比如:代数重构法、预条件子法等解方程组的技巧。

2、设计模型

(1)设计场源模型

要进行实现重力反演、测试算法,首先是要设计一个场源模型,并实现其正演。PrismMesh函数可以生成一个指定场源参数的网格。

from geoist.inversion.mesh import PrismMesh
area = (-47500, 47500, -47500, 47500, 4000, 32000)
shape = (20, 20, 5)
mesh = PrismMesh(area, shape)

生成的mesh对象,可以通过addprop方法添加指定位置的密度或磁化率参数,然后,dump方法支持模型导出。
下图是采用MeshTools3D工具,对导出模型的可视化结果。

图1 场源模型

导出方法代码如下:

meshfile = r"d:\msh.txt"
densfile = r"d:\den.txt"
density=np.zeros(shape)
density[9:12,9:12,2:3]=1.00
mesh.addprop('density', density.ravel())
mesh.dump(meshfile, densfile, 'density')

(2)核函数生成

反演之前,最重要的一步要准备好核函数,也就是上面公式中G这个矩阵,也可以叫敏感度矩阵。每一个场源单元对每一个观测点都可以计算得到一个单位密度的理论异常值,全部组合起来就是一个M单元×N个测点数的大矩阵。可以先用一个空的list对象kernel来准备装该矩阵,代码如下:

kernel=[] 
narea = (-48750, 48750,-48750, 48750)
nshape = (40, 40)
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)       
kk=np.array(kernel) 

最后,通过两个循环可以得到kk这个numpy的array类型数据。

(3)理论重力异常

有了模型m,有了核函数矩阵G,就可以计算理论重力异常了。下面代码计算得到的field变量,就是正演的理论观测重力异常值。

kk=np.transpose(kernel) 
field=np.mat(kk)*np.transpose(np.mat(density.ravel()))

3、程序实现

重力位场正反演的接口分别封装到pfm模块和inversion模块下,今天谈到的内容,完成程序如下:

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.inversion.mesh import PrismMesh
from geoist.vis import giplt

meshfile = r"d:\msh.txt"
densfile = r"d:\den.txt"
#生成场源网格 10km*20km*5km, 500个单元,z方向5层
area = (-47500, 47500, -47500, 47500, 4000, 32000)
shape = (20, 20, 5)
mesh = PrismMesh(area, shape)
density=np.zeros(shape)
density[9:12,9:12,2:3]=1.00
mesh.addprop('density', density.ravel())
mesh.dump(meshfile, densfile, 'density') #输出网格到磁盘,MeshTools3D可视化
#生成核矩阵
kernel=[] 
narea = (-48750, 48750,-48750, 48750)
nshape = (40, 40)
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)       
kk=np.array(kernel)        
kk=np.transpose(kernel)  #kernel matrix for inversion, 500 cells * 400 points
field=np.mat(kk)*np.transpose(np.mat(density.ravel()))
#画图
plt.title('gz')
levels = giplt.contourf(yp * 0.001, xp * 0.001, field, nshape, 15)
cb = plt.colorbar()
giplt.contour(yp * 0.001, xp * 0.001, field, shape,
                levels, clabel=False, linewidth=0.1)
plt.show()
图2 由模型正演得到的重力异常

一句话总结:反演之前当然要知道如何获得理论重力正演方法,上面仅举了一个重力核函数计算的例子,怎么对一个磁异常进行正演,如何生成重力梯度的核函数等等,别急,后面会逐一讲解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容