收敛到2个不同的值

时间:2012-09-19 16:14:55

标签: math coffeescript numerical-methods numerical-analysis

我有一段代码,基本上使用数值逼近方法解决了2个非线性方程组。

代码:

l1 = 8
l2 = 10
x2 = 12.66
y2 = 11.928
maxError = 1e-30
maxIterations = 100

theta = 1: 0, 2: 0
theta1 = 0
theta2 = 0
i = 0
loop # Block 1
    i++
    theta1 = Math.acos (x2 - l2 * Math.cos theta2) / l1
    theta2 = Math.asin (y2 - l1 * Math.sin theta1) / l2
    break if Math.sqrt(Math.pow(theta[1] - theta1, 2) + Math.pow(theta[2] - theta2, 2)) <= maxError or i is maxIterations
    theta = 1: theta1, 2: theta2
console.log "Converged to first solution {theta1: #{theta1 * 180 / Math.PI}, theta2: #{theta2 * 180 / Math.PI}} in #{i} iterations."

theta = 1: 0, 2: 0
theta1 = 0
theta2 = 0
i = 0
loop # Block 2
    i++
    theta2 = Math.acos (x2 - l1 * Math.cos theta1) / l2
    theta1 = Math.asin (y2 - l2 * Math.sin theta2) / l1
    break if Math.sqrt(Math.pow(theta[1] - theta1, 2) + Math.pow(theta[2] - theta2, 2)) <= maxError or i is maxIterations
    theta = 1: theta1, 2: theta2
console.log "Converged to second solution {theta1: #{theta1 * 180 / Math.PI}, theta2: #{theta2 * 180 / Math.PI}} in #{i} iterations."

输出:

Converged to first solution {theta1: 60.004606260047474, theta2: 29.99652810779697} in 34 iterations.
Converged to second solution {theta1: 26.584939314539064, theta2: 56.593017466789554} in 35 iterations.

2个等式是:

8cos(θ₁) + 10cos(θ₂) = 12.66
8sin(θ₁) + 10sin(θ₂) = 11.928

在两个块( Block 1 Block 2 )中,θ₁θ₂最初都设置为0 。然后在一个等式中替换一个θ以找到另一个θ的值。然后在另一个等式中替换该第二θ以找到第一θ的值。这是以递归方式完成的,汇总在θ₁θ₂

在第一个区块中,我首先将θ₂替换为0并找到θ₁的值。反之亦然。第二块。

现在我的问题是,当块之间的唯一差异是起始变量时,为什么我最终得到2种不同的解决方案?

PS :我确实理解对于给定的方程组会有2种不同的解。我不明白是因为我使用不同的起始变量而得出2种不同解决方案的原因。

PPS :我尝试使用θ₁θ₂的不同初始值而不是0开始。这并没有改变任何事情。

2 个答案:

答案 0 :(得分:3)

如果以下2个表达式不相同,
        而不是acos(x2 - l2 * Math.cos theta2)/ l1,                       acos((x2 - l2 * Math.cos theta2)/ l1)看起来正确。

也适用于其他3个表达。

答案 1 :(得分:0)

您可以将方法分析为一种定点方法。定点方法就是

v_{n+1} = f(v_{n})

在你的情况下

v = (θ₁,θ₂)

你重新安排了你的等式

f(v) = (acos(x₂ - l₂*cos(θ₂))/l₁, acos(y₂ - l₁*cos(θ₁))/l₂)

......或多或少。当您在第二次计算时使用已更新的变量时,它与您从另一个v0开始时的情况相同,其中第二个计算变量是“前一步”另一个。在第一种情况下,您的起始位置为(0,acos(y₂ - l₁)/l₂),而起始位置为(acos(x₂ - l₂)/l₁, 0)。尽管你在post-post-scriptum中所说的,但它是一个融合到具有不同初始值的不同根的情况。

很难说明为什么会这样。根的吸引力盆地可能有一个奇怪的边界,如维基百科中的Newton-Raphson页面所示。您可以尝试绘制盆地,在(θ1,θ2)域中选择许多初始起点,并根据它们汇聚的位置绘制不同颜色的像素。