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

看板Mathematica作者 (1597463007)時間10年前 (2014/08/13 23:56), 編輯推噓8(801)
留言9則, 8人參與, 最新討論串1/1
看板上好像這個問題變成 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 會先整理右邊得到一個亂數後再代入, 所以會得到同樣的亂數三次 雖然不常用但有時會需要用到它才能達成某些目的 -- LPH [acronym] = Let Program Heal us -- New Uncyclopedian Dictionary, Minmei Publishing Co. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85 ※ 文章網址: http://www.ptt.cc/bbs/Mathematica/M.1407945406.A.402.html

08/14 02:12, , 1F
08/14 02:12, 1F

08/14 03:14, , 2F
正好有這方面的問題 推
08/14 03:14, 2F

08/14 17:41, , 3F
08/14 17:41, 3F

08/14 18:26, , 4F
推,原來還可以這樣用啊!
08/14 18:26, 4F

08/15 15:15, , 5F
08/15 15:15, 5F

08/16 22:40, , 6F
實用推!雖然月經文應該還是會繼續出現 :P
08/16 22:40, 6F

08/24 04:05, , 7F
推,本版奠基之作
08/24 04:05, 7F

08/31 09:56, , 8F
有空寫Hold, Evaluate, Unevalued 這些的比較!!
08/31 09:56, 8F

08/31 09:57, , 9F
及混合應用
08/31 09:57, 9F
文章代碼(AID): #1Jwug-G2 (Mathematica)
文章代碼(AID): #1Jwug-G2 (Mathematica)