0

我这里有一段复杂的代码,既不漂亮也不容易理解,但它代表了我正在使用的大量代码的简化。我是 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
4

1 回答 1

2

尽可能多地保留您的代码,只需进行一些更改即可:

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,但它不会导致失败。

于 2011-05-25T08:27:10.083 回答