我有一段代码,基本上使用数值逼近方法解决了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
开始。这并没有改变任何事情。
答案 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)域中选择许多初始起点,并根据它们汇聚的位置绘制不同颜色的像素。