【问题标题】:Solving a non-polynomial equation numerically数值求解非多项式方程
【发布时间】:2013-05-02 21:23:30
【问题描述】:

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

我的目标是求解具有q1q2q3 角度的三个非多项式方程组。这些变量代表我的工业机械手中的关节角度,我想要实现的是解决这个模型的逆运动学。我的方程组如下所示: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 等效。

感谢您的帮助。

【问题讨论】:

    标签: matlab equation numerical polynomial-math


    【解决方案1】:

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

    你会遇到两种问题:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多