主 題: 一道數學問題:求到n個點距離之和最小的位置。 mathe來看看;)
作 者: rickone (RickOne)
等 級:
信 譽 值: 100
所屬論壇: 專題開發 資料結構與演算法
問題點數: 50
回複次數: 21
發表時間: 2005-2-24 19:26:57
程式輸入n個點的座標形式(xi,yi)[i=1 to n]
輸出一個點的位置(x,y)
使得S=∑Sqrt((x-xi)^2+(y-yi)^2)[i=1 to n]最小,即這個點到n個已知點的距離之和最小。
Top
回複人:mathe() ( 一星(中級)) 信譽:110 2005-2-25 10:44:27 得分:0
?
可以用迭代法
任取(x,y)=(u,v)
比如可以取u=(x1+...+xn)/n,v=(y1+...+yn)/n
然後在每一步,計算:
A=Sum{(v-yi)^2/((u-xi)^2+(v-yi)^2)^(3/2)}
B=Sum{(u-xi)(v-yi)/((u-xi)^2+(v-yi)^2)^(3/2)}
C=Sum{(u-xi)^2/((u-xi)^2+(v-yi)^2)^(3/2)}
du=(C*u-B*v)/(A*C-B*B) dv=(A*v-B*u)/(A*C-B*B)
Let u-=du, v-=dv
一直計算下去,知道du, dv充分小。
Top
Top
回複人:mathe() ( 一星(中級)) 信譽:110 2005-2-25 13:22:25 得分:0
?
迭代公式寫錯了
應該是B=-Sum{(u-xi)(v-yi)/((u-xi)^2+(v-yi)^2)^(3/2)}
du=(C*fu-B*fv)/(A*C-B*B) dv=(A*fv-B*fu)/(A*C-B*B)
其中fu=Sum{(u-xi)/sqrt((u-xi)^2+(v-yi)^2)}
fv=Sum{(v-xi)/sqrt((u-xi)^2+(v-yi)^2)}
其實就是想用牛頓迭代法求fu=0,fv=0
實際計算中,不知道為什麼,很快就會出現S=Sum{sqrt((u-xi)^2+(v-yi)^2)}變大
當出現這種情況,我們可以讓迭代中止,這時誤差應該很小了,
因為函數S是凸函數
Top
回複人:mathe() ( 一星(中級)) 信譽:110 2005-2-25 13:30:35 得分:0
?
剛才發現一個問題,我們還需要檢驗一些特殊的解:
x=xi,y=yi;
我遇上一組解,迭代結果不收斂
Source points:
0.840188,0.394383
0.783099,0.798440
0.911647,0.197551
0.335223,0.768230
0.277775,0.553970
0.477397,0.628871
0.364784,0.513401
0.952230,0.916195
0.635712,0.717297
0.141603,0.606969
結果發現,最佳解幾乎正好在(0.477397,0.628871)處,就是第四組數
Top
回複人:happy__888([顧問團]尋開心) ( 兩星(中級)) 信譽:124 2005-2-25 14:14:32 得分:0
?
用這種辦法需要理論上證明,距離和的運算式上的凸點分布和x,y分量之間的關係
極值點全域唯一還是不唯一是影響到迭代結果的
有可能會陷入局部最優點而達不到全域最優點的
Top
回複人:mathe() ( 一星(中級)) 信譽:110 2005-2-25 15:34:19 得分:0
?
函數S是凸函數!!!