Функция Mathematica с несколькими условными IF [] - PullRequest
0 голосов
/ 25 мая 2011

У меня здесь сложный фрагмент кода, который не очень приятен и не прост для понимания, но он представляет собой упрощение большого объема кода, с которым я работаю.Я новичок в Mathematica и уже получил некоторую помощь по этому вопросу от stackoverflow , но он все еще не решает мою проблему.Вот код, за которым, я надеюсь, вы сможете следовать и предположить, что я пытаюсь заставить его сделать.Спасибо вам за помощь в программировании.

a[b_, c_] = -3*b + 2*c + d + e + f;

g[b_, c_] := If[a[b, c] < 0, -3*a[b, c], a[b, c]];

h[T_, b_, c_] = (T/g[b, c]);

i[h_, T_, b_, c_] := If[h[T, b, c] > 0, 4*h[T, b, c], -5*h[T, b, c]];

j[b_, c_] := If[a[b, c] < 0, 5*a[b, c], 20*a[b, c]];

XYZ[h_, T_, i_, g_, j_, b_, c_] = T*i[h, T, b, c]*g[b, c] + j[b, c]

rules = {a -> 1, b -> 2, c -> 3, d -> 4, e -> 5, f -> 6, T -> 10};

XYZ[h, T, i, g, j, b, c] //. rules

1 Ответ

2 голосов
/ 25 мая 2011

Сохраняя как можно больше вашего кода, он будет работать с несколькими изменениями:

a[b_, c_] := -3*b + 2*c + d + e + f;

g[b_, c_] := If[# < 0, -3 #, #] & @ a[b, c]

h[T_, b_, c_] := T / g[b, c]

i[h_, T_, b_, c_] := If[# > 0, 4 #, -5 #] & @ h[T, b, c]

j[b_, c_] := If[# < 0, 5 #, 20 #] & @ a[b, c]

XYZ[h_, T_, i_, g_, j_, b_, c_] := T*i[h, T, b, c]*g[b, c] + j[b, c]

rules = {a -> 1, b -> 2, c -> 3, d -> 4, e -> 5, f -> 6, T -> 10};

XYZ[h, T, i, g, j, b, c] /. rules

(* Out= 700 *)
  1. If операторы снова выводятся наружу, как в последней задаче.

  2. все определения сделаны с SetDelayed (:=), в соответствии с хорошей практикой.

  3. Предполагаемая ошибка T - 10 в вашем rules исправлена ​​на T -> 10

Обратите внимание, что снова ReplaceRepeated (//.) не требуется и изменяется на /.

У нас все еще есть бессмысленное правило a -> 1, но оно не приводит к сбою.

...