假设我编写了一个黑盒函数,它以数字方式计算昂贵的复值函数,然后返回实部和虚部。
fun[x_?InexactNumberQ] := Module[{f = Sin[x]}, {Re[f], Im[f]}]
然后我可以像往常一样在Plot中使用它,但是Plot不能识别该函数返回一对,并且颜色两者都是相同的颜色。如何告诉Mathematica指定的函数总是返回一个固定长度的向量?或者如何描绘这个情节呢?
编辑:考虑到尝试回答问题,我认为只有在对所获得的图形进行后处理时才能避免双重重新评估。最有可能的是以下不稳健,但它似乎适用于我的例子:
gr = Plot[fun[x + I], {x, -1, 1}, ImageSize -> 250];
k = 1;
{gr, gr /. {el_Line :> {ColorData[1][k++], el}}}
答案 0 :(得分:7)
一种可能性是:
Plot[{#[[1]], #[[2]]}, {x, -1, 1}, PlotStyle -> {{Red}, {Blue}}] &@ fun[x + I]
修改
如果你的功能不是真的平滑(即几乎是线性的!),那么你无法阻止双重评估过程,因为它会发生(某种程度上)由于Plot []网格探索算法的本质。
例如:
fun[x_?InexactNumberQ] := Module[{f = Sin[3 x]}, {Re[f], Im[f]}];
Plot[{#[[1]], #[[2]]}, {x, -1, 1}, Mesh -> All,
PlotStyle -> {{Red}, {Blue}}] &@fun[x + I]
答案 1 :(得分:3)
如果您的功能计算成本很高,我认为没有一个好的解决方案。如果要么将一个明确的函数列表作为参数给出,或者给它一个可以计算为值列表的函数,Plot只会确认有几个曲线要设置样式。
你可能不想做@ belisarius建议的原因是它会计算两次函数(慢两倍)。
但是,您可以使用memoization来避免这种情况(即f [x_]:= f [x] = ...构造),并使用他的解决方案。但如果您使用真正有价值的功能,这可以迅速填补您的记忆。为了防止这种情况,你可能想尝试我写的关于仅缓存有限数量值的内容,以避免填满内存:http://szhorvat.net/pelican/memoization-in-mathematica.html
答案 2 :(得分:0)
如果可能适用于您的实际应用,一种方法是允许fun
除了数字之外还使用符号输入,然后在Evaluate
内Plot
进行符号输入:
fun2[x_] := Module[{f = Sin[x]}, {Re[f], Im[f]}]
Plot[Evaluate[fun2[x + I]], {x, -1, 1}]
这与您评估的效果相同:
Plot[{-Im[Sinh[1 - I x]], Re[Sinh[1 - I x]]}, {x, -1, 1}]