首页 > 其他分享 >空间曲线的线性参数插值

空间曲线的线性参数插值

时间:2024-12-29 15:19:04浏览次数:1  
标签:temp 断层 插值 曲线 iter 线性 inter isample

空间曲线的线性参数插值

​ 在断层曲面拟合的过程中,发现当解释的空间数据点过于稀疏的化,其断层面拟合的效果较差,我们采用空间曲线线性插值加密的算法,增加插值控制点的数量,改善插值的效果。

1.1 问题描述即算法描述

已知空间三维离散折线 \(l=(p_1,p_2,...,p_i,...,p_n)\) 上有 \(n\)个点 \(p_i(x_i,y_i,z_i)\),假设点与点之间是线性渐变的,我们将在折线段中两点中添加\(m\)个点,即 \({...,p_{i},q_{1}^{i},q_2^{i},q_{3}^i,...,q_{j}^{i},...,q_{m}^{i},p_{i+1},...}\) , 其中\(q_{j}^i=(x_{j}^i,y_{j}^i,z_j^i)\) 为待插值点,其中 引入参数\(t_j\), 其待插值点的坐标如下:

\[\begin{equation} \begin{aligned} x_j^{i}=(1-t_j)x_i+t_jx_{i+1} \\ y_j^{i}=(1-t_j)y_i+t_jx_{i+1} \\ z_j^{i}=(1-t_j)z_i+t_jz_{i+1} \\ \end{aligned} \tag{1.1.1} \space (i=1,2,3,...,n-1) and(j=1,2,3,..,m) \end{equation} \]

其中 插值参数\(t_j\):

\[\begin{aligned} \begin{split} t_j &=j\Delta{t}\\ \Delta{t}&=1/(m+1)\\ j&=1,2,3,...,m \end{split} \end{aligned} \tag{1.2.1} \]

1.2 算法代码

1.断层插值算法:

%函数的功能:绘制断层线的解释网格
%函数的描述:利用线性插值断层线解释控制点加密
%函数的使用:y=func(input1,input2)
%输入:
%      X-待插值的断层解释控制点 X坐标向量 (n)
%      Y-待插值的断层解释控制点 Y坐标向量 (n) 
%      T-待插值的断层解释控制点 T(或Z)坐标向量 (n)
% CDP-待插值的断层解释控制点 CDPIndex 向量 (n)
% LINE-待插值的断层解释控制点 LINEIndex向量 (n)
% faultIndex-待插值的解释控制点 断层编号向量 (n)
%       n-每个折线加密点数
%输出:
%      X_inter-线性插值后的断层解释控制点X坐标向量
%      Y_inter-线性插值后的断层解释控制点Y坐标向量
%      T_inter -线性插值后的断层解释控制点T坐标向量
%      CDP_inter-线性插值后的断层的插值控制点CDPIndex向量
%     LINE_inter-线性插值后的断层的插值控制点LINEIndex向量
%     faultIndex_inter-线性插值后的断层的插值控制点断层编号向量 
%注意事项:利用函数的适用范围。
%文档日期:
%标签:
%创建日期:
%最后更新日期:
function [X_inter,Y_inter,T_inter,CDP_inter,LINE_inter,faultIndex_inter]=interfaultInline(X,Y,T,CDP,LINE,faultIndex,n)

faultIndexArray=unique(faultIndex);
nfaultline=length(faultIndexArray);

X_inter=[];
Y_inter=[];
T_inter=[];
CDP_inter=[];
LINE_inter=[];
faultIndex_inter=[];

