我疯了,因为我不能让Mathematica表现出来......
我正在使用NDSolve解决ODE,但由于一个函数无法输出我期望的结果,因此无效。
我的功能是这种形式:
y[x_] := Which[
0<=x<=10, {{1,2,3},{-9,-8,-7}},
10<x<20, {{4,5,6},{-6,-5,-4}},
x>=20, {{7,8,9},{-3,-2,-1}}
];
如果在上下文中使用该函数:
Ans[x_] := Total[y[x][[1]] {10,20,30}];
只要我用数值称它就可以了。
Ans[3] = Total[y[3][[1]] {10,20,30}] = Total[{1,2,3} {10,20,30}] = Total[{10,40,90}] = 140
但是当我的ODE求解器用另一个函数调用它时,它表现得非常奇怪。
Ans[z[t]] = Total[y[z[t]][[1]] {10,20,30}] = Total[(0<=x<=10) {10,20,30}] = ??? non-sense
似乎参数y [z [t]] [[1]]只是采用'哪个'第一个条件。为什么?
感谢您的帮助!
答案 0 :(得分:1)
回答你问的问题:
原因是,当您评估y[x]
时,它只会提供Which[0 <= x <= 10, {{1, 2, 3}, {-9, -8, -7}}, 10 < x < 20, {{4, 5, 6}, {-6, -5, -4}}, x >= 20, {{7, 8, 9}, {-3, -2, -1}}]
,其中第一个元素(由[[1]]
检索)为0 <= x <= 10
。
一些建议:
:=
定义后不需要分号。
在许多情况下,您可以使用Piecewise
代替Which
。 Piecewise
是一个数学结构,而Which
是编程结构。
当你需要一个只应该评估数字参数而不是符号的函数时,请使用
Clear[ans]
ans[x_?NumericQ] := Total[y[x][[1]] {10,20,30}]