我的方程有问题,我尝试使用MATLAB和Symbolic Toolbox以数字方式求解。我正在阅读MATLAB帮助的几个源页面,选择了一些技巧并尝试了大部分技巧,仍然没有令人满意的结果。
我的目标是用q1
,q2
和q3
角度求解三个非多项式方程组。这些变量代表了我的工业机械手中的关节角度,我想要实现的是解决该模型的逆运动学。我的方程组如下所示: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,q2
和q3
关闭约0.01 rad。我对数值求解没有多少经验,所以我只需要信息,它应该看起来像那样吗?
如果没有,你建议我接下来应该选择什么样的有效选项?也许将这个等式转换为多项式,也许使用不同的工具箱?
或者,如果尝试在Matlab中执行此操作,在使用solve()时如何限制解决方案?我想的是等同于符号工具箱的assume()
和assumeAlso
。
我很感激你的帮助。
答案 0 :(得分:1)
非线性方程系统的数值解通常被认为是一个迭代最小化过程,涉及左右两侧差异范数的最小化(即找到全局最小值)。等式。例如,fsolve基本上使用牛顿迭代。这些方法执行“确定性”优化:它们从初始猜测开始,然后基本上根据梯度的相反方向在未知空间中移动,直到找不到解。
然后你有两种问题:
局部最小值:迭代的停止规则与功能的渐变有关。当梯度变小时,停止迭代。但是除了期望的全局之外,梯度对应于局部最小值可以变小。当初始猜测远离实际解决方案时,那么你就陷入了错误的解决方案。
病态调节:未知数的大变化可以反映到数据的大变化中。因此,数据上的小数值误差(例如,机器舍入)可能导致未知数的大变化。
由于上述问题,您的数值算法找到的解决方案可能与实际算法不同(甚至相关)。
我建议您通过选择开始猜测进行一致性测试,例如在使用fsolve
时,非常接近实际解决方案并验证您的最终结果是否准确。然后你会发现,通过使初始猜测离实际解决方案更远,你的结果可能会显示一些(甚至很大的)错误。当然,错误的实体取决于方程组的性质。在一些幸运的情况下,这些错误也可能非常小。