Как создать список переменных аргументов в Mathematica - PullRequest
4 голосов
/ 21 апреля 2011

Прямо сейчас у меня есть код, где какая-то функция func выполняет так, как я хочу, когда я даю ей конкретные аргументы в ее определении (поэтому я делаю это func[x1_,x2_]:=..., а потом я делаю это func[x1_,x2_,x3_]:=..., ничего не меняя еще и работает так, как хотелось бы). Есть ли способ автоматически заменить любые аргументы, которые я указываю для этой функции?

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]

Этот код здесь: (дает {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]

ОБНОВЛЕНИЕ 2:

Моя математика:

Я намерен взять квадратный корень из суммы квадратов всех частных производных функции getX. Таким образом, тело функции getY. Затем я хочу оценить это выражение для различных значений x1 и x2. Таким образом, у меня есть аргументы для getY.

Ответы [ 2 ]

5 голосов
/ 21 апреля 2011

Использование __, например,

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}
3 голосов
/ 21 апреля 2011

Ну, проблема в том, что в первой версии с явным количеством аргументов вы использовали 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 вместо Sum, что быстрее. Тогда выходы будут такими же.

Обратите внимание, что в ваших двух версиях кода errors имеют разные значения.

В качестве альтернативы вы можете использовать Derivative примерно так:

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

Использование этого дает тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...