全面地介绍 将二维数据矩阵插值拟合为二维曲面方程——基于matlab

这篇具有很好参考价值的文章主要介绍了全面地介绍 将二维数据矩阵插值拟合为二维曲面方程——基于matlab。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

要利用matlab将二维数据矩阵拟合成一个二维曲面方程,首先,我们得明白什么是插值和拟合。下面,从对洋流数据的处理入手,先以一个基本的流程为例,进行问题的概述,然后介绍两种具体的方法。

matlab根据数据拟合曲面,研究生学习,matlab,数学建模,学习,考研,经验分享,学习方法,矩阵

原理初析

插值

根据已知的数据点,生成一个连续的函数,可以在任意位置求值。matlab 提供了多种插值方法,如线性插值、 B B B-样条插值、多项式插值等。

这些方法的优缺点和适用场合各有不同,一般来说,线性插值比较简单和快速,但可能不够平滑; B B B -样条插值比较平滑和灵活,但可能不够精确;多项式插值比较精确和光滑,但可能出现奇异或震荡现象。具体选择哪种方法,要根据数据的特点和目的来决定。

matlab中,可以使用 i n t e r p 2 interp2 interp2 函数或 g r i d d e d I n t e r p o l a n t griddedInterpolant griddedInterpolant 类来进行二维插值,它们都可以指定不同的插值方法。例如,如果已知的数据矩阵是 V {V} V,想要在 X q {Xq} Xq Y q {Yq} Yq 的网格上进行插值,可以使用以下代码:


% 线性插值
Vq1 = interp2(V,Xq,Yq,'linear');
% B-样条插值
Vq2 = interp2(V,Xq,Yq,'spline');
% 多项式插值
Vq3 = interp2(V,Xq,Yq,'pchip');

拟合

根据插值得到的函数,寻找一个合适的数学模型,可以用一个简洁的表达式来近似描述数据的规律。

matlab提供了多种拟合方法,如线性回归、非线性回归、最小二乘法等。这些方法的原理和应用也各有不同,一般来说,线性回归比较简单和稳定,但可能不够灵活;非线性回归比较灵活和通用,但可能不够稳定;最小二乘法比较优化和精确,但可能不够简洁。具体选择哪种方法,要根据数据的分布和形状来决定。matlab中,可以使用 f i t fit fit 函数或 f i t t y p e fittype fittype 类来进行二维拟合,它们都可以指定不同的拟合方法。例如,如果插值得到的函数是 V q {Vq} Vq,想要用一个二次多项式来拟合,可以使用以下代码:

% 线性回归
ft1 = fittype('poly22'); % 二次多项式
f1 = fit([Xq(:),Yq(:)],Vq1(:),ft1); % 拟合
% 非线性回归
ft2 = fittype('a*exp(b*x)*sin(c*y)'); % 非线性函数
f2 = fit([Xq(:),Yq(:)],Vq2(:),ft2); % 拟合
% 最小二乘法
ft3 = fittype('a*x^2+b*y^2+c*x*y+d*x+e*y+f','problem','f'); % 二次多项式,f是固定参数
f3 = fit([Xq(:),Yq(:)],Vq3(:),ft3,'problem',0); % 拟合

拟合完成后,可以用 f1,f2,f3等变量来表示拟合得到的二维曲面方程,也可以用 c o e f f v a l u e s coeffvalues coeffvalues 函数来提取方程的系数。

例如,如果想要得到 f1的表达式,可以使用以下代码:

% 提取系数
c1 = coeffvalues(f1);
% 构造表达式
s1 = sprintf('V = %.4f*X^2 + %.4f*Y^2 + %.4f*X*Y + %.4f*X + %.4f*Y + %.4f',c1(1),c1(2),c1(3),c1(4),c1(5),c1(6));

拟合优度的评估

对于方程的拟合,如果要做可行性分析的话,那必然要对拟合优度进行评估。

