【发布时间】:2020-11-20 22:57:33
【问题描述】:
问题说明: 我在两个不同的时间有 (x,y,z) 坐标的点。为方便起见,可以将它们想象为沿倒置抛物面表面的不规则间隔点。 抛物面有一些最小的厚度。随着时间的推移,抛物面会稍微改变形状(就像气球膨胀一样),当它这样做时,所有的点都会移动。 通过减去time2-time1的坐标,可以得到每个点的位移向量。
重要的是要注意(我怀疑这可能是问题的根源),在第一个时间点,x 和 y 坐标范围从 0 到 2000,z 坐标都在一个更窄的范围内 -比如说 350 到 450。在变形过程中,每个点都有位移的 x 分量、y 分量和 z 分量。 x 和 y 分量很小(最多约 50),而 z 分量最大(在中心附近可达 400,在边缘附近更小)。
在每个点的位置使用加权移动最小二乘法,我试图根据该点的原始 x,y,z 坐标将位移分量拟合到二次多项式曲面:例如。 的x分量
displacement = ax^2 + bxy + cx + dy^2.. + hz^2 + iz + j
我在 MATLAB 中使用 lsqr 函数,就像这样,在每个时间间隔循环遍历每个点:
Ux = displacements{k,1}(:,1);
Cx = lsqr((adjust_B_matrix'*W*adjust_B_matrix),(adjust_B_matrix'*W*Ux),1e-7,10000);
W 是权重矩阵,adjust_B_matrix 是时间 1 时所有 (x,y,z) 坐标的矩阵,经过移动,它们都以我尝试的点为中心拟合函数。
出了什么问题? 它只是不起作用——一旦我有了这些功能,它们就会重新以点的实际坐标为中心。 但是,一旦我通过将时间 1 的坐标插入现在发现的函数中来绘制结果点(初始点 x + 位移 x,初始点 + 位移,初始点 z + 位移z),它只会吐出一个看起来就像表面一样的表面在时间 1。
可能出了什么问题?我尝试过的事情:
- 这不是代码本身的问题 - 我使用点网格生成了“假”数据,它运行良好。预测的位置与实际坐标叠加,我能够恢复我开始使用的功能。但在我的试用示例中,我使用了从 0 到 5 的 x、y、z,均匀分布。
- 全局拟合有效(但我需要局部拟合...)。 我尝试了 MATLAB 的曲线拟合工具箱,只是尝试将其中一个位移拟合到全局的 x 和 y 坐标。效果很好。
- 我认为我不应该有奇异矩阵问题,因为我在计算中使用了一个大半径(大约 75-80)点,在 3D 空间中有些分散。
怀疑: 我认为这与初始(x,y,z)坐标分布不均匀有关,但我不知道为什么或如何解决这个问题,甚至我可以使用什么方法。
如果您读到这里,非常感谢。任何建议将不胜感激。
图供参考: 绿色 = 时间 2 的预测点。大部分与红色重叠,即时间 1 的点的实际坐标。 蓝色是时间 2 点的正确坐标(如果一切正常,这是绿色的应该所在的位置)。
更新的文件链接: http://a.tmp.ninja/eWfkNmFZyTFk.zip 内容 - 代码、示例数据(请加载 .mat 文件)。
【问题讨论】:
-
欢迎堆栈溢出!您显然已经努力描述了这个棘手的问题,但很难真正理解。如果您可以共享我们可以与示例数据一起运行的代码,我认为您更有可能获得帮助(请参阅minimal reproducible example)。我很欣赏这很棘手,但对于这类问题,我认为这将是获得有用答案的最佳方式。祝你好运!
-
感谢您的回复和编辑!我担心代码太长(我是初学者,它显示......)但我会尝试清理它并尽快发布。再次感谢!
标签: matlab least-squares