t=linspace(0,1,n+2);
for ifault=1:nfaultline
      faltIndexTemp=faultIndexArray(ifault);
      indexSubTemp=find(faultIndex==faltIndexTemp);
       X_temp=X(indexSubTemp);
       Y_temp=Y(indexSubTemp);
       T_temp=T(indexSubTemp);
       CDP_temp=CDP(indexSubTemp);
       LINE_temp=LINE(indexSubTemp);

       nSample=length(indexSubTemp);
       nInterSample=(nSample-1)*n+nSample

       Xinter_temp=zeros(nInterSample,1);
       Yinter_temp=zeros(nInterSample,1);
       Tinter_temp=zeros(nInterSample,1);
       CDPinter_temp=zeros(nInterSample,1);
       LINEinter_temp=zeros(nInterSample,1);
       faultIndexinter_temp=zeros(nInterSample,1);

       for isample=1:nSample-1
          for iter=1:n+2
              Xinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*X_temp(isample)+t(iter)*X_temp(isample+1);
              Yinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*Y_temp(isample)+t(iter)*Y_temp(isample+1);
              Tinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*T_temp(isample)+t(iter)*T_temp(isample+1);
              CDPinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*CDP_temp(isample)+t(iter)*CDP_temp(isample+1);
              LINEinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*LINE_temp(isample)+t(iter)*LINE_temp(isample+1);
              faultIndexinter_temp((isample-1)*(n+1)+iter)=ifault;
          end
       end
     
       X_inter=[X_inter;Xinter_temp];
       Y_inter=[Y_inter;Yinter_temp];
       T_inter=[T_inter;Tinter_temp];
       CDP_inter=[CDP_inter;CDPinter_temp];
       LINE_inter=[LINE_inter;LINEinter_temp];
       faultIndex_inter=[faultIndex_inter;faultIndexinter_temp];
end



end

2.断层解释线绘制代码

function drawfaultline(X,Y,T,Index,method)
%函数的功能:绘制断层线的解释网格
%函数的描述:
%函数的使用:y=func(input1,input2)
%输入:
%     input1:
%     input2:
%输出:
%     Y:
%例子:y=func(1,'type1');
%注意事项:利用函数的适用范围。
%文档日期:
%标签:
%创建日期:
%最后更新日期:
maxIndex=max(Index);
minIndex=min(Index);
k=1;
for index=minIndex:maxIndex
     indexfalut=find(Index==index);
     faultlineX=X(indexfalut);
     faultlineY=Y(indexfalut);
     faultlineT=T(indexfalut);
     k=k+1;
     plot3(faultlineX,faultlineY,faultlineT,method);
     hold on
end
set(gca,'Zdir','reverse');
daspect([1,1,1]);
hold off
end

1.3 算法效果及案例

断层线插值案例

clc
clear all
close all

%% 读取断层面散点数据
pointdata=load("./data/F10_GeoInline.txt");
pointdata1=load("./data/F10_GeoXline.txt");

maxIndexLine=max(pointdata(:,6));

%% 断层线数据加密
Xpoint=[pointdata(:,1);pointdata1(:,1)];
Ypoint=[pointdata(:,2);pointdata1(:,2)];
Tpoint=[pointdata(:,3);pointdata1(:,3)];
LINEpoint=[pointdata(:,4);pointdata1(:,4)];
CDPpoint=[pointdata(:,5);pointdata1(:,5)];
INDEXpoint=[pointdata(:,6);pointdata1(:,6)+1+maxIndexLine];
n=20;
[X_inter,Y_inter,T_inter,CDP_inter,LINE_inter,faultIndex_inter]=interfaultInline(Xpoint,Ypoint,Tpoint,CDPpoint,LINEpoint,INDEXpoint,n);

Xpoint1=X_inter;
Ypoint1=Y_inter;
Tpoint1=T_inter;
LINEpoint1=LINE_inter;
CDPpoint1=CDP_inter;
INDEXpoint1=faultIndex_inter;

%%
figure(1)
subplot(1,2,1)
drawfaultline(Xpoint,Ypoint,Tpoint,INDEXpoint,'-or');
xlabel("X");
ylabel("Y");
zlabel("Z");
title("插值前断层解释控制点")
grid on
subplot(1,2,2)
drawfaultline(Xpoint,Ypoint,Tpoint,INDEXpoint,'or');
hold on
drawfaultline(Xpoint1,Ypoint1,Tpoint1,INDEXpoint1,'.b');
xlabel("X");
ylabel("Y");
zlabel("Z");
title("插值后断层解释控制点")
grid on

断层插值后的效果

标签:temp,断层,插值,曲线,iter,线性,inter,isample
From: https://www.cnblogs.com/GeophysicsWorker/p/18638932

