2012-09-19 74 views
1

我有一段代碼,基本上使用數值近似方法解決了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)

回答

3

如果下列2個表達式是不一樣的,
/L1, ACOS((X2 - L2 * Math.cos theta2)/ L1)看起來正確。

也適用於其他3個表達式。

+0

你是對的,表達式不一樣:acos不是線性的。 – phant0m

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)的第二位。儘管你在你的後劇本中說了什麼,但這是一個融合了不同初始值的不同根源的例子。

很難說出爲什麼會發生這種情況。根的吸引力盆地可能有一個奇怪的邊界,如維基百科中的Newton-Raphson頁所示。您可以嘗試繪製盆地圖,在(θ1,θ2)域中選擇許多初始起點,並根據它們會聚到的位置繪製不同顏色的像素。