最短路径法射线追踪的MATLAB实现
路径跟踪控制算法 matlab

路径跟踪控制算法概述路径跟踪控制算法是一种在自主导航系统中广泛应用的技术。
其主要目标是使机器能够根据预先定义的路径,自动进行导航并沿着路径正确地前进。
在机器人、自动驾驶和无人机等领域,路径跟踪控制算法的研究和应用对于实现精确的导航和避免碰撞具有重要意义。
原理和实现方式路径跟踪控制算法的原理和实现方式可以分为一下几个步骤:1. 轨迹规划在路径跟踪控制算法中,首先需要进行轨迹规划,即确定从起始点到目标点所需的路径。
常用的轨迹规划方法包括最短路径算法、A*算法和动态规划算法。
这些算法可以根据地图信息和环境约束生成最优的路径。
2. 控制策略选择一旦获得了要跟踪的路径,就需要选择合适的控制策略来实现路径跟踪。
在路径跟踪中常用的控制策略包括纯追踪控制、模型预测控制和滑模控制等。
不同的控制策略适合不同的场景和机器人类型。
3. 路径跟踪控制在路径跟踪控制算法中,控制器根据所选的控制策略,将机器人引导沿着预定义的路径前进。
控制器会根据机器人当前的位置和姿态信息,计算出所需的控制信号,如速度和转向角度,并将其应用于机器人的执行机构。
4. 路径修正和避障在实际的导航过程中,由于环境的变化或测量误差等因素,机器人可能会偏离原始的路径。
因此,路径跟踪控制算法一般还会包括路径修正和避障功能。
路径修正可以通过实时测量机器人与期望路径之间的距离和方向来实现。
而避障功能可以通过使用传感器数据和环境建模来避免碰撞和更好地适应复杂的环境。
应用实例路径跟踪控制算法在各个领域都有重要的应用。
以下是一些典型的应用实例:1. 无人驾驶车辆路径跟踪控制算法在无人驾驶领域广泛应用,它使得无人驾驶车辆能够根据预先定义的路径进行自主导航。
通过运用先进的感知和控制技术,无人驾驶车辆能够沿着规划的路径安全地行驶,并根据实时的环境信息进行路径修正和避障。
2. 机器人导航路径跟踪控制算法在工业机器人和服务机器人导航中也得到了广泛应用。
在工业自动化领域,机器人需要在复杂的工作环境中自主导航并执行任务。
光线追踪算法matlab

光线追踪算法matlab什么是光线追踪算法?它的原理是什么?如何使用MATLAB实现光线追踪算法?这是一个非常有趣和复杂的主题,我们可以一步一步地深入探讨。
光线追踪算法是一种用于渲染图像的技术,它通过模拟光线在场景中的传播和交互,来计算出每个像素的颜色值。
这种算法主要用于计算机图形学领域,可以用于创建逼真的三维渲染效果,包括反射、折射、阴影等效果。
光线追踪算法的原理是基于光线在场景中的传播规律和光线与物体表面的交互规律,通过追踪光线的路径来计算场景中每个像素的颜色值。
在光线追踪算法中,我们通常会从相机位置出发,发射一条光线到场景中,然后判断光线与场景中的物体是否有交点,如果有交点,则通过光线与物体表面的交互规律来计算出光线的折射、反射等信息,然后继续追踪光线的路径,直到光线到达光源或达到最大追踪深度时结束。
通过这种追踪光线的方式,可以计算出每个像素的颜色值,从而得到渲染图像。
下面,我们将介绍如何使用MATLAB实现光线追踪算法。
在MATLAB中,我们可以使用向量化的方法来高效地实现光线追踪算法。
首先,我们需要定义场景中的物体和光源,以及相机的位置和参数。
然后,我们可以定义一个追踪光线的函数,该函数可以接受相机位置、屏幕像素位置等参数,并返回光线与场景的交点信息。
在追踪光线的函数中,我们可以使用循环来遍历每个像素,然后计算出光线的路径,判断光线与场景中的物体是否有交点,然后根据交点的信息计算出颜色值。
在计算颜色值时,我们需要考虑光线的折射、反射、阴影等效果,这需要根据光线与物体表面的特性来进行计算。
除了追踪光线的函数外,我们还需要实现一些其他辅助函数,比如计算光线与物体的交点、计算光线与物体的交互规律等。
通过这些辅助函数的帮助,我们可以高效地实现光线追踪算法,并得到一幅逼真的渲染图像。
在实现光线追踪算法时,我们也需要考虑一些优化和加速的方法,比如使用BVH (Bounding Volume Hierarchy)树来加速光线与物体的交点计算,使用多线程并行计算来加速整个算法的运行等。
最短路径算法matlab代码