相关文章

  • 线性回归的从零实现
    1.生成数据集从标准正态分布中采样两个特征,根据带有噪声的线性模型构造一个人造数据集defsynthetic_data(w,b,num_examples):X=torch.normal(0,1,(num_examples,len(w)))#从正态分布去生成输入的X值y=torch.matmul(X,w)+b#根据真实的权重偏置生成结果y......
  • 数据结构之线性表之链表(附加一个考研题)
    链表的定义链表的结构:单链表-初始化代码实现:单链表-头插法代码实现:这里我给大家分析一下我们每创建一个新的节点都要插在头节点的后面,我们一定要注意顺序一定要先让新节点指向头节点指向的下一个节点,再让头节点指向新的节点单链表-遍历代码实现:代码分析:这里我......
  • Cesium初级开发教程之二十八:线性插值
    教程示例网站:https://thomaz529.github.io 一、效果图二、代码Cesium提供了线性插值的方法Cesium.Math.lerp,不仅仅可以为经纬度进行插值,也可以对颜色,等高线等进行插值计算。constlength=100;conststartLon=100constendLon=120constlat=34......
  • 【线性DP】LeetCode 2320. 统计放置房子的方式数
    题目https://leetcode.cn/problems/count-number-of-ways-to-place-houses/题解由于道路两边的房子彼此互不影响,因此满足相互独立的条件,故而两侧的方案的乘积就是最后的答案。因为两侧空地的数量都是\(n\),因此只要算出其中一侧的方案即可,另一侧的方案相同。每块空地上都可以......
  • 基于 Python +线性回归算法 的 股票价格预测
    以下是一个基于Python控制台的股票价格预测程序,适合作为课程设计作业。程序基于机器学习模型(如线性回归),实现对股票价格的预测,并支持用户通过控制台输入或加载历史数据进行操作。功能描述数据加载:用户可输入股票历史价格数据,或从文件中加载CSV数据。数据可视化:显示......
  • 线性代数2.矩阵的迹&转置&对称矩阵
    2.矩阵的迹&转置&对称矩阵2.1矩阵的迹定义:\(n\timesn\)矩阵主对角线上元素的总和称为\(矩阵的迹\)矩阵X的迹记为\(tr(X)\)示例:设存在以下\(n\timesn\)的矩阵:\[X_{n\timesn}=\begin{bmatrix}x_{11}&x_{12}&x_{13}&...&x_{1n}\\x_{21}&x_{22}&......
  • 线性代数1.矩阵的基本概念&意义&特殊矩阵&基本运算
    1.矩阵的基本概念&意义&特殊矩阵&基本运算1.1矩阵的定义:矩阵是由\(m\timesn\)个数排成的数表。如以下矩阵:\[X=\begin{bmatrix}x_{11}&x_{12}&x_{13}&...&x_{1n}\\x_{21}&x_{22}&x_{23}&...&x_{2n}\\x_{31}&x_{32}&x_{......
  • 利用二次曲线的不变量来快速确认曲线类型
    前言在《如何利用矩阵化简平面上的二次型曲线》这篇文章中,我们介绍了如何利用转轴和移轴矩阵来化简平面上的二次型曲线,从而确定曲线的类型,形状和位置。一个很自然的问题是,我们是否有办法不通过转轴移轴,而是直接通过二次曲线方程的系数,来判断曲线的类型和形状。解决这个问题......
  • 数据链中常见电磁干扰matlab仿真,对比噪声调频,线性调频,噪声,扫频,灵巧五种干扰模型
    1.算法运行效果图预览(完整程序运行后无水印)   2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频) %噪声调频干扰............................................%调频指数uj=1;mf=0.6;wpp=6;df1=fs/......
  • 【数据结构与算法】线性表——顺序储存与单链表
    【数据结构与算法】线性表——顺序储存与单链表文章目录【数据结构与算法】线性表——顺序储存与单链表一、线性表的基本概念1.线性表的定义2.线性表的分类二、线性表的顺序存储1.顺序表的基本操作1.1插入操作1.2删除操作1.3查找操作三、线性表的链式存储1.单......