[心得] Mathematica計算定點到曲線距離

看板Mathematica作者 (悟道修行者)時間10年前 (2014/02/27 23:44), 編輯推噓2(200)
留言2則, 1人參與, 最新討論串1/1
譬如有個曲線是f(x,y)=0,(它可以是拋物線、圓、甚至亂七八糟的圖形) 又有一個定點是(xo,y0)。想要計算點到f(x,y)=0的距離(最小距離), 我剛才發現了一個新方法。 至於Mathematica有沒有現成的函數, 我還沒讀完virtual book,也還不知道,有請板上朋友解說這部分了。 因為這個新方法有用到特別的思路來解決問題,所以特別把思路說明一下。 我這篇的po文要旨,也只是想分享思路、順便記錄而已。 我的方法是用符號邏輯著手, 給一定點A(x0,y0),想求它到曲線f(x,y)=0的最小距離, 考慮A到所有f(x,y)=0上的點的距離,把這∞個距離想成一個集合, 然後求其最小值。可是mathematica似乎無法對集合求最小值。 並且"這∞個距離想成一個集合"說歸說,要怎麼寫? 如果是數學,寫成 集合K={d | 存在x,y, f(x,y)=0且d=點到圖形距離} 是可以 (注意這裡是存在(there exists),不是對於所有(for all)) 問題是mathematica能不能看得懂,能不能轉成它的指令的問題。 我認為有機會,但不保證。譬如曲線是y^13 == 4 x^2 + 5 x^2 + x,定點是(21,6) Reduce[Exists[{x, y}, y^13 == 4 x^2 + 5 x^2 + x && Sqrt[(x - 21)^2 + (y - 6)^2] == d], d] 跑很久跑不出來。我猜可能是因為,d不是單純的"區間"、或者是好幾個區間的聯集, 它可能錯綜複雜,是支離破碎的一堆實數。mathematica給不出形式來。 (當然我的example, 好像可以用數學理論證看看d是不是區間@@, 但太麻煩了) ---------- 總之,所以上述方法不行。 修正一下。 我的想法還是量詞語句。 存在一個d_min, 對於所有x,y, f(x,y)=0且 點到圖形的距離>=d_min 其中f怎麼定義,以及定點A坐標都是寫死的, 這一整個是一個命題。沒有變數的命題。(這很重要,尤其是寫Mathematica時要分清) 一看到"存在",於是我想到用FindInstace函數。 可是我不小心犯了個錯,FindInstance是隨機給出一個滿足量詞語句的值, 假如正確答案d_min是10,它可能給出d_min=10 或 =8.3, 7.6, -99,... 無用武之地。 因此,再修正。打算再用Reduce,因為Reduce可以給出精準的範圍。 但要用Reduce,你不可以對命題apply,你只能apply在命題函數上。 因此這邊非常技巧、非常巧思的定義一個命題函數: P(d):="對於所有x,y, f(x,y)=0且 點到圖形的距離>=d" 有了這個命題函數,就可以用Reduce。 N[Reduce[ForAll[{x, y}, y^13 == 4 x^2 + 5 x^2 + x, Sqrt[(x - 21)^2 + (y - 6)^2] >= dMin]], 10] 結果:dMin <= 4.1072737634953408838 perfect. 一秒就出來。 至於為什麼剛才說的那種集合方式reduce不出來,而後者可以, 我覺得可能涉及MMA它背後的設計方式。不過直觀上似也可以感覺到, 後者成功機率可能比前者來得高。 註1: 有趣的是,我查了help,用Minimize寫法,求不出來,跑很久很久很久 Minimize[{Sqrt[(x - 21)^2 + (y - 6)^2], y^13 == 4 x^2 + 5 x^2 + x}, {x, y}] -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.58.203 ※ 編輯: alfadick 來自: 220.136.58.203 (02/27 23:47) ※ 編輯: alfadick 來自: 220.136.58.203 (02/27 23:48)

02/27 23:52, , 1F
只要數值解的話用FindMinimum就好了,Minimize會找解析解
02/27 23:52, 1F
N[FindMinimum[{Sqrt[(x - 21)^2 + (y - 6)^2], y^13 == 4 x^2 + 5 x^2 + x}, {x, y}], 20] 搞定了!可是只有到小數點第五位?(我N用錯?) {4.10727, {x -> 21.0567, y -> 1.89312}} ※ 編輯: alfadick 來自: 220.136.58.203 (02/28 00:03)

02/28 08:04, , 2F
最後面加個FindMinimum[...,...,WorkingPrecision -> 30]看看
02/28 08:04, 2F
文章代碼(AID): #1J3rruXw (Mathematica)
文章代碼(AID): #1J3rruXw (Mathematica)