[心得] Mathematica計算定點到曲線距離
譬如有個曲線是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
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
02/28 08:04, 2F
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章