我试图以图形方式找到两个表面和x-y平面之间的交点。 (表面z1与x-y平面的交点和交叉点z2与x-y平面的交点)
我使用meshgrid创建了表示表面z1 = 3 + x + y和z2 = 4-2x-4y以及x-y平面的z3的数组。在任何地方寻找,似乎我可以用来找到数组之间交叉点的唯一命令是交叉(A,B)命令,其中A和B是数组。但是,当我输入intersect(z1,z3)时,我得到错误“A和B必须是向量,或者必须指定'rows'。”当我尝试交叉(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 :(得分: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;
只要Z1和Z2之间的差异相对于near_zero
较小, tol
将是一个逻辑数组。您可以使用它来索引X和Y的相应meshgrid数组,以找到交集的坐标。
答案 1 :(得分: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))
。
这当然是一个数值近似(因为你想要一个数值方法),受限于我没有探索的边界条件(你需要在执行最小函数时忽略远离零的值)
注意:如果您正在寻找方程式,请考虑对结果数据执行最小二乘近似。