В середине вашего блока у вас есть:
If[Length[bounce1x] > 0,
bounce1x = bounce1x[[1]];,
bounce1x = offset;
]
Формат If
выглядит следующим образом: If[Condition, ValueIfTrue, ValueIfFalse]
То есть If[True, 3, 2]
возвращает 3, а If[False, 3, 2]
возвращает 2. Ваши точки с запятой здесь не нужны, но вам нужен один в конце оператора if:
If[Length[bounce1x] > 0,
bounce1x = bounce1x[[1]],
bounce1x = offset
];
В противном случае Mathematica интерпретирует это как умножение этого утверждения на время, каким будет следующий, который будет отображаться. В этом случае вы возвращаете null
из этого оператора If
, и оно умножается на возвращаемое значение следующего оператора If
, который появляется.
Для Module
синтаксис: Module[{localvars}, ReturnValue]
Что означает, что последним оператором, который отображается без точки с запятой, является ReturnValue. Так, например, следующий модуль:
Module[{y},
y = x * x;
If[x < 0, -y, +y]
]
вернет -y, когда x <0, и + y в противном случае. Единственное исключение - это когда появляется <code>Return. Как и в большинстве языков, вы можете рано вернуться из функции, используя Return
:
Module[{y},
y = x * x;
If[x < 0,
Return[-y],
Return[+y]];
(* We never reach this point to return null *)
];
Что касается вашего Module
, я думаю, что это может быть то, что вы пытаетесь достичь:
getAngleAttack[offset_] :=
Module[{bounce1x, l1a, lightSlope, panelSlope},
light[x_] = light'[x] (x - offset) + panel[interval];
DumpVar[offset];
lightSlope = N[light'[offset]];
u1S = light'[offset];
u1[x_] = (u1S (x - offset)) + panel[interval];
bounce1x =
x /. N[NSolve[u1[x] == panel[x] && x < interval && x > -interval,
x]];
u1r[x_] = panel'[bounce1x] (x - bounce1x) + panel[bounce1x];
If[Length[bounce1x] > 0,
bounce1x = bounce1x[[1]],
bounce1x = offset];
If[bounce1x > -interval && bounce1x < interval,
lightSlope = N[u1'[bounce1x]];
If[x <= 0,
panelSlope := N[panelCoeff],
panelSlope := -N[panelCoeff]];
DumpVar[lightSlope];
DumpVar[panelSlope];
l1a = N[
ArcTan[(lightSlope - panelSlope)/(1 + (panelSlope lightSlope))]];
DumpVar[l1a];
Return[l1a]
];
l1a]
Еще одна вещь, на которую следует обратить внимание, - это любые переменные, которые вы используете внутри Module
. Если вы запустите следующий фрагмент кода, вы получите 4, -113/5, 32
в качестве выходных значений:
d = 4 (* d was 4 *)
Module[{a, b, c},
a = 3;
b = 2;
c = 5;
d = 32; (* Uh oh! I just overwrite whatever d was *)
a^2 + b / c - d]
d (* d is now 32 *)
Чтобы избежать этого, определите любые переменные, которые вы используете в качестве локальных переменных в начале Module
: Module[{a, b, c, d}, ...]