2011-04-21 30 views
4

現在我有代碼,其中一些函數func以我想要的方式執行,當我在其定義中給出特定參數時(所以我使它func[x1_,x2_]:=...然後我使它func[x1_,x2_,x3_]:=...沒有改變任何東西,它的工作方式,我希望它)。有沒有辦法自動替換我爲這個函數指定的參數?如何在Mathematica中有一個可變參數列表

UPDATE:

我沒有找出問題的代碼還沒有,但這裏的代碼沒有做什麼,我想:

(* Clear all stuff each time before running, just to be safe! *) 
\ 
Clear["Global`*"] 

data = {{238.2, 0.049}, {246.8, 0.055}, {255.8, 0.059}, {267.5, 
    0.063}, {280.5, 0.063}, {294.3, 0.066}, {307.7, 0.069}, {318.2, 
    0.069}}; 
errors = {{x1, 0.004}, {x2, 0.005}}; 

getX[x1_, x2_] := 1/x2^2 

getY[x__] = 
Evaluate[Simplify[ 
    Sqrt[Sum[(D[getX[x], errors[[i]][[1]]] errors[[i]][[2]])^2, {i, 
     Length[errors]}]]]] 

map[action_, list_] := action @@@ list 

y = map[getY, data]; 
y 

getY[2, 3] 

這個代碼在這裏所做的:(y的給{67.9989, 48.0841, 38.9524, 31.994, 31.994, 27.8265, 24.3525, 24.3525}

(* Clear all stuff each time before running, just to be safe! *) \ Clear["Global`*"] 

data = {{238.2, 0.049}, {246.8, 
0.055}, {255.8, 0.059}, {267.5, 
    0.063}, {280.5, 0.063}, {294.3, 0.066}, {307.7, 0.069}, {318.2, 
    0.069}}; errors = {{x2, 0.004}, {x1, 0.005}}; 

getX[x1_, x2_] := 1/x2^2 

getY[x1_, x2_] := Evaluate[Simplify[ Sqrt[Sum[(D[getX[x1, x2], errors[[i]][[1]]] 
     errors[[i]][[2]])^2, {i, Length[errors]}]]]] 

map[action_, list_] := action @@@ list 

y = map[getY, data]; y 

getY[2, 3] 

更新2:

我的數學:

我打算採取getX函數的所有的偏導數的平方之和的平方根。因此getY函數的主體。然後我想評估該表達式的不同值x1x2。因此我有getY的論據。

+0

問題出在'getY'上。因爲'getX'只能「理解」兩個變量,'getY'中的表達式'getX [x]'會有問題。因此,您需要定義將getY變量應用於兩個以上變量時的期望值,然後確定getX必須扮演什麼角色。例如,給定列表,「{a,b,c}」是依賴於列表中連續項的總和中的每一項,也就是說,如果你在「{{a,b},{b,c} }'? – rcollyer 2011-04-21 17:17:08

+0

@ rcollyer每個術語獨立於連續的術語。我不確定「將getY應用於2個以上的變量」是什麼意思? – wrongusername 2011-04-21 17:24:08

+0

我認爲如果你發佈數學,它會容易得多。 – 2011-04-21 17:24:12

回答

3

好問題是,在第一個版本,用的參數明顯的編號,你已經使用評估,以評估的右手邊。當參數數量可變時,您不能這樣做,因爲評估者不知道要使用哪個簽名getX

因此,解決辦法是用下面的更換getY

getY[x__] := (Simplify[ 
    Sqrt[(D[getX @@ 
      errors[[1 ;; Length[{x}], 1]], {errors[[All, 1]]}]. 
     errors[[All, 2]])^2]]) /. 
    Thread[errors[[1 ;; Length[{x}], 1]] -> {x}] 

這將首先使用變量從完全一樣多,你在getY的論點提供errors列表,計算導象徵,然後執行Dot,而不是Sum這更快。然後輸出將是相同的。

請注意,在您的兩個版本的代碼中,errors具有不同的值。

或者,你可以使用Derivative像這樣:

getY2[x__] := 
Abs[(Derivative[##][getX][x] & @@@ 
    IdentityMatrix[Length[{x}]].errors[[All, 2]])] 

使用它給出了相同的結果。

+0

非常感謝您的解決方案!是否有一些文件解釋你使用的各種符號? 「 – wrongusername 2011-04-21 17:40:15

+0

」不知道要使用哪個getX簽名「,因此在給定數字值之前,它將保持未評估狀態。在這一點上,缺少任何變量,衍生物爲0. – rcollyer 2011-04-21 17:49:25

+2

@wrongusername Mathematica附帶完整的可編輯文檔。選擇您要查找的符號,然後使用菜單幫助>「查找選定的功能」。例如'@@'和'@@@'都會引導你到'Apply'。 '&'是'Function'的快捷方式,##是'SlotSequence'。 ';;'是'Span'。使用這些符號編寫的Mathematica代碼有時被稱爲「符碼」。我個人認爲,很有意思的Mathematica很值得在T恤上展示。 – Sasha 2011-04-21 18:26:08

5

Use __,例如,

In[4]:= f[x__] = {x} 
Out[4]= {x} 

In[5]:= f[1,2,3,4,5,6] 
Out[5]= {1, 2, 3, 4, 5, 6} 

In[6]:= f[a,b,c] 
Out[6]= {a, b, c} 
+0

謝謝你的答案,但它還不適合我。我會更新這個問題。 – wrongusername 2011-04-21 16:32:00

+1

@wrong你確定嗎?這是規範的方式... – 2011-04-21 16:42:41

+0

@belisarius我敢肯定它不工作,但我也確定我在做一些愚蠢的事,哈哈。我仍然試圖隔離問題,做簡單的測試給出我想要的 – wrongusername 2011-04-21 16:45:23

相關問題