最短路径算法matlab代码最短路径算法是计算两点之间最短路程的算法。
这个问题可以转化为图论中的最短路径问题,目前有多种解法,其中比较常用的就是迪杰斯特拉算法和弗洛伊德算法。
本文将以迪杰斯特拉算法为例,介绍一下最短路径算法的matlab实现。
迪杰斯特拉算法迪杰斯特拉算法是用来解决有向带权图中单源最短路径问题的一种贪心算法。
该算法通过维护一个距离集合,逐步扩展最短路径,直至到达终点或者所有路径均已扩展完毕。
具体算法流程如下:1. 初始化距离集合,将距离集合中除起点外所有点的距离设置为无穷大,将起点的距离设置为0。
2. 从距离集合中选择距离最小的点v,将v加入已扩展集合中。
3. 遍历v的所有邻居节点,将v到邻居节点的距离d与邻居节点原有的距离比较,若d小于原有距离,则将邻居节点的距离更新为d。
4. 重复以上步骤,直至所有点均已加入已扩展集合中。
matlab代码实现在matlab中实现迪杰斯特拉算法,需要用到矩阵来描述整个图。
用一个N*N的矩阵表示图中各节点之间的距离,例如:```G = [ 0, 4, 2, Inf, Inf;Inf, 0, 1, 5, Inf;Inf, Inf, 0, Inf, 3;Inf, Inf, Inf, 0, 1;Inf, Inf, Inf, Inf, 0 ];```其中Inf表示节点间没有连接。
然后,将距离集合D初始化为一个1*N 的向量,D(i)表示起点到节点i的距离。
对于起点,其距离应该为0。
```D = [0 Inf Inf Inf Inf];```接下来,用一个1*N的向量S来表示已经扩展过的节点。
一开始,S 中只有起点。
```S = [1];```接下来就可以实现算法了。
迭代遍历S中的所有节点,更新其邻居节点的距离,然后将距离最小的邻居节点加入S中。
具体实现代码如下:```for i = 1:N-1minDis = Inf;for j = 1:Nif ~ismember(j, S) % 如果节点j不在已扩展集合中if D(j) < minDisu = j;minDis = D(j);endendendS = [S u];for v = 1:Nif ~ismember(v, S) % 如果节点v不在已扩展集合中if G(u, v) ~= Inf % 如果u和v之间存在连接if D(u) + G(u, v) < D(v) % 如果从起点到u节点再到v节点的距离小于v原有距离D(v) = D(u) + G(u, v); % 更新v的距离endendendendend```完整代码将上述代码整合成一个函数,得到完整的matlab代码实现。
matlab两点间最短路径

