现在我有一些代码,其中某些函数func
以我想要的方式执行,当我在其定义中给它特定的参数时(所以我将其设为func[x1_,x2_]:=...
然后我将它func[x1_,x2_,x3_]:=...
1}}不改变任何其他东西,它按照我希望的方式工作)。有没有办法自动替换我为此函数指定的任何参数?
更新
我还没有找到问题代码,但这里的代码并不能满足我的需求:
(* 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]
此处的代码执行:(为{)提供{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
函数的主体。然后,我想针对x1
和x2
的不同值评估该表达式。因此,我有getY
的论据。
答案 0 :(得分: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}
答案 1 :(得分:3)
问题是,在第一个版本中,使用显式数量的参数,您已使用Evaluate来评估右侧。当参数的数量可变时,您不能这样做,因为评估者不知道要使用哪个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}]
这将首先使用errors
列表中的变量与您在getY
的参数中提供的变量一样多,以符号方式计算导数,然后执行Dot
,而不是{ {1}}哪个更快。然后输出将是相同的。
请注意,在您的两个版本的代码中,Sum
具有不同的值。
或者,您可以像这样使用errors
:
Derivative
使用它会得到相同的结果。