2012-10-25 34 views
1

我想以图形方式查找两个曲面和x-y平面之间的交点。 (表面z1与xy平面和交点z2与xy平面的交点)MATLAB - 数组交集

我已经创建了代表曲面z1 = 3 + x + y和z2 = 4-2x-4y的数组以及xy平面的z3使用meshgrid。无处不在,似乎我可以用来查找数组之间交集的唯一命令是A和B是数组的交叉(A,B)命令。但是,当输入相交(z1,z3)时,出现错误“A和B必须是矢量,或者'行'必须指定。”当我尝试相交(z1,z2,'rows')时,我返回了一个0×21的空矩阵。我在这里做错了什么?

我的代码:

x = -10:10; 
y = -10:10; 
[X,Y] = meshgrid(x,y); 
z1 = 3+X+Y; 
z2 = 4-2.*X-4.*Y; 
z3 = 0.*X+0.*Y;   %x-y plane 
surf(X,Y,z1) 
hold on 
surf(X,Y,z2) 
surf(X,Y,z3) 
int1 = intersect(z1,z3,'rows'); 
int2 = intersect(z2,z3,'rows'); 
+0

难道你不能找到'z1 == 0'和'z2 == 0'的地方吗?那将是与x-y平面的交点。或者如果你的网格中没有确切的(X,Y),你的意思是你想要插值吗? (另外,你的意思是“以图形方式”找到交点?你可以用数学方法计算出交点 - 不难 - 然后将它们绘制在图上?) –

+0

我可以通过分析来做到这一点。但是我正在使用MATLAB的数值方法课程,我假设我的导师希望我使用MATLAB函数查找相交曲线。 – photon

+1

阅读'contour3d'或'contour'的帮助,看看其中一个函数是否可以帮助您以图形方式确定两个阵列的z == 0曲线。 –

回答

3

这听起来像你想要的点,其中Z1 = Z2。为了在数字上找到这些,你有几个选项。

1)数字寻根:fsolve是能够解决方程组。您可以将曲面制定为一个矢量的函数,[x;y]并求解使两个曲面相等的矢量。使用初始猜测X = 1的示例中,Y = 1如下:

z1 = @(x) 3 + x(1) + x(2); 
z2 = @(x) 4 - 2*x(1) - 4*x(2); 
f = @(x) z1(x) - z2(x); 

x0 = [1;1] 
intersect = fsolve(@(x) f(x), x0); 

2)最小化误差:如果你被卡住离散数据(数组代替功能),则可以简单地找到点,其中Z1 - z2最接近零。一个简单的起点是取阵列Z1和Z2和找到的所有点,其中的差接近零:

tol = 1e-3; 
near_zero = abs(Z1 - Z2) < tol; 

near_zero将是一个逻辑数组,它是真每当Z1和Z2之间的差是小的相对到tol。您可以使用它来索引相应的meshgrid阵列中的X和Y以找到相交的坐标。

0

一种简单的方式(没有大的函数调用)来解决这个如下:

x = -10:.1:10; 
y = -10:.1:10; 
[X,Y] = meshgrid(x,y); 
z1 = 3+X+Y; 
z2 = 4-2.*X-4.*Y; 
z3 = z1 - z2; 
[~,mn] = min(abs(z3)); 

的交点被定义为(x, y(mn))

这当然是一个数值近似(因为你想要的数值方法),受我还没有探索(执行最低功能,当你需要从零远无视值)

边界条件

注意:如果您在寻找方程,请考虑对结果数据执行最小二乘逼近。