0

我的方程式有问题,我尝试使用 MATLAB 和 Symbolic Toolbox 进行数值求解。我在 MATLAB 帮助的几个源页面之后,选择了一些技巧并尝试了其中的大部分,但仍然没有令人满意的结果。

q1我的目标是用、q2q3角度求解三个非多项式方程组。这些变量代表我的工业机械手中的关节角度,我想要实现的是解决这个模型的逆运动学。我的方程组如下所示:http: //imgur.com/bU6XjNP

我正在解决它

numeric::solve([z1,z2,z3], [q1=x1..x2,q2=x3..x4,q3=x5..x6], MultiSolutions)

xn根据我的需要更改常量。然而我仍然得到一些奇怪的结果,q1var 偏离了大约 0.1 rad,q2偏离q3了 ~0.01 rad。我对数值求解没有太多经验,所以我只需要信息,它应该看起来像这样吗?

如果不是,你建议我接下来应该采取什么有效的选择?也许将这个方程转换为多项式,也许使用不同的工具箱?

或者,如果尝试在 Matlab 中执行此操作,在使用 solve() 时如何限制您的解决方案?我正在考虑与 Symbolic Toolbox'sassume()assumeAlso.

我会很感激你的帮助。

4

1 回答 1

1

非线性方程组的数值解一般被认为是一个迭代最小化过程,涉及方程左右差范数的最小化(即求全局最小值)。例如fsolve基本上使用牛顿迭代。这些方法执行“确定性”优化:它们从初始猜测开始,然后基本上根据梯度的相反方向在未知空间中移动,直到找不到解决方案。

然后你有两种问题:

局部最小值:迭代的停止规则与泛函的梯度有关。当梯度变小时,迭代停止。但是除了所需的全局最小值之外,梯度可能会随着局部最小值而变小。当最初的猜测与实际解决方案相差甚远时,您就会陷入错误的解决方案。

病态:未知数的大变化可以反映到数据的大变化中。因此,数据上的小数值误差(例如,机器舍入)可能导致未知数的较大变化。

由于上述问题,您的数值算法找到的解决方案可能与实际解决方案有所不同(甚至相关)。

我建议您通过选择一个起始猜测来进行一致性测试,例如在使用时fsolve,非常接近实际解决方案,并验证您的最终结果是否准确。然后你会发现,通过让最初的猜测离实际解决方案更远,你的结果很可能会出现一些(甚至是很大的)错误。当然,误差的实体取决于方程组的性质。在一些幸运的情况下,这些错误也可以保持非常小。

于 2013-05-05T20:31:33.153 回答