作者LPH66 (-858993460)
看板Mathematica
標題Re: [問題] 請問有關迴圈與陣列
時間Thu Nov 3 03:04:08 2011
※ 引述《harry901 (forcing to A cup)》之銘言:
: ※ 引述《sphwny (時間過的真快>"<)》之銘言:
: : 小弟這兩天才裝好mathematica
: : 這個問題已經困擾我一天了
: : 請大家幫幫忙
: : 請問要如何把陣列A(長度為10)中個每個元素
: : 一一放進 2x + 0.5x^2 = A 這個方程式中去解
: : 然後再把方程式的解存到另一個陣列中阿?
: : 我想要用For迴圈但是寫不出來...
: : 麻煩各位高手了!!
: 這應該還用不到迴圈
: A = Table[i, {i, 10}]
: B = Table[sol=FindRoot[2*x +0.5*x^2 == A[[i]], {x, 0}]; x /. sol, {i, 10}]
: ====================
: 應該還有更簡潔的寫法 不過我已經習慣使用ver5版本了
: B就是你要得答案
藉此機會推廣一下 /@ (Map) 指令和純函式
首先是 Map
f /@ {a,b,c} (或 Map[f,{a,b,c}] ) 會得到 {f[a],f[b],f[c]}
很多時候要取用一個陣列裡的內容去一一代值時這很好用
類似的東西有
@@ (Apply): f @@ {a,b,c} 或 Apply[f,{a,b,c}] 會得到 f[a,b,c]
Scan: Scan[f,{a,b,c}] 會依序做 f[a], f[b], f[c] 但不回傳結果
等等
純函式則是沒有名字的函式
直接以例子來說明吧 這是這題的做法:
(
x /. Solve[2
x+0.5
x^2 ==
#,
x])& /@ A
前半段到 & 為止是個純函式
它的參數會就是 # 所在的地方
也就是它等同於下面這個函式:
getSolution[
v_] :=
x /. Solve[2
x+0.5
x^2 ==
v,
x]
注意寫純函式時要記得標 & 標記函式到此結束
於是將這個函式 Map 到 A 上就成了把 A 的元素一一代入上面這個函式
要的結果就出來了
純函式也可以有多於一個參數 它們會被叫做 #1 #2 #3 等等
單寫 # 就是 #1
或者也可以用 Function[] 這時就不用 & 了
Function[函式本體] 即為 函式本體&
用 Function 還可以命參數名 這樣在多層純函式時就不會搞亂了
寫法是 Function[變數,本體]
Function[{變數一,變數二,...},本體]
也就是上面那個純函式也可以改寫成以下:
Function[
x /. Solve[2
x+0.5
x^2 ==
#,
x]]
Function[
v,
x /. Solve[2
x+0.5
x^2 ==
v,
x]]
Function[{
v},
x /. Solve[2
x+0.5
x^2 ==
v,
x]]
都是一樣的
這裡提的東西在 tutorial/FunctionalOperationsOverview 裡都各有細項說明
想仔細研究的可以去看看
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █
▄▄▄▄▄
▍
./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄
▎
⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▌▌
▏
ζ(▏●‵◥′●▊)Ψ ▏ █
⊿Δ ▄▄▄ ▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主義 █
▄▄▄█▄▄
◥◥|◣ ‵′ ◢/'◢◢
S.O.S 世界を大いに盛り上げるための涼宮ハルヒの団
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.137
推 harry901:XD 你剛好講到我最討厭學也覺得有點難度的部份... 11/03 03:18
推 harry901:會用到這個應該是程式複雜時 過程需要引用計算結果 11/03 03:20
→ harry901:恰好計算式不需要重複被使用時 像我現在程式那麼多 11/03 03:21
→ harry901:有一些是不需要重複使用的 導致命名的變數超多 11/03 03:21
推 harry901:剛剛才發現我用錯 應使用Solve.... 11/03 03:26
推 chrisliu0419:推 寫的很清楚! 11/03 03:58
→ LPH66:這個部份的確不好學 可是會用了之後很好用 XD 11/03 04:19
→ LPH66:我在寫東西時常常一個式子到底 裡面一堆這種東西... 11/03 04:19
→ LPH66:一個式子的好處是修參數修完只要跑一個就好 不用跑好幾個 11/03 04:20
推 oversky0:我也覺得這部份很複雜,以前看到這樣的 code 就跳過去。 11/04 11:26
推 leo80042:推~~ 11/24 03:38