如何在Mathematica中有一个变量参数列表

wro*_*ame 4 wolfram-mathematica

现在我有一些代码,其中一些函数func按照我想要的方式执行,当我在其定义中给出它特定的参数时(所以我做它func[x1_,x2_]:=...然后我做它func[x1_,x2_,x3_]:=...而不改变任何其他东西它按照我希望的方式工作) .有没有办法自动替换我为此函数指定的任何参数?

更新:

我还没有找到问题代码,但这里的代码没有做我想要的:

(* 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]
Run Code Online (Sandbox Code Playgroud)

这段代码在这里:(给出{67.9989, 48.0841, 38.9524, 31.994, 31.994, 27.8265, 24.3525, 24.3525}y)

(* 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]
Run Code Online (Sandbox Code Playgroud)

更新2:

我的数学:

我打算取该getX函数的所有偏导数的平方和的平方根.这样getY功能的主体.然后我想为x1和的不同值评估该表达式x2.因此我有论据getY.

ken*_*ytm 5

使用__,例如

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}
Run Code Online (Sandbox Code Playgroud)


Sas*_*sha 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}]
Run Code Online (Sandbox Code Playgroud)

这将首先使用errors列表中与 的参数中提供的变量完全相同的变量getY,以符号方式计算导数,然后执行Dot, 而不是Sum更快。那么输出将是相同的。

请注意,在代码的两个版本中,errors具有不同的值。

Derivative或者,您可以像这样使用:

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

使用它会产生相同的结果。

  • @wrongusername Mathematica 附带完整的可编辑文档。选择您想要查找的符号,然后使用菜单“帮助”>“查找所选功能”。例如,“@@”和“@@@”都会引导您进入“Apply”。`&` 是 `Function` 的缩写,`##` 是 `SlotSequence`。`;;` 是 `Span`。使用这些符号编写的 Mathematica 代码有时被称为“符文代码”。我个人认为,符文 Mathematica 的片段值得在 T 恤上展示。 (2认同)