2011-04-21 27 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

相关问题