matlab两点间最短路径在现代科技的发展中,人们对于两点间最短路径的需求日益增加。
无论是在日常生活中规划出行路线,还是在工程设计中确定最佳路径,寻找两点之间最短路径都是一个重要且常见的问题。
在计算机领域中,利用Matlab可以很方便地实现两点间最短路径的计算,为人们提供了便利。
我们需要明确两点间最短路径的概念。
在数学和计算机领域中,最短路径通常指的是两点之间经过的路径中,总长度或总权值最小的那条路径。
这个概念在实际生活中有着广泛的应用,比如在地图导航、通信网络优化、物流配送等方面都需要寻找最短路径来节约时间和成本。
在Matlab中,我们可以利用一些算法来计算两点间的最短路径,比如Dijkstra算法、Floyd-Warshall算法、A*算法等。
这些算法各有特点,适用于不同场景下的最短路径计算。
通过编写相应的代码,我们可以很容易地实现这些算法,从而得到两点间的最短路径。
以Dijkstra算法为例,该算法是一种用于计算图中节点之间最短路径的算法,其基本原理是通过不断更新起点到各个节点的距离来找到最短路径。
在Matlab中,我们可以通过构建图的邻接矩阵,并利用循环和条件判断来实现Dijkstra算法,从而得到两点之间的最短路径。
Floyd-Warshall算法是一种用于解决所有点对最短路径的算法,其核心思想是动态规划。
在Matlab中,我们同样可以通过构建图的邻接矩阵,并利用三重循环来实现Floyd-Warshall算法,从而计算出所有点对之间的最短路径。
除了这些经典的算法之外,A*算法是一种启发式搜索算法,也常用于计算两点之间的最短路径。
该算法结合了Dijkstra算法和贪心算法的特点,在搜索过程中充分利用启发函数来指导搜索方向,提高搜索效率。
在Matlab中,我们可以编写相应的启发函数,并结合优先队列等数据结构来实现A*算法,从而找到两点之间的最短路径。
总的来说,利用Matlab计算两点间最短路径是一项非常有意义和实用的工作。
最短路径 dijkstra算法的matlab代码实现

最短路径dijkstra算法的matlab代码实现如何用Matlab实现Dijkstra算法求解最短路径问题?Dijkstra算法是一种用于计算图中的最短路径的经典算法。
该算法以一个起始节点为基础,通过不断更新节点到其他节点的最短距离,直到找到最短路径为止。
本文将一步一步地回答如何使用Matlab实现Dijkstra算法,以及如何在Matlab中构建图并求解最短路径。
第一步:构建图Dijkstra算法是基于图的算法,因此我们首先需要在Matlab中构建一个图。
图可以用邻接矩阵或邻接表等方式表示。
这里我们选择使用邻接矩阵来表示图。
在Matlab中,可以使用矩阵来表示邻接矩阵。
假设我们的图有n个节点,我们可以创建一个n×n的矩阵来表示图的邻接矩阵。
如果节点i和节点j 之间有一条边,则将邻接矩阵中的第i行第j列的元素设置为边的权重,如果没有边相连,则将元素设置为一个较大的值(例如无穷大)表示不可达。
现在,我们可以开始构建邻接矩阵。
这里以一个具体的例子来说明。
假设我们有一个包含6个节点的无向图,如下所示:0 1 2 3 4 5-0 0 4 3 0 0 01 4 0 1 4 0 02 3 1 0 2 1 03 04 2 0 3 24 0 0 1 3 0 25 0 0 0 2 2 0在Matlab中,可以将邻接矩阵表示为一个n×n的矩阵。
在这个例子中,我们可以这样定义邻接矩阵:G = [0 4 3 0 0 0;4 0 1 4 0 0;3 1 0 2 1 0;0 4 2 0 3 2;0 0 1 3 0 2;0 0 0 2 2 0];第二步:实现Dijkstra算法在Matlab中,我们可以使用一些循环和条件语句来实现Dijkstra算法。
下面是一个基本的Dijkstra算法的实现流程:1. 创建一个数组dist,用于存储从起始节点到其他节点的最短距离。
初始时,将起始节点到自身的距离设置为0,其他节点的距离设置为无穷大。
最短距离算法matlab

