告诉Plot在Mathematica中设置矢量值黑盒功能的样式

时间:2011-04-08 15:46:45

标签: wolfram-mathematica

假设我编写了一个黑盒函数,它以数字方式计算昂贵的复值函数,然后返回实部和虚部。

fun[x_?InexactNumberQ] := Module[{f = Sin[x]}, {Re[f], Im[f]}]

然后我可以像往常一样在Plot中使用它,但是Plot不能识别该函数返回一对,并且颜色两者都是相同的颜色。如何告诉Mathematica指定的函数总是返回一个固定长度的向量?或者如何描绘这个情节呢?

screen-shot of plot with both curves being the same color

编辑:考虑到尝试回答问题,我认为只有在对所获得的图形进行后处理时才能避免双重重新评估。最有可能的是以下不稳健,但它似乎适用于我的例子:

gr = Plot[fun[x + I], {x, -1, 1}, ImageSize -> 250];
k = 1;
{gr, gr /. {el_Line :> {ColorData[1][k++], el}}}

two images, one with styling applied

3 个答案:

答案 0 :(得分:7)

一种可能性是:

Plot[{#[[1]], #[[2]]}, {x, -1, 1}, PlotStyle -> {{Red}, {Blue}}] &@ fun[x + I]  

enter image description here

修改

如果你的功能不是真的平滑(即几乎是线性的!),那么你无法阻止双重评估过程,因为它会发生(某种程度上)由于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]  

enter image description here

答案 1 :(得分:3)

如果您的功能计算成本很高,我认为没有一个好的解决方案。如果要么将一个明确的函数列表作为参数给出,或者给它一个可以计算为值列表的函数,Plot只会确认有几个曲线要设置样式。

你可能不想做@ belisarius建议的原因是它会计算两次函数(慢两倍)。

但是,您可以使用memoization来避免这种情况(即f [x_]:= f [x] = ...构造),并使用他的解决方案。但如果您使用真正有价值的功能,这可以迅速填补您的记忆。为了防止这种情况,你可能想尝试我写的关于仅缓存有限数量值的内容,以避免填满内存:http://szhorvat.net/pelican/memoization-in-mathematica.html

答案 2 :(得分:0)

如果可能适用于您的实际应用,一种方法是允许fun除了数字之外还使用符号输入,然后在EvaluatePlot进行符号输入:

fun2[x_] := Module[{f = Sin[x]}, {Re[f], Im[f]}]

Plot[Evaluate[fun2[x + I]], {x, -1, 1}]

enter image description here

这与您评估的效果相同:

Plot[{-Im[Sinh[1 - I x]], Re[Sinh[1 - I x]]}, {x, -1, 1}]