Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:计算矢量与解析曲面的交点_Matlab_Vector_Iteration_Intersection_Surface - Fatal编程技术网

Matlab:计算矢量与解析曲面的交点

Matlab:计算矢量与解析曲面的交点,matlab,vector,iteration,intersection,surface,Matlab,Vector,Iteration,Intersection,Surface,我想计算R^3中向量的交点,由 p+alpha*n,其中x是空间向量,n是另一个向量,alpha是要确定的标量 曲面由公式以解析形式给出 f(x,y)=[x,y,z(x,y)],其中z(x,y)可以是任意非线性曲面描述 我设置了一个线性化: [n1 n2 n3 ] (d_alpha)= [p1 + alpha*n1 - x] [-1 0 -dz(x,y)/dx] (d_x) = [p2 + alpha*n2 - y] [ 0 -1 -dz(x,y)/dx] (

我想计算R^3中向量的交点,由 p+alpha*n,其中x是空间向量,n是另一个向量,alpha是要确定的标量

曲面由公式以解析形式给出

f(x,y)=[x,y,z(x,y)],其中z(x,y)可以是任意非线性曲面描述

我设置了一个线性化:

 [n1 n2   n3        ] (d_alpha)= [p1 + alpha*n1 - x]
 [-1  0  -dz(x,y)/dx] (d_x)    = [p2 + alpha*n2 - y]
 [ 0 -1  -dz(x,y)/dx] (d_y)    = [p3 + alpha*n3 - z(x,y)]
并搜索以迭代alpha、x和y的起始值

然而,我似乎无法在这里收敛。知道我的错在哪里吗


提前感谢

您可以将公式写成

x_line(a) = p1 + a * n1
y_line(a) = p2 + a * n2 
z_line(a) = p3 + a * n3
z_plane(x, y) = fun(x, y)
假设您的问题有唯一的解决方案,则平面上方直线沿z方向
dz
的高度作为
a
的函数为

dz(a) = z_line(a) - fun(x_line(a), y_line(a))
      = p3 + a * n3 - fun(p1 + a * n1, p2 + a * n2)
要找到直线与平面的交点,只需找到
a
的值,其中
dz
为零。这可以在Matlab中使用以下类似工具完成:

其中
a0
a
的一些(任意)起始猜测。
你们可能想读一点关于光线追踪的知识,我想你们可能会在网上找到一些大学的入门笔记。这是一个非常标准的问题,用于寻找光线与曲面透镜或抛物面镜的交点。

矢量不相交,它没有位置,只有大小和方向。你的意思是有一条与平面相交的线,还是要将向量投影到平面上?我的意思是与从p沿nIs方向发出的线相交。这条线可能与平面相交不止一次?不,这被假定为排除在外。我猜你可以参数化这条线并求解它根据。您应该能够使用任何matlab方程求解器(例如
fzero
solve
)求解方程。我想到的另一件事是旋转和平移曲面,使线沿着某个轴(如x轴)左右移动。这将为您提供一个其他变量为0的函数。感谢您的努力。我试着这样实现它:p=[1;1;1];n=[0;0;-1];dz=@(a)p(3)+a*n(3)-测试项目([p(1)+a*n(1)、(2)+a*n(2)]);a_相交=f0(dz,0.01)
dz = @(a) = p3 + a * n3 - fun(p1 + a * n1, p2 + a * n2);
a_intersect = fzero(dz, a0);