拟合优度是一种衡量拟合结果与实际数据之间的差异的指标。拟合优度越高,说明拟合结果越能反映数据的真实情况。拟合优度的评估方法有很多种,常见的有残差分析、决定系数、均方根误差等。不同的评估方法有不同的含义和应用场景,比如残差分析可以检验拟合函数的合理性,决定系数可以衡量拟合函数对数据变化的解释程度,均方根误差可以衡量拟合函数的预测精度等。

具体实例的展开

下面,将以两种方法进行具体问题的求解。

B-样条插值+最小二乘法

B-样条插值法

B B B-样条(B-spline)是一种基于多项式的插值方法,它可以构造出平滑且连续的曲线或曲面。b-样条的优点是可以灵活地控制插值的阶数、节点、边界条件等,从而得到不同的插值效果。b-样条的缺点是计算量较大,且难以表示复杂的形状。

B B B -样条的数学定义如下:

设有 n + 1 n+1 n+1 个数据点 ( x i , y i ) \left(x_i,y_i\right) (xi,yi),其中 i = 0 , 1 , … , n i=0,1,\dots,n i=0,1,,n ,且 x 0 < x 1 < ⋯ < x n x_0<x_1<\dots<x_n x0<x1<<xn B B B-样条插值法的目标是找到一个函数 f ( x ) f\left(x\right) f(x),使得 f ( x i ) = y i f\left(x_i\right)=y_i f(xi)=yi,对所有 i i i 成立,且 f ( x ) f\left(x\right) f(x) 在每个区间 [ x i , x i + 1 ] \left[x_i,x_{i+1}\right] [xi,xi+1] 上是一个 k k k 阶多项式,其中 k k k 是给定的插值阶数,通常为 3 3 3 4 4 4

为了构造这样的函数,我们需要引入一个节点序列 t 0 , t 1 , … , t n + k t_0,t_1,\dots,t_{n+k} t0,t1,,tn+k ,其中 t i t_i ti 是一个实数,且满足 t 0 ≤ t 1 ≤ ⋯ ≤ t n + k t_0\le t_1\le \dots\le t_{n+k} t0t1tn+k。节点序列的作用是划分数据点的区间,并确定每个区间上的多项式的系数。根据节点序列,我们可以定义一组基函数 B i , k ( x ) B_{i,k}(x) Bi,k(x) ,其中 i = 0 , 1 , … , n , k = 1 , 2 , … i=0,1,\dots,n,k=1,2,\dots i=0,1,,nk=1,2,,满足以下递推公式:

