[心得] 求解後代值 (/. //. -> :> :->)

作者: LPH66 (-6.2598534e+18f)   2014-08-13 23:56:43
看板上好像這個問題變成 FAQ 了 時不時就會有一樣的問題出現 XD
(把一些運算子關鍵字放標題這樣應該比較好搜尋)
=====
很多人會問說我得到某個答案要怎麼代值進去
這裡我們要回到究竟「代值」是個什麼樣的行為
單講代值其實很容易誤以為只跟值有關
但其實要代進哪個變數裡也是一個關鍵
你不跟程式講他哪知道你要代進什麼變數裡去...
所以 Mathematica 裡定義了一個運算子 -> (函式名 Rule)
A -> xx 就表示「A 要代入 xx 值」這樣的規則 (所以才叫 Rule)
而要表示「依照這個規則把這式子進行代換」則是 Replace / ReplaceAll 所做的事
Replace 只限定在全式的代換, 也就是規則的左邊要完全對到全式才會換
ReplaceAll 則是深入到式子的內部, 如果發現某個部份對到了規則就會代換
由於這後一種代換非常常用所以有另一個運算子 /. 代表
所以我們常會看到 x^2 /. x -> 42 這種例子來講解代值
也因為這個關係, 許多解值的函式 (例如 Solve 等) 所得到的結果都是這種型式
這樣我們便可以方便的用 /. 代到別的式子裡去運算
這一系列還有一個變種叫 ReplaceRepeated
顧名思義就是一直代換到沒得代為止
由於也很常用所以也有一個運算子 //. 代表
這邊就表過不提
(Replace 系列有一個進階用法是用模板代換
這需要另一篇文章講所以這裡也先跳過
不過這種用法配上 ReplaceRepeated 可以得到很多強力的效果 XD)
=====
另外一種代值的狀況是我們有很多個值想一個一個代進去
乍看之下似乎只有類似
x^2 /. {{x -> 4}, {x -> 8}, {x -> 15}, {x -> 16}, {x -> 23}, {x -> 42}}
這種方法可以指定多值代換
但其實這個地方有一個 Mathematica 設計上的巧思
大多數的運算在參數是 List 的時候都會自動取對應的值進行計算
例如 {1, 2, 3} + {4, 5, 6} 會得到 {5, 7, 9}
這其實是函式名的一個 Attribute 叫做 Listable
有這個 Attribute 的函式在計算時都會自動這樣攤開
沒有這個 Attribute 的函式 (例如 ==) 要這樣做要在外面加一層 Thread[]
所以像是 Thread[{a, b, c} == {1, 2, 3}] 才會變成 {a == 1, b == 2, c == 3}
(其實這兩者還有一個差別
Listable 函式的自動攤開會攤到底
因為攤一層之後下面也是 List 所以也會繼續攤
而 Thread[] 只會攤一層而已)
好在大部份的運算 (加減乘除次方等等) 都有這個 Attribute
因此在這個地方其實我們可以直接
x^2 /. x -> {4, 8, 15, 16, 23, 42}
這樣一次代多個值
具有 Listable 的函式就會自己一個一個拆開算
也就是說, 即使某次計算結果是一個 List
也是可以用 x^2 /. x -> % 這種方式直接代入多個結果的
多個變數也沒有問題
x + y /. {x -> {1, 2, 3}, y -> {4, 5, 6}}
也能得出 {5, 7, 9}
=====
標題上面最後兩個運算子是同一個符號 :> (RuleDelayed)
(顯示成一個字時會變成 :-> 這個樣子, 要直接輸入的話請打 :> 兩個字)
它是 -> 的變種
這東西跟 := (SetDelayed) 有個共同的概念就是名字後面的 Delayed
大家應該都知道 = (Set) 跟 := (SetDelayed) 的差別
:= 定義的東西右邊會先保持原狀, 直到求值時才計算
-> 跟 :> 的差別也是一樣的
有的時候有些式子需要原樣代入之後才計算
這種時候就可以使用 :> 達成效果
例如 {x, x, x} /. x :> RandomReal[]
就會先把 RandomReal[] 原樣代入 x 後才計算, 因此會得到三個不同亂數
如果是 {x, x, x} /. x -> RandomReal[]
則後面的 Rule 會先整理右邊得到一個亂數後再代入, 所以會得到同樣的亂數三次
雖然不常用但有時會需要用到它才能達成某些目的
作者: leo80042 (嗯嗯啊啊去洗澡)   2014-08-14 02:12:00
作者: pedestrianA (只是個路人)   2014-08-14 03:14:00
正好有這方面的問題 推
作者: Serenede (Serenede)   2014-08-14 17:41:00
作者: louis925 (稚空)   2014-08-14 18:26:00
推,原來還可以這樣用啊!
作者: willreturn ( )   2014-08-15 15:15:00
作者: GirlInBlack ( 小蛋 )   2014-08-16 22:40:00
實用推!雖然月經文應該還是會繼續出現 :P
作者: jurian0101 (Hysterisis)   2014-08-24 04:05:00
推,本版奠基之作
作者: alfadick (悟道修行者)   2014-08-31 09:56:00
有空寫Hold, Evaluate, Unevalued 這些的比較!!及混合應用

Links booklink

Contact Us: admin [ a t ] ucptt.com