1

我试图以图形方式找到两个曲面和 xy 平面之间的交点。(表面 z1 与 xy 平面的交点以及 z2 与 xy 平面的交点)

我已经创建了代表曲面 z1 = 3+x+y 和 z2 = 4-2x-4y 的数组以及使用网格网格的 xy 平面的 z3。到处看,似乎我可以用来查找数组之间交集的唯一命令是 intersect(A,B) 命令,其中 A 和 B 是数组。但是,当我输入 intersect(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');
4

2 回答 2

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. 您可以使用它来索引 X 和 Y 的相应网格网格数组,以找到相交的坐标。

于 2012-10-25T03:09:57.427 回答
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))

这当然是一个数值近似(因为你想要一个数值方法),受制于我没有探索过的边界条件(在执行最小函数时,你需要忽略远离零的值)

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

于 2012-10-25T13:44:10.850 回答