B i , 1 ( x ) = { 1 , t i ≤ x < t i + 1 0 , otherwise B_{i,1}(x)=\begin{cases}1,&t_i\le x<t_{i+1}\\0,&\text{otherwise}\end{cases} Bi,1(x)={1,0,tix<ti+1otherwise
B i , k ( x ) = x − t i t i + k − 1 − t i B i , k − 1 ( x ) + t i + k − x t i + k − t i + 1 B i + 1 , k − 1 ( x ) B_{i,k}(x)=\frac{x-t_i}{t_{i+k-1}-t_i}B_{i,k-1}(x)+\frac{t_{i+k}-x}{t_{i+k}-t_{i+1}}B_{i+1,k-1}(x) Bi,k(x)=ti+k1tixtiBi,k1(x)+ti+kti+1ti+kxBi+1,k1(x)

基函数 B i , k ( x ) B_{i,k}(x) Bi,k(x) 的意义是在节点序列 t i , t i + 1 , … , t_i,t_{i+1},\dots, ti,ti+1,, 上的 k k k B B B -样条,它是一个非负的、分段的、最高为 k − 1 k-1 k1 次的多项式,且在 [ t i , t i + 1 ] [t_i,t_{i+1}] [ti,ti+1]上为 1 1 1,在 [ t i + k − 1 , t i + k ] [t_{i+k-1},t_{i+k}] [ti+k1,ti+k] 上为 0 0 0,在其他区间上线性变化。

基于基函数,我们可以将插值函数 f ( x ) f(x) f(x) 表示为:

f ( x ) = ∑ i = 0 n a i B i , k ( x ) f(x)=\sum_{i=0}^n a_i B_{i,k}(x) f(x)=i=0naiBi,k(x)
其中 a i a_i ai 是待求的系数,它们可以通过解线性方程组 ∑ i = 0 n a i B i , k ( x j ) = y j \sum_{i=0}^n a_i B_{i,k}(x_j)=y_j i=0naiBi,k(xj)=yj

j = 0 , 1 , … , n j=0,1,\dots,n j=0,1,,n 得到。

这样,我们就得到了一个 B B B -样条插值函数 f ( x ) f(x) f(x) ,它可以在任意给定的 x x x 值处计算出对应的 y y y 值。

如果我们要得到一个二维曲面方程 f ( x , y ) f(x,y) f(x,y) ,我们可以先沿着 x x x 方向对每个 y y y 值进行 B B B -样条插值,得到一组函数

f i ( y ) = ∑ j = 0 n a i j B j , k ( x ) f_i(y)=\sum_{j=0}^n a_{ij} B_{j,k}(x) fi(y)=j=0naijBj,k(x)

其中 i = 0 , 1 , … , m , i=0,1,\dots,m, i=0,1,,m然后再沿着 y y y 方向对每个 x x x 值进行 B B B-样条插值,得到最终的函数

f ( x , y ) = ∑ i = 0 m f i ( y ) B i , k ( y ) f(x,y)=\sum_{i=0}^m f_i(y) B_{i,k}(y) f(x,y)=i=0mfi(y)Bi,k(y)

这样,我们就得到了一个双向的 B B B -样条插值曲面,它可以在任意给定的 ( x , y ) (x,y) (x,y) 值处计算出对应的 z z z 值。

lsqcurvefit 拟合法

matlab根据数据拟合曲面,研究生学习,matlab,数学建模,学习,考研,经验分享,学习方法,矩阵

接下来,介绍一种主要的最小二乘法的拟合算法在matlab里的应用—— l s q c u r v e f i t lsqcurvefit lsqcurvefit 拟合法。

l s q c u r v e f i t lsqcurvefit lsqcurvefit 是 MATLAB 中的一个函数,它可以用来对数据进行非线性曲线拟合。 l s q c u r v e f i t lsqcurvefit lsqcurvefit 的优点是可以灵活地指定拟合函数的形式,且可以考虑数据的误差和噪声。 l s q c u r v e f i t lsqcurvefit lsqcurvefit 的缺点是需要提供拟合函数的初始参数,且可能存在局部最优解的问题。

设有 n n n 个数据点 ( x i , y i ) (x_i,y_i) (xi,yi) ,其中 i = 1 , 2 , … , n i=1,2,\dots,n i=1,2,,n ,且 x i x_i xi y i y_i yi 可以是标量或向量。 l s q c u r v e f i t lsqcurvefit lsqcurvefit 的目标是找到一个函数 f ( x , a ) f(x,a) f(x,a) ,使得

∑ i = 1 n ∥ y i − f ( x i , a ) ∥ 2 \sum_{i=1}^n \|y_i-f(x_i,a)\|^2 i=1nyif(xi,a)2

最小,其中 a a a 是待求的参数向量,它可以有一些约束条件,比如上下界、线性或非线性不等式或等式。

为了求解这样的问题, l s q c u r v e f i t lsqcurvefit lsqcurvefit 使用了一种基于信赖域的迭代算法。

它的基本思想是在每一步,以当前的参数值为中心,构造一个信赖域,然后在信赖域内用一个二次模型来近似目标函数,求解该二次模型的最优解,作为下一步的参数值。这个过程重复进行,直到满足收敛条件或达到最大迭代次数。信赖域的大小会根据每一步的优化效果进行调整,以保证算法的稳定性和效率。

l s q c u r v e f i t lsqcurvefit lsqcurvefit 在具体编程的时候需要提供以下输入:

  • fun:一个函数句柄,表示拟合函数 f ( x , a ) f(x,a) f(x,a) ,它接受两个输入参数,分别是自变量 x x x 和参数向量 a a a ,并返回一个输出值,表示因变量 y y y
  • x0:一个向量,表示参数向量 a a a的初始值,它决定了算法的起始点,对于非线性问题,不同的初始值可能导致不同的最优解,所以应该尽量选择一个合理的初始值。
  • xdata:一个向量或矩阵,表示自变量 x x x 的数据,它的大小应该与因变量 y y y 的数据相匹配。
  • ydata:一个向量或矩阵,表示因变量 y y y 的数据,它的大小应该与自变量 x x x 的数据相匹配。
  • lb:一个向量,表示参数向量 a a a 的下界,它的大小应该与参数向量 a a a 相同,如果没有下界,可以用 Inf 表示。
  • ub:一个向量,表示参数向量 a a a 的上界,它的大小应该与参数向量 a a a 相同,如果没有上界,可以用 Inf 表示。

l s q c u r v e f i t lsqcurvefit lsqcurvefit 的输出是一个向量,表示参数向量 a a a 的最优值,它使得目标函数的平方和达到最小。

如果我们要得到一个二维曲面方程 f ( x , y , a ) f(x,y,a) f(x,y,a) ,我们可以先将自变量 x x x y y y 组合成一个矩阵,然后将其作为 xdata 输入 l s q c u r v e f i t lsqcurvefit lsqcurvefit ,得到参数向量 a a a 的最优值,然后将其代入拟合函数 f ( x , y , a ) f(x,y,a) f(x,y,a) ,得到最终的函数 f ( x , y ) f(x,y) f(x,y) 。这样,我们就得到了一个非线性的曲面拟合方程,它可以在任意给定的 ( x , y ) (x,y) (x,y) 值处计算出对应的 z z z 值。

数学实现

为了演示插值和拟合的数学实现,使用一个示例数据矩阵,它包含了 x x x y y y 位置方向的, u u u v v v方向速度的洋流数据,大小为 50 × 50 50\times 50 50×50

这里,假设你的洋流数据是从官方网站下载的,所以我的这个算法就假设你直接 load 这个洋流数据文件。

读取数据矩阵,并提取 x , y , u , v x,y,u,v xyuv 四个变量,分别表示位置和速度。这里我假设数据矩阵已经保存在一个名为 data.mat 的文件中,各位小伙伴们可以根据自己的实际情况修改文件名和路径哒。

load data.mat
x = data(:,1);
y = data(:,2);
u = data(:,3);
v = data(:,4);

x , y , u , v x,y,u,v xyuv 四个变量转换为矩阵形式,以便进行插值和拟合。这里我假设 x , y x,y xy 是均匀分布的,当然也可以根据自己的实际情况修改矩阵的大小和范围。

X = reshape(x,50,50);
Y = reshape(y,50,50);
U = reshape(u,50,50);
V = reshape(v,50,50);

计算 z z z 变量,表示速度的大小,它是 u , v u,v uv 的平方和的开方。这个变量将作为插值和拟合的因变量,表示洋流的强度。

Z = sqrt(U.^2+V.^2);

使用 B B B -样条插值法,对 z z z 变量进行插值,得到一个二维曲面方程 f 1 ( x , y ) f_1(x,y) f1(x,y)

这里,我使用 MATLAB 的 C u r v e F i t t i n g T o o l b o x Curve Fitting Toolbox CurveFittingToolbox 中的 f i t fit fit 函数,指定插值方法为 ‘ b i h a r m o n i c i n t e r p ’ ‘biharmonicinterp’ biharmonicinterp,表示双向的三次 B B B -样条插值。也可以使用其他的插值方法,比如 ‘ t h i n p l a t e i n t e r p ’ ‘thinplateinterp’ thinplateinterp ,表示双向的二次 B B B -样条插值,或者 ‘ l i n e a r i n t e r p ’ ‘linearinterp’ linearinterp,表示双向的线性插值。

f i t fit fit 函数的输出是一个 c f i t cfit cfit 对象,它包含了插值函数的信息,也可以使用 f e v a l feval feval 函数来计算插值函数在任意 ( x , y ) (x,y) (x,y) 值处的 z z z 值,或者使用 f o r m u l a formula formula 函数来查看插值函数的具体表达式。

注意,由于 b-样条插值函数是分段的,它的表达式可能很长,且难以理解,所以我不建议各位友友直接查看它的表达式,而是使用 f e v a l feval feval 函数来计算它的值。

f1 = fit([X(:),Y(:)],Z(:),'biharmonicinterp');
Z1 = feval(f1,X,Y);

接下来,使用 l s q c u r v e f i t lsqcurvefit lsqcurvefit 拟合法,对 z z z 变量进行拟合,得到一个二维曲面方程 f 2 ( x , y , a ) f_2(x,y,a) f2(x,y,a)。这里我假设拟合函数的形式为 f 2 ( x , y , a ) = a 1 sin ⁡ ( a 2 x + a 3 y ) + a 4 cos ⁡ ( a 5 x + a 6 y ) + a 7 f_2(x,y,a)=a_1\sin(a_2x+a_3y)+a_4\cos(a_5x+a_6y)+a_7 f2(x,y,a)=a1sin(a2x+a3y)+a4cos(a5x+a6y)+a7

,其中 a = ( a 1 , a 2 , a 3 , a 4 , a 5 , a 6 , a 7 ) a=(a_1,a_2,a_3,a_4,a_5,a_6,a_7) a=(a1,a2,a3,a4,a5,a6,a7) 是待求的参数向量。

当然,你也可以根据自己的实际情况修改拟合函数的形式,但请注意,拟合函数应该是非线性的,且能够较好地拟合数据的特征。

l s q c u r v e f i t lsqcurvefit lsqcurvefit 函数的输入包括拟合函数的函数句柄,参数向量的初始值,自变量和因变量的数据,参数向量的上下界等。 l s q c u r v e f i t lsqcurvefit lsqcurvefit 函数的输出是参数向量的最优值,它使得目标函数的平方和达到最小。

根据参数向量的最优值,我们可以得到拟合函数的具体表达式,也可以使用 f e v a l feval feval 函数来计算拟合函数在任意 ( x , y ) (x,y) (x,y) 值处的 z z z 值。

fun = @(a,xdata) a(1)*sin(a(2)*xdata(:,1)+a(3)*xdata(:,2))+a(4)*cos(a(5)*xdata(:,1)+a(6)*xdata(:,2))+a(7);
x0 = [1,1,1,1,1,1,1];
xdata = [X(:),Y(:)];
ydata = Z(:);
lb = [-Inf,-Inf,-Inf,-Inf,-Inf,-Inf,-Inf];
ub = [Inf,Inf,Inf,Inf,Inf,Inf,Inf];
a = lsqcurvefit(fun,x0,xdata,ydata,lb,ub);
Z2 = feval(fun,a,xdata);
Z2 = reshape(Z2,50,50);
f2 = @(x,y) a(1)*sin(a(2)*x+a(3)*y)+a(4)*cos(a(5)*x+a(6)*y)+a(7);

代码

接下来,是一个整个的代码实现。

% Load data matrix and extract variables
load data.mat
x = data(:,1);
y = data(:,2);
u = data(:,3);
v = data(:,4);

% Convert variables to matrix form
X = reshape(x,50,50);
Y = reshape(y,50,50);
U = reshape(u,50,50);
V = reshape(v,50,50);



% Calculate z variable as the magnitude of velocity 
Z = sqrt(U^2+V^2);
% Use b-spline interpolation method to interpolate z variable and get a surface equation f1(x,y) 
f1 = fit([X(:),Y(:)],Z(:),'biharmonicinterp'); Z1 = feval(f1,X,Y);
% Use lsqcurvefit fitting method to fit z variable and get a surface equation f2(x,y,a) 
fun = @(a,xdata) a(1)*sin(a(2)*xdata(:,1)+a(3)*xdata(:,2))+a(4)*cos(a(5)*xdata(:,1)+a(6)*xdata(:,2))+a(7); 
x0 = [1,1,1,1,1,1,1]; 
xdata = [X(:),Y(:)]; 
ydata = Z(:); 
lb = [-Inf,-Inf,-Inf,-Inf,-Inf,-Inf,-Inf]; 
ub = [Inf,Inf,Inf,Inf,Inf,Inf,Inf]; 
a = lsqcurvefit(fun,x0,xdata,ydata,lb,ub); 
Z2 = feval(fun,a,xdata); 
Z2 = reshape(Z2,50,50); 
f2 = @(x,y) a(1)*sin(a(2)*x+a(3)*y)+a(4)*cos(a(5)*x+a(6)*y)+a(7);
% Plot the original data, the interpolated surface, and the fitted surface 
figure 
subplot(1,3,1) 
surf(X,Y,Z) 
title('Original Data') 
xlabel('x'),ylabel('y'),zlabel('z') 
subplot(1,3,2) 
surf(X,Y,Z1) 
title('Interpolated Surface') 
xlabel('x'), ylabel('y'),zlabel('z') 
subplot(1,3,3) 
surf(X,Y,Z2) 
title('Fitted Surface') 
xlabel('x'),ylabel('y'),zlabel('z')
% Compare the interpolation and fitting results with the original data % Calculate the mean squared error (MSE) and the coefficient of determination (R-squared) for each method 
mse1 = mean((Z(:)-Z1(:)).^2); 
mse2 = mean((Z(:)-Z2(:)).^2); 
r1 = 1 - sum((Z(:)-Z1(:)).^2)/sum((Z(:)-mean(Z(:))).^2); 
r2 = 1 - sum((Z(:)-Z2(:))^.2)/sum((Z(:)-mean(Z(:)))^.2); 
fprintf('The MSE and R-squared for b-spline interpolation are: %.4f and %.4f\n',mse1,r1); 
fprintf('The MSE and R-squared for lsqcurvefit fitting are: %.4f and %.4f\n',mse2,r2);
% Display the interpolation and fitting functions 
fprintf('The interpolation function is: f1(x,y) = %s\n',formula(f1));
fprintf('The fitting function is: f2(x,y) = %s\n',formula(f2));

B-样条插值+非线性回归法

这个方法就不着重讲原理分析了,讲一下拟合评估怎么做,还附带讲一讲洋流的可视化。

数据的预处理

同样,假设你已经有了一个 50 × 50 50 \times 50 50×50 的二维数据矩阵,比如洋流数据矩阵,其中每个元素表示某个位置的洋流速度。为了进行插值和拟合,你需要将这个矩阵转换为三个向量,分别表示 x x x 坐标、 y y y 坐标和 z z z 值。可以使用 matlab 的 r e s h a p e reshape reshape 函数来实现这一转换:

% 假设 Z 是 50 x 50 的洋流数据矩阵
n = 50; % 矩阵的大小
x = repmat(1:n,1,n); % 重复 1 到 n,共 n 次,得到 x 坐标向量
y = reshape(repmat(1:n,n,1),1,n^2); % 重复 1 到 n,每个 n 次,然后转换为行向量,得到 y 坐标向量
z = reshape(Z,1,n^2); % 将 Z 转换为行向量,得到 z 值向量

% 假设 x, y, z 是已经转换好的三个向量,表示数据点的坐标和值
m = 100; % 网格的大小
xi = linspace(min(x),max(x),m); % 生成 x 方向的网格坐标
yi = linspace(min(y),max(y),m); % 生成 y 方向的网格坐标
[XI,YI] = meshgrid(xi,yi); % 生成网格矩阵
ZI = griddata(x,y,z,XI,YI,'cubic'); % 使用样条插值得到网格上的值

非线性回归的实现

为了使用 f i t fit fit 函数进行非线性回归,你需要指定拟合函数的形式和参数的初始值或范围。拟合函数的形式可以是一个匿名函数,也可以是一个字符串,表示函数的表达式。参数的初始值或范围可以是一个向量,也可以是一个矩阵,表示参数的下限和上限:

% 假设 x, y, z 是已经转换好的三个向量,表示数据点的坐标和值
f = @(a,b,c,d,x,y) a*x.^2 + b*y.^2 + c*x.*y + d; % 定义拟合函数的形式,这里是一个二次曲面
s = [1 1 1 1]; % 定义参数的初始值
f = fit([x,y],z,f,'StartPoint',s); % 使用非线性回归得到拟合结果

拟合优度的评估

前面已提及了拟合优度评估的原理,这里讲讲代码的实现。为了使用 f i t fit fit 函数的输出来评估拟合优度,你可以查看拟合结果的属性,其中包含了一些拟合优度的指标:

% 假设 f 是拟合结果
R2 = f.rsquare; % 得到决定系数
RMSE = f.rmse; % 得到均方根误差
disp(['R-squared = ',num2str(R2)]); % 显示决定系数
disp(['RMSE = ',num2str(RMSE)]); % 显示均方根误差

曲面方程的求解

为了使用 f i t fit fit 函数的输出来求解曲面方程,你可以使用 f f f 函数来计算任意位置的 z z z 值,或者使用 f e v a l feval feval 函数来计算网格上的 z z z 值:

% 假设 f 是拟合结果,XI, YI 是网格矩阵
z1 = f(10,20); % 计算 x = 10, y = 20 时的 z 值
z2 = feval(f,XI,YI); % 计算网格上的 z 值
disp(['z(10,20) = ',num2str(z1)]); % 显示 z(10,20) 的值

矢量场的绘制

对于洋流的可视化,因为洋流由 x , y , u , v x,y,u,v x,y,u,v 这四组向量组成,其中前两个定位洋流的每个坐标点的位置,后两个代表每个坐标点水平方向和竖直方向的速度,所以可以用矢量场来可视化,为了绘制矢量场,可以使用 q u i v e r quiver quiver 函数来绘制箭头,表示矢量的方向和大小。

在绘制的时候,需要指定箭头的起点和终点的坐标,以及箭头的颜色、线宽、比例等属性:

% 假设 XI, YI, ZI 是网格矩阵,表示插值后的数据
[U,V,W] = gradient(ZI); % 计算网格上的梯度,表示矢量的方向和大小
quiver3(XI,YI,ZI,U,V,W,'r','LineWidth',2,'AutoScaleFactor',0.5); % 绘制矢量场,使用红色的箭头,线宽为 2 ,比例因子为 0.5
xlabel('x'); % 标注 x 轴
ylabel('y'); % 标注 y 轴
zlabel('z'); % 标注 z 轴
title('Vector field of the fitted surface'); % 标注标题

尾声

本文由一个通用方法进行问题的介绍,然后,使用了两种组合方法进行具体问题求解的展开。

将二维数据矩阵转化为二维曲面方程有很多方法,可能本文的解答有局限,请多多见谅。

最后,祝君功不唐捐,玉汝于成!

matlab根据数据拟合曲面,研究生学习,matlab,数学建模,学习,考研,经验分享,学习方法,矩阵文章来源地址https://www.toymoban.com/news/detail-847975.html

参考

  1. MathWorks. (2021). Interpolate scattered data.
  2. MathWorks. (2021). Representing a matrix as a surface.
  3. Wikipedia contributors. (2024, March 2). Bilinear interpolation. In Wikipedia, The Free Encyclopedia. Retrieved 02:41, March 4, 2024.
  4. Kiusalaas, J. (2013). Interpolation in Two and Three Dimensions. In Numerical Methods in Engineering with Python 3 (pp. 97-122). Cambridge: Cambridge University Press. doi:10.1017/CBO9781139108278.006
  5. de Boor, C. (1978). Biharmonic spline interpolation. In A Practical Guide to Splines (pp. 211-247). New York: Springer-Verlag.
  6. MathWorks. (n.d.). Two-Dimensional Interpolation. Retrieved March 4, 2024.
  7. XlXtrFun. (n.d.). Excel 2D interpolation function. Retrieved March 4, 2024.

到了这里,关于全面地介绍 将二维数据矩阵插值拟合为二维曲面方程——基于matlab的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何根据自有数据拟合绘制3D曲面图-Python matplotlib

    目录 问题提出 绘制简单曲面图 使用自有数据拟合绘制 在网上找了很久怎么用自己有的dataframe数据,拟合出3d的曲面图,大部分人都是根据已知函数去绘制,有几篇进行拟合绘制,但是还是根据特定函数生成的数据,没有一篇直接用dataframe数据画3d曲面图的。讲的比较好的几

    2024年02月09日
    浏览(45)
  • Fluent UDF中调用Matlab矩阵运算函数(以二维插值为例)

    Fluent UDF中经常需要用到一些常见算法,例如插值、拟合、矩阵运算等等,这些在UDF中是没有现成函数实现的,理论上需要我们自己去写函数。另一方面我们又注意到这些运算恰恰是Matlab的强项,几乎调用一个现成的函数就完成了目的。所以我们有什么办法把Matlab函数给UDF直接

    2024年02月09日
    浏览(78)
  • 【MATLAB 数学建模】 插值方法 数据拟合

    一维插值是一种在给定有限数据点集合的情况下,通过构建一个函数来近似估计这些数据点之间的值。它基于假设,在相邻数据点之间存在某种连续性或平滑性。 一维插值常用于曲线拟合、曲线重建和数据补全等应用中。其中最简单的一种插值方法是线性插值,即通过连接相

    2024年02月08日
    浏览(53)
  • MATLAB 之 数据插值、曲线拟合和数值微分

    在工程测量和科学实验中,所得到的数据通常都是离散的。如果要得到这些离散点以外的其他点的数值,就需要根据这些已知数据进行插值。例如,测量得 n n n 个点的数据为 ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) (x_{1},y_{1}),(x_{2},y_{2}),dots ,(x_{n},y_{n}) ( x 1 ​ , y 1 ​

    2024年02月08日
    浏览(42)
  • 基于MATLAB的三维数据插值拟合与三次样条拟合算法(附完整代码)

    目录 一. 三维插值 例题1 二. 高维度插值拟合 格式一 格式二 格式三 格式四 格式五 例题2 三. 单变量三次样条插值 例题3 例题4 四. 多变量三次样条插值 例题6 首先三维网格生成是利用 meshgrid() 函数,在MATLAB中调用格式如下: 三维插值运算,主要利用griddata()函数与interp()函数

    2024年02月14日
    浏览(42)
  • Matlab数据处理:用离散数据根据自定义多变量非线性方程拟合解析方程求取参数

    问题:已知xlsx表格[X,Y,Z]的离散取值,希望用  来拟合,用matlab求得[C1,C2,C3,C5,C6]的值 解答: 运行结果:  备注: 1.rsquare=0.8668认为接近1,拟合效果不错 2.fill函数的startpoint如何设置[C1,...C6]得到一个收敛点?(我找了没找到什么设置startpoint好方法,摸索用如下方法找到了一个

    2024年02月11日
    浏览(48)
  • 【python海洋专题三十五】海图数据加密--二维插值

    【python海洋专题三十五】海图数据加密–二维插值 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像修饰 【Python海洋专题五】之

    2024年02月06日
    浏览(35)
  • 7.6 曲面及其方程

    🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学这门课的知识点,参考书主要为经典的同济版第七版《高等数学》

    2024年02月08日
    浏览(32)
  • CloudCompare 二次开发(20)——二次曲面拟合

    本文由CSDN点云侠原创,原文链接。爬虫网站自重。   由CloudCompare——点云二次曲面拟合一文知:CloudCompare软件中的已经集成了二次曲面拟合功能,但是计算出来的拟合参数是不正确的。因此,本文在原有算法的基础上进行修改,使输出的参数结果正确。 mainwindow.cpp 文件

    2024年02月06日
    浏览(44)
  • 利用NURBS曲线进行点云曲面拟合算法

    点云拟合曲面算法是将点云数据拟合成一个二次或高次曲面模型的算法。这种算法主要用于三维模型重建、计算机视觉、机器人感知、医学图像处理等领域。 常见的点云拟合曲面算法包括: 最小二乘法(Least Squares Method):通过最小化点到曲面距离的平方和来拟合曲面模型。

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包