最短距离算法matlab最短距离算法在计算机科学领域中被广泛应用于寻找两个点之间最短路径的问题。
无论是在社交网络分析、物流规划还是路线规划等应用中,最短距离算法都扮演着核心角色。
本文将介绍最短距离算法在MATLAB中的实现,并详细说明算法的原理和步骤。
1. 引言最短距离算法(Shortest Path Algorithm)用于计算两个点之间路径的最短距离。
该算法通过对图模型进行分析和搜索,找到连接两个点的最短路径。
最短路径问题可以通过多种算法求解,例如迪杰斯特拉算法(Dijkstra's Algorithm)和弗洛伊德–沃尓沃兹算法(Floyd-Warshall Algorithm)等。
在本文中,我们将着重解释迪杰斯特拉算法的MATLAB 实现。
2. 算法原理迪杰斯特拉算法是一种用于解决最短路径问题的贪心算法。
它通过逐步构建最短路径树来确定最短路径。
算法的核心思想是通过不断更新节点的距离和前驱节点来找到最短路径。
3. 算法步骤以下是迪杰斯特拉算法的步骤:步骤1: 创建一个空的距离和前驱节点的集合。
距离集合用于存储源节点到其他节点的距离,前驱节点集合用于存储最短路径中每个节点的前驱节点。
距离集合初始化为无穷大,源节点的距离初始化为0。
前驱节点集合初始化为空。
步骤2: 选择源节点,并将其添加到已访问的节点集合中。
步骤3: 对于源节点的邻居节点,更新其距离和前驱节点。
如果新的距离小于当前距离,则更新距离和前驱节点。
步骤4: 从距离集合中选择最小距离的节点,并将其添加到已访问的节点集合中。
该节点将成为当前节点。
步骤5: 重复步骤3和步骤4,直到所有节点都被访问。
步骤6: 根据前驱节点集合构建最短路径。
4. MATLAB代码实现下面是迪杰斯特拉算法在MATLAB中的实现:MATLABfunction [dist, path] = dijkstra(graph, source_node,destination_node)n = size(graph, 1); 图中节点的数量dist = inf(1, n); 节点到源节点的距离dist(source_node) = 0; 源节点到自身的距离为0visited = false(1, n); 记录节点是否已被访问path = zeros(1, n); 记录最短路径的前驱节点for i = 1:n-1[min_dist, current_node] = min(dist); 选择距离最小的节点visited(current_node) = true; 标记该节点为已访问for j = 1:nif ~visited(j) && graph(current_node, j) > 0 如果节点未被访问且节点之间存在连接new_dist = dist(current_node) +graph(current_node, j); 更新距离if new_dist < dist(j)dist(j) = new_dist; 更新距离集合中的节点距离path(j) = current_node; 更新前驱节点endendendend构建最短路径path_len = 1;current_node = destination_node;while current_node ~= source_nodepath_len = path_len + 1;current_node = path(current_node);endpath = zeros(1, path_len);current_node = destination_node;for i = path_len:-1:1path(i) = current_node;current_node = path(current_node);endend5. 实例演示现在我们将使用上述实现的迪杰斯特拉算法来计算一个简单图中两个节点之间的最短路径。
matlab实现dijkstra算法

matlab实现dijkstra算法Matlab实现Dijkstra算法第一段:什么是Dijkstra算法,为什么它重要?Dijkstra算法是一种用于解决最短路径问题的经典算法。
它由荷兰计算机科学家Edsger Dijkstra在1956年提出,被广泛应用于网络路由、地图导航和图论等领域。
该算法的核心思想是在给定的带权图中找到从起点到终点的最短路径,通过迭代的方式逐步推进,直到找到最短路径或处理完所有节点。
Dijkstra算法被广泛认为是一种高效、可靠的解决方案,具有良好的理论基础和实际应用性。
第二段:如何在Matlab中实现Dijkstra算法?在Matlab中实现Dijkstra算法,可以分为以下几个步骤:1. 创建带权图:我们需要将问题转化为带权图的形式。
在Matlab中,可以使用邻接矩阵来表示图的连接关系,其中每个边的权重存储在矩阵中的对应位置。
2. 初始化距离和路径:将起点到每个节点的距离初始化为无穷大,并为每个节点设置一个空路径。
将起点的距离设置为0,表示起点到自身的距离为0。
3. 遍历节点:循环遍历所有节点,找到距离起点最近的节点,并标记为已访问。
更新与该节点相邻节点的距离和路径信息。
如果经过当前节点到达某个相邻节点的距离更短,则更新该节点的距离和路径。
4. 重复步骤3,直到所有节点都被遍历为止。
这样,我们就能得到从起点到其他节点的最短路径信息。
第三段:个人观点和理解Dijkstra算法是解决最短路径问题的经典算法之一,它具有广泛的应用价值。
在日常生活中,我们经常需要找到最佳的路径规划,例如快递员送货时选择最短路径、地铁或公交车乘客选择最快到达目的地的路线等。
对于这些问题,Dijkstra算法可以提供一个可靠、高效的解决方案。
在使用Matlab实现Dijkstra算法时,我们可以利用Matlab强大的矩阵运算能力和易用的函数库来简化算法的实现过程。
Matlab还提供了丰富的可视化工具,可以帮助我们直观地展示算法执行过程和结果。
dijkstra算法原理及MATLAB代码

Dijkstra算法是寻找最短路径的一种搜索算法,由荷兰科学家提出。
1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。
在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v 到U中任何顶点的最短路径长度。
此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
2)算法步骤:a.初始时,S只包含源点,即S={v},v的距离为0。
U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
算法描述:通过为每个节点保留目前为止所找到的从s到e的最短路径。
为了记录最佳路径轨迹,记录路径上每个节点的前趋,通过回溯法找出最短路径轨迹。
过程如下:在网上搜索一些版本的Matlab实现方法,感觉都有些毛病。
经过修改,得到比较好的效果。
[cpp]view plain copy1.function [ distance path] = Dijk( W,st,e )2.%DIJK Summary of this function goes here3.% W 权值矩阵 st 搜索的起点 e 搜索的终点4.n=length(W);%节点数5. D = W(st,:);6.visit= ones(1:n); visit(st)=0;7.parent = zeros(1,n);%记录每个节点的上一个节点8.9.path =[];10.11.for i=1:n-112. temp = [];13. %从起点出发,找最短距离的下一个点,每次不会重复原来的轨迹,设置visit判断节点是否访问14.for j=1:n15.if visit(j)16. temp =[temp D(j)];17.else18. temp =[temp inf];19. end20.21. end22.23. [value,index] = min(temp);24.25. visit(index) = 0;26.27. %更新如果经过index节点,从起点到每个节点的路径长度更小,则更新,记录前趋节点,方便后面回溯循迹28.for k=1:n29.if D(k)>D(index)+W(index,k)30. D(k) = D(index)+W(index,k);31. parent(k) = index;32. end33. end34.35.36.end37.38.distance = D(e);%最短距离39.%回溯法从尾部往前寻找搜索路径40.t = e;41.while t~=st && t>042. path =[t,path];43. p=parent(t);t=p;44.end45.path =[st,path];%最短路径46.47.48.end测试:测试用例1[cpp]view plain copy1.W=[0 50 inf 40 25 102. 50 0 15 20 inf 253. inf 15 0 10 20 inf4. 40 20 10 0 10 255. 25 inf 20 10 0 556. 10 25 inf 25 55 0];[cpp]view plain copy1.[cpp]view plain copy1.[distance,path]=Dijk(W,1,4);>> distancedistance =35>> pathpath =1 6 4从节点1到节点4最短距离路径为1-->6-->4, 最短距离为35测试用例2[html]view plain copy1.W=[0 1 3 42. 1 0 2 inf3. 3 2 0 54. 4 inf 5 0];[html]view plain copy1.[distance,path]=Dijk(W,2,4);>> distancedistance =5>> pathpath =2 1 4从节点2到节点4最短距离路径为2-->1-->4, 最短距离为5。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最短路径法射线追踪的MATLAB 实现李志辉 刘争平(西南交通大学土木工程学院 成都 610031)摘 要:本文探讨了在MA TLAB 环境中实现最短路径射线追踪的方法和步骤,并通过数值模拟演示了所编程序在射线追踪正演计算中的应用。
关键词:最短路径法 射线追踪 MATLAB 数值模拟利用地震初至波确定近地表介质结构,在矿产资源的勘探开发及工程建设中有重要作用。
地震射线追踪方法是研究地震波传播的有效工具,目前常用的方法主要有有限差分解程函方程法和最小路径法。
最短路径方法起源于网络理论,首次由Nakanishi 和Yamaguchi 应用域地震射线追踪中。
Moser 以及Klimes 和Kvasnicha 对最短路径方法进行了详细研究。
通过科技人员的不断研究,最短路径方法目前已发展较为成熟,其基本算法的计算程序也较为固定。
被称作是第四代计算机语言的MA TLAB 语言,利用其丰富的函数资源把编程人员从繁琐的程序代码中解放出来。
MA TLAB 用更直观的、符合人们思维习惯的代码,为用户提供了直观、简洁的程序开发环境。
本文介绍运用Matlab 实现最短路径法的方法和步骤,便于科研院校教学中讲授、演示和理解最短路径方法及其应用。
1 最短路径法射线追踪方法原理最短路径法的基础是Fermat 原理及图论中的最短路径理论。
其基本思路是,对实际介质进行离散化,将这个介质剖分成一系列小单元,在单元边界上设置若干节点,并将彼此向量的节点相连构成一个网络。
网络中,速度场分布在离散的节点上。
相邻节点之间的旅行时为他们之间欧氏距离与其平均慢度之积。
将波阵面看成式由有限个离散点次级源组成,对于某个次级源(即某个网格节点),选取与其所有相邻的点(邻域点)组成计算网格点;由一个源点出发,计算出从源点到计算网格点的透射走时、射线路径、和射线长度;然后把除震源之外的所有网格点相继当作次级源,选取该节点相应的计算网格点,计算出从次级源点到计算网格点的透射走时、射线路径、和射线长度;将每次计算出来的走时加上从震源到次级源的走时,作为震源点到该网格节点的走时,记录下相应的射线路径位置及射线长度。
图1 离散化模型(星点表示震源或次级震源,空心点为对应计算网格点)根据Fermat 原理逐步计算最小走时及射线方向。
设Ω为已知走时点q 的集合,p 为与其相邻的未知走时点,tq 分别和p 点的最小走时,tqp 为q 至p 最小走时。
r 为p 的次级源位置,则)}(min :{qp q P t t t q r q +==Ω∈ 根据Huygens 原理,q 只需遍历Q 的边界(即波前点),当所有波前邻点的最小走时都求出时,这些点又成为新的波前点。
应用网络理论中的最短路径算法,可以同时求出从震源点传至所有节点之间的连线近似地震射线路径。
2 最短路径法射线追踪基本算法步骤把网格上的所有节点分成集合p 和q ,p 为已知最小旅行时的结点总数集合,q 为未知最小旅行时的节点的集合。
若节点总数为n ,经过n 次迭代后可为求出所有节点的最小旅行时。
过程如下:1) 初始时 q 集合包含所有节点,除震源s 的旅行时已知为ts =0外,其余所有节点的旅行时均为ti =(i 属于Q 但不等于s )。
P 集合为空集。
2) 在Q 中找一个旅行时最小的节点i ,它的旅行时为ti ;3) 确定与节点i 相连的所有节点的集合V ;4) 求节点j (j 属于V 且j 不属于P )与节点i 连线的旅行时dtij ;5) 求节点j ()的新旅行时tj (取原有旅行时tj 与tj +dtij 的最小值);6) 将i 点从Q 集合转到P 集合;7) 若P 集合中的节点个数小于总节点数N ,转2,否则结束旅行时追踪;8) 从接收点开始倒推出各道从源点道接收点的射线路径,只要每个节点记下使它形成最小旅行时的前一个节点号,就很容易倒推出射线路径。
Matlab语言可以十分方便地构造用户自己的函数(可以同其它目录里的函数同名),供主函数调用,并且通过Matlab结构形式,根据属性名将节点上不同类型的数据组织起来,从而简洁地实现算法中有关节点的判断、调用和运算。
3 数值模拟3.1 构造数值模型图2 探测区域数值模型(空白区为低速介质区,黑色区为高速介质区)如图2所示,数值模拟探测区域长Length=20m,宽Width=8m。
假设已知背景介质速度为V低,存在三个黑色区高速介质区,其中区域1,2相对于水平中线对称,区域3相对水平居中,V高=4V低。
可离散化为间距为0.5m的17行,间距为1m的17行21列的网络。
3.2私有函数构造(1)构造函数Vnew_jishuan(),用以确定子波源点所在的结点相连的所有结点集合V。
[V_i, V_j]=Vnew_jishuan(jiedian_i,jiedian_j ,m,n)其中,输出V_I,V_j分别为子波源点所在的结点相连的所有结点的行向量与列向量;输入中jiedian_I,jiedian_j分别为子波源点所在的结点的网络行号与列号,m,n为离散网络行列数。
(2)构造函数wanzhengyan(),用以实现从(单一)震源激发后,追踪出已知速度场探测区域内离散其它节点旅行时及其射线路径。
[DOTMN]=wanzhengyan(Length,Width,m,n,dotfa_i,dotfa_j,VDOTMN)其中,输出DOTMN为Matlab结构构造出所在节点的各种属性(velocity,x,z,flag_A,flag_Q,before_i,before_j,time,uptime,lujing_I,lujing_J);输入中Length,Width为探测区域长宽,dotfa_i,dotfa_j为震源点所在的结点的网络行号与列号,VDOTMN为数值模型数度场。
3.3 程序及相关说明本节程序,构成函数wanzhengyan(),可以实现从(单一)震源激发后,追踪出已知速度场探测区域内离散其它节点旅行时及其射线路径。
它们分别为DOTMN(i,j).time 、DOTMN(dotjie_i,dotjie_j).lujing_I、DOTMN(dotjie_i,dotjie_j).lujing_J。
程序及其说明如下:clear,clc %清除工作空间及显示屏幕%第一步:初始化实际介质离散化方式及速度场分布,并设置震源点%输入以下输入探测区域x轴方向长度Length,z轴方向宽度WidthLength=20; Width=8;m=17;n=21; %区域离散化m行n列%输入以下输入结点矩阵速度模型VDOTMNVDOTMN=ones(m,n); VDOTMN([4:5],[8:10])=4;VDOTMN([13:14],[8:10])=4; VDOTMN([8:10],[13:15])=4;%在此构造图2的速度场模型%定义Q为未作过子波源点的集合;P作过子波源点的集合;A为已经计算过走时的结点集合Q=zeros(m,n); P=zeros(m,n); A=zeros(m,n); S=zeros(m,n);%结点矩阵DOTMN初始化for i=1:mfor j=1:nDOTMN(i,j).velocity=VDOTMN(i,j);DOTMN(i,j).x=(j-1)*Length/(n-1);DOTMN(i,j).z=(i-1)*Width/(m-1);DOTMN(i,j).flag_A=0;DOTMN(i,j).flag_Q=1;DOTMN(i,j).before_i=NaN;DOTMN(i,j).before_j=NaN;DOTMN(i,j).time=inf;DOTMN(i,j).uptime=NaN;endend%输入以下输入震源点初值dotfa_i=1; dotfa_j=3;DOTMN(dotfa_i,dotfa_j).flag_A=1;DOTMN(dotfa_i,dotfa_j).flag_Q=0;DOTMN(dotfa_i,dotfa_j).time=0;jiedian_i=dotfa_i;jiedian_j=dotfa_j;for i=1:mfor j=1:nif DOTMN(i,j).flag_Q == 0P(i,j)=1;endendend%计算集合P的结点个数counter_P=nnz(P); %第一步初始化结束%第二步:找Q中一个旅行时最小的结点%第七部分判断部分开始while counter_P < (m*n)%第三步:确定子波源点所在的结点相连的所有结点集合V,调用函数Vnew_jishuan( )[V_i, V_j]=Vnew_jishuan(jiedian_i,jiedian_j ,m,n);for ii=1:length(V_i)i=V_i(ii);j=V_j(ii);DOTMN(i,j).flag_A=1;endii=[];for i=1:mfor j=1:nif DOTMN(i,j).flag_A == 1A(i,j)=1;endendend%第四步:计算S=(A-P)不为零结点到子波源的走时S=A-P;[S_i,S_j]=find(S);for ii=1:length(S_i)i=S_i(ii);j=S_j(ii);fanshu=(DOTMN(i,j).x-DOTMN(jiedian_i,jiedian_j).x).^2+(DOTMN(i,j).z-DOTMN(jiedian_i,jiedian_j).z).^2; DOTMN(i,j).uptime=2*sqrt(fanshu)/(DOTMN(i,j).velocity+DOTMN(jiedian_i,jiedian_j).velocity );%第五步:求S集合各结点的新旅行时tmin_panju=min(DOTMN(i,j).time,DOTMN(jiedian_i,jiedian_j).time+DOTMN(i,j).uptime);if tmin_panju < DOTMN(i,j).timeDOTMN(i,j).time=tmin_panju;DOTMN(i,j).before_i=jiedian_i;DOTMN(i,j).before_j=jiedian_j;endend%第二步:找Q中一个旅行时最小的结点time_min=inf;for ii=1:length(S_i)i=S_i(ii);j=S_j(ii);DotTime(i,j)=DOTMN(i,j).time;if DotTime(i,j) <= time_mintime_min=DotTime(i,j);jiedian_i=i;jiedian_j=j;endend%第六步:将子波结点移动出集合Q并计算P集合结点的个数DOTMN(jiedian_i,jiedian_j).flag_Q=0;for i=1:mfor j=1:nif DOTMN(i,j).flag_Q == 0P(i,j)=1;endendendcounter_P=nnz(P);end%第七部分判断结束结束%第八步:倒推出射线路径DOTMN().lujing_I与,DOTMN().lujing_J %预备接收点循环for dotjie_i=1:mfor dotjie_j=1:nlu_i=dotjie_i;lu_j=dotjie_j;Xi(1)=lu_i;Zj(1)=lu_j;counter_lu=2;lu_panju=isnan( DOTMN(lu_i,lu_j).before_i );while lu_panju< 1Xi(counter_lu)=DOTMN(lu_i,lu_j).before_i;Zj(counter_lu)=DOTMN(lu_i,lu_j).before_j;lu_temp=lu_i;lu_i=DOTMN(lu_i,lu_j).before_i;lu_j=DOTMN(lu_temp,lu_j).before_j;lu_temp=[];lu_panju=isnan( DOTMN(lu_i,lu_j).before_i );counter_lu=counter_lu+1;endDOTMN(dotjie_i,dotjie_j).lujing_I=Xi;DOTMN(dotjie_i,dotjie_j).lujing_J=Zj;Xi=[];Zj=[];endend%第八步结束单一激发点最短路径射线追踪出来后,在以上程序段中加上激发点循环,可得到各激发点射线追踪路径和走时,这样就完成对探测区域数值正演计算。