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

楼主: 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