2013-05-02 55 views
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不断解决它。然而,我仍然得到一些奇怪的结果,q1 var关闭大约0.1 rad,q2q3关闭大约0.01 rad。我没有太多的数字解决经验,所以我只需要信息,应该看起来像这样?

而且,如果不是,你建议我应该采取什么有效的选择?也许把这个方程转换成多项式,也许使用不同的工具箱?或者,如果试图在Matlab中做到这一点,如何在使用solve()时限制您的解决方案?我正在考虑与Symbolic Toolbox的assume()assumeAlso等效。

我会很感激您的帮助。

回答

1

非线性方程的系统的数值解通常取为涉及方程的左手和右手边的差值的范数的最小化(即,找到全局最小值)的迭代最小化过程。例如,fsolve实质上使用牛顿迭代。这些方法执行“确定性”优化:它们从初始猜测开始,然后基本上根据梯度的相反方向移动到未知空间中,直到找不到解。

然后,您有两种问题:

局部极小:迭代的停止规则与功能的梯度。当梯度变小时,迭代停止。但是,除了期望的全球范围之外,梯度可以根据当地最小值变小。当最初的猜测与实际的解决方案相差甚远时,你就会陷入一种错误的解决方案。

病情调整:未知数的大变化可以反映到数据的大变化中。因此,数据上的小数字错误(例如机器舍入)会导致未知数的巨大变化。

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

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