我有一个函数F,它使我可以基于x和z值计算'y'。即y = F(x,z)。此函数的计算量很大。每次评估大约需要10分钟。
我真正需要的是在给定一对(x,y)值的情况下找到一个“ z”值,即我需要z = G(x,y)。解决F是不可能的。
要通过数字方式实现G,我已经遍历并使用x和z中的网格使用F(x,z)计算了许多y值。
附加的是等高线图中z值的图。红点代表我具有z值的(x,y)点。很难看到如此放大,因为这些点的y间距是不规则的。右侧也是一个冲浪图,显示G(x,y)平滑且行为良好。
figure(1); clf; subplot(1,2,1); hold all; box on; grid on;
scatter3(X_mesh(:),Y_mesh(:),Z_mesh(:),5,'filled','ro')
contourf(X_mesh,Y_mesh,Z_mesh,20)
xlabel('x'); ylabel('y'); zlabel('z'); hcolorbar = colorbar; ylabel(hcolorbar,'z')
subplot(1,2,2); hold all; box on; grid on;
surf(X_mesh,Y_mesh,Z_mesh);
xlabel('x'); ylabel('y'); zlabel('z');
但是,当我尝试对该表面进行插值时,该表面的光滑度会变得混乱,并且会产生很多噪音。如果我使用griddata或分散的Interpolant,则会发生这种情况。我尝试了不同的方法:“线性”,“自然”,“三次”等,并且都一样。 (为数字上的某些条纹表示歉意。我现在有显卡问题。)
figure(2); clf; subplot(1,2,1); hold all; box on; grid on;
[Xout_mesh, Yout_mesh] = meshgrid(linspace(5,60,100),linspace(0.4,300,100));
Zout_mesh = griddata(X_mesh(:),Y_mesh(:),Z_mesh(:),Xout_mesh,Yout_mesh,'linear');
contourf(X_mesh,Y_mesh,Z_mesh);
xlabel('x'); ylabel('y'); zlabel('z'); hcolorbar = colorbar; ylabel(hcolorbar,'z')
subplot(1,2,2); hold all; box on; grid on;
surf(X_mesh,Y_mesh,Z_mesh);
xlabel('x'); ylabel('y'); zlabel('z');
有人知道发生了什么吗?我不能使用任何规则的间隔数据插值,因为我的y点不是很规则的间隔。在下面,我应该画一个图,检查三角形网格并看起来不错。
figure(3); clf;
subplot(1,2,1); hold all; box on; grid on;
dt = delaunayTriangulation(X_mesh(:),Y_mesh(:));
xlabel('x'); ylabel('y');
triplot(dt)
subplot(1,2,2); hold all; box on; grid on;
triplot(dt)
xlabel('x'); ylabel('y');
为完整起见,输出到控制台的X_mesh,Y_mesh和Z_mesh如下。这三个矩阵都是19x51的双打。
X_mesh:
Columns 1 through 20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60
Y_mesh:
Columns 1 through 12
0.0242 0.0539 0.0764 0.0977 0.1112 0.1184 0.1203 0.1179 0.1118 0.1028 0.0914 0.0782
0.0521 0.1240 0.1890 0.2671 0.3370 0.3995 0.4552 0.5046 0.5478 0.5854 0.6175 0.6445
0.0801 0.1949 0.3036 0.4412 0.5717 0.6958 0.8138 0.9257 1.0318 1.1321 1.2265 1.3151
0.1081 0.2659 0.4186 0.6163 0.8087 0.9961 1.1788 1.3567 1.5298 1.6981 1.8613 2.0193
0.1361 0.3369 0.5337 0.7919 1.0465 1.2980 1.5465 1.7919 2.0341 2.2728 2.5079 2.7391
0.1641 0.4080 0.6489 0.9677 1.2849 1.6009 1.9158 2.2295 2.5419 2.8525 3.1613 3.4678
0.1921 0.4791 0.7642 1.1436 1.5235 1.9044 2.2861 2.6687 3.0519 3.4354 3.8189 4.2020
0.2202 0.5502 0.8795 1.3197 1.7625 2.2083 2.6571 3.1089 3.5633 4.0201 4.4790 4.9396
0.2762 0.6925 1.1102 1.6719 2.2406 2.8167 3.4001 3.9908 4.5886 5.1931 5.8039 6.4208
0.3322 0.8347 1.3409 2.0243 2.7191 3.4256 4.1439 4.8741 5.6157 6.3686 7.1322 7.9063
0.3883 0.9770 1.5716 2.3768 3.1976 4.0347 4.8882 5.7579 6.6438 7.5454 8.4624 9.3944
0.4443 1.1193 1.8024 2.7292 3.6762 4.6440 5.6327 6.6422 7.6724 8.7231 9.7937 10.8840
0.5004 1.2616 2.0332 3.0817 4.1549 5.2533 6.3773 7.5267 8.7015 9.9013 11.1258 12.3745
0.5564 1.4038 2.2639 3.4343 4.6336 5.8628 7.1221 8.4114 9.7308 11.0799 12.4583 13.8657
0.6966 1.7595 2.8409 4.3156 5.8305 7.3866 8.9843 10.6237 12.3048 14.0273 15.7910 17.5954
0.8367 2.1152 3.4178 5.1970 7.0275 8.9106 10.8468 12.8364 14.8793 16.9756 19.1248 21.3267
1.1169 2.8267 4.5718 6.9598 9.4216 11.9588 14.5722 17.2623 20.0294 22.8735 25.7942 28.7914
1.3972 3.5381 5.7257 8.7227 11.8158 15.0072 18.2979 21.6888 25.1801 28.7722 32.4648 36.2576
1.6774 4.2495 6.8797 10.4856 14.2101 18.0556 22.0238 26.1154 30.3312 34.6713 39.1359 43.7246
Z_mesh:
Columns 1 through 12
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
1.0000 2.5000 4.0000 6.0000 8.0000 10.0000 12.0000 14.0000 16.0000 18.0000 20.0000 22.0000
更新: 我找到了解决这个问题的线索。以下是使用“ surf”和“ trisurf”绘图打开了阴影插值的原始(未插值)数据的绘图。冲浪产生了非常光滑的表面,而三叉戟条纹开始出现。我相信,这些条纹与使用三角形网格的griddata或splitInterpolant所见的相同。
有人知道我如何从表面对象访问插值吗?
答案 0 :(得分:1)
您似乎没有为作业使用正确的工具。网格或线性插值不是此问题所需的。 Cris' comment中提到了此处的正确方法-即旋转数据集或简单地对维进行重新排序。
使用cftool
中发布的数据(前12列),我可以告诉您y=f(x,z)
可以使用两个参数均为1-3的多项式曲面来几乎完美地表示。例如,以下是一些结果:
poly32
模型(9个系数)Linear model Poly32:
f(x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 + p30*x^3 + p21*x^2*y
+ p12*x*y^2
Coefficients (with 95% confidence bounds):
p00 = 0.00897 (-0.0102, 0.02813)
p10 = -0.002627 (-0.004814, -0.0004397)
p01 = -0.00157 (-0.004805, 0.001665)
p20 = 0.0002045 (0.0001266, 0.0002824)
p11 = 0.02715 (0.02698, 0.02732)
p02 = -0.001751 (-0.001885, -0.001617)
p30 = -2.844e-06 (-3.702e-06, -1.985e-06)
p21 = 8.535e-06 (6.588e-06, 1.048e-05)
p12 = 0.0002796 (0.000274, 0.0002852)
Goodness of fit:
SSE: 0.1613
R-square: 1
Adjusted R-square: 1
RMSE: 0.02714
poly12
模型(5个系数)Linear model Poly12:
f(x,y) = p00 + p10*x + p01*y + p11*x*y + p02*y^2
Coefficients (with 95% confidence bounds):
p00 = 0.4112 (0.3266, 0.4958)
p10 = -0.02307 (-0.02588, -0.02026)
p01 = -0.1155 (-0.1304, -0.1006)
p11 = 0.03397 (0.03375, 0.03418)
p02 = 0.003119 (0.002503, 0.003735)
Goodness of fit:
SSE: 7.398
R-square: 0.9995
Adjusted R-square: 0.9995
RMSE: 0.1821
或通过编程方式
x = [1:1:8, 10:2:20 25 30:10:60].';
z = [1:1.5:4, 6:2:22];
[X,Z] = ndgrid(x,z);
Y = [
0.0242 0.0539 0.0764 0.0977 0.1112 0.1184 0.1203 0.1179 0.1118 0.1028 0.0914 0.0782
0.0521 0.1240 0.1890 0.2671 0.3370 0.3995 0.4552 0.5046 0.5478 0.5854 0.6175 0.6445
0.0801 0.1949 0.3036 0.4412 0.5717 0.6958 0.8138 0.9257 1.0318 1.1321 1.2265 1.3151
0.1081 0.2659 0.4186 0.6163 0.8087 0.9961 1.1788 1.3567 1.5298 1.6981 1.8613 2.0193
0.1361 0.3369 0.5337 0.7919 1.0465 1.2980 1.5465 1.7919 2.0341 2.2728 2.5079 2.7391
0.1641 0.4080 0.6489 0.9677 1.2849 1.6009 1.9158 2.2295 2.5419 2.8525 3.1613 3.4678
0.1921 0.4791 0.7642 1.1436 1.5235 1.9044 2.2861 2.6687 3.0519 3.4354 3.8189 4.2020
0.2202 0.5502 0.8795 1.3197 1.7625 2.2083 2.6571 3.1089 3.5633 4.0201 4.4790 4.9396
0.2762 0.6925 1.1102 1.6719 2.2406 2.8167 3.4001 3.9908 4.5886 5.1931 5.8039 6.4208
0.3322 0.8347 1.3409 2.0243 2.7191 3.4256 4.1439 4.8741 5.6157 6.3686 7.1322 7.9063
0.3883 0.9770 1.5716 2.3768 3.1976 4.0347 4.8882 5.7579 6.6438 7.5454 8.4624 9.3944
0.4443 1.1193 1.8024 2.7292 3.6762 4.6440 5.6327 6.6422 7.6724 8.7231 9.7937 10.8840
0.5004 1.2616 2.0332 3.0817 4.1549 5.2533 6.3773 7.5267 8.7015 9.9013 11.1258 12.3745
0.5564 1.4038 2.2639 3.4343 4.6336 5.8628 7.1221 8.4114 9.7308 11.0799 12.4583 13.8657
0.6966 1.7595 2.8409 4.3156 5.8305 7.3866 8.9843 10.6237 12.3048 14.0273 15.7910 17.5954
0.8367 2.1152 3.4178 5.1970 7.0275 8.9106 10.8468 12.8364 14.8793 16.9756 19.1248 21.3267
1.1169 2.8267 4.5718 6.9598 9.4216 11.9588 14.5722 17.2623 20.0294 22.8735 25.7942 28.7914
1.3972 3.5381 5.7257 8.7227 11.8158 15.0072 18.2979 21.6888 25.1801 28.7722 32.4648 36.2576
1.6774 4.2495 6.8797 10.4856 14.2101 18.0556 22.0238 26.1154 30.3312 34.6713 39.1359 43.7246];
[xData, yData, zData] = prepareSurfaceData( X, Z, Y );
% Set up fittype and options.
ft = fittype( 'poly12' ); % << play around with this until an acceptable error is reached.
% Fit model to data.
[fitresult, gof] = fit( [xData, yData], zData, ft );
关于您对寻找z=f(x,y)
的关注:解决方案取决于您必须评估该表达式多少次,频率和准确度。
如果执行几次,则可以将其视为方程式求解问题。具体来说,假设我们知道y = f(x,z)
,x0
和y0
,我们将得到一个类似poly12
情况的表达式:
y0 = p00 + p10*x0 + p01*z + p11*x0*z + p02*z^2
重新排列后会产生:
0 = (p02)*z^2 + (p01 + p1*x0)*z + (p00 + p10*x0 - y0)
这是一个简单的归零问题,其中一个未知数。在二阶多项式的情况下,上面的方法有一个封闭的解决方案,但是通常,fzero
应该能够处理给定的z
([0 100]
)范围。
如果您需要多次执行此操作,或者一次完成许多点操作,则可以为X
和Z
创建精细网格,使用多项式求Y
的值表面方程,然后使用interp2
(或qinterp2
)等在现在重新采样的网格上执行2d插值。