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

Sas*_*sha 11 wolfram-mathematica

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

fun[x_?InexactNumberQ] := Module[{f = Sin[x]}, {Re[f], Im[f]}]
Run Code Online (Sandbox Code Playgroud)

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

两个曲线颜色相同的情节的屏幕截图

编辑:鉴于试图回答问题的尝试,我认为只有在样式作为获得的图形的后处理执行时,避免双重重新评估才有可能.最有可能的是以下不健壮,但它似乎适用于我的例子:

gr = Plot[fun[x + I], {x, -1, 1}, ImageSize -> 250];
k = 1;
{gr, gr /. {el_Line :> {ColorData[1][k++], el}}}
Run Code Online (Sandbox Code Playgroud)

两个图像,一个应用了样式

Dr.*_*ius 7

一种可能性是:

Plot[{#[[1]], #[[2]]}, {x, -1, 1}, PlotStyle -> {{Red}, {Blue}}] &@ fun[x + I]  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

如果你的函数不是真的光滑(即几乎是线性的!),有没有什么可以做,以防止双重评估过程,因为它会发生(在某种程度上)反正由于情节[]网探索算法的性质.

例如:

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]  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述