我正在尝试将一个三次样条函数定义为Mathematica 8
中的函数,因为每个区间{{1}我都得到P_{i}
(当然,这是3次多项式) }}。我想要做的是将[x_{i}, x_{i + 1}], i = 0, ..., n
区间s
定义为[x_{0}, x_{n + 1}]
。如果
变化,我该怎么做?我在想s(x) = P_{i}(x) if x is in [x_{i}, x_{i+1}]
s(x) = P_{i}(x) if x is in [x_{i}, x_{i+1}]
但是没有用。
答案 0 :(得分:4)
如果我没弄错的话,这正是你所要求的。虽然这有点难看。有更好的选择。
n = 5;
ClearAll[f];
f[x_] = Piecewise[Table[{x^k, (k - 1)/n < x <= k/n}, {k, 0, n}]]
f[1/2]
(* ==> 1/8 *)
如果你想让结果依赖于全局变量n
的当前状态(我不提倡),你可以在{的定义中替换Set
(=) {1}}使用f
(:=),但这意味着每次SetDelayed
的调用都会重新评估Table
。对n的小值来说并不坏,但我不喜欢它。在这种情况下的结果看起来像这样:
f
答案 1 :(得分:1)
我真的不明白你要求的是什么,但是按照我最好的猜测,你可能会发现这个价值:
p = {func1, func2, func3, func4, func5};
s = If[
1 <= # <= Length@p,
p[[Floor[#]]][#],
"Undefined"
] &;
s /@ {2.4, 1.2, 3.3, 4.8, 1.3, -2.5}
{func2[2.4], func1[1.2], func3[3.3], func4[4.8], func1[1.3], "Undefined"}
如果这没用,我很抱歉。
答案 2 :(得分:1)
Ivan,我认为根据你对我的第一个答案的评论,有很多方法可以做你想要的,或多或少的做作。也许您最常寻找Interpolation
的功能。例如:
n = 5;
Table[{k/n, k}, {k, 0, n}]
f = Interpolation[%, InterpolationOrder -> 0];
Plot[f[i], {i, 0, 1}, PlotRange -> All]