我有一段代碼,基本上使用數值近似方法解決了2個非線性方程組的系統。收斂到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
在兩個塊(塊1和塊2), θ₁
和θ₂
最初都設置爲0
。然後在其中一個方程中代入一個θ來找出另一個θ的值。然後這個第二個θ代入另一個方程中,找到第一個θ的值。這是遞歸地完成的,收斂在θ₁
和θ₂
。
在第一個塊中,我將θ₂
替換爲0
並找到θ₁
的值。反之亦然在第二塊。
現在我的問題是,爲什麼最終有兩種不同的解決方案時,塊之間的唯一區別是起始變量?
PS:我明白,對於給定的方程組將有2個不同的解。我不明白的是,僅僅因爲我使用不同的起始變量而得出這兩種不同解決方案的原因。
PPS:我曾嘗試用不同的初始值開始爲θ₁
和θ₂
而不是0
。這並沒有改變任何事情。而不是ACOS(X2 - L2 * Math.cos theta2)
你是對的,表達式不一樣:acos不是線性的。 – phant0m