|
楼主 |
kuing
发表于 2018-6-25 21:52
现在开始扯不连续的。
先来个简单的例子:画反比例函数。(画这个当然直接 plot (\x,1/\x) 就行了,这里用取点法来画它纯粹是为了示范)
用 Table 取点法,需要分两段来取:- fb1 = Table[{x, 1/x}, {x, -3, -1/3, 0.05}];
- fb2 = Table[{x, 1/x}, {x, 3, 1/3, -0.05}];
- fb = Union[fb1, fb2];
- Export["D:/fb.txt", fb, "Table"]
复制代码 然后在 latex 里
\draw plot file {D:/fb.txt};
结果你应该能猜到:
两段的头尾被连起了,那怎么让它断开?有两种方法:
法一:打开 D 盘的 fb.txt,找到该断开的地方,插入一空行即可,如下图所示:
法二:将上面代码中的 fb = Union[fb1, fb2]; 改成- fb = Join[fb1, {{}}, fb2];
复制代码 就是在两堆数之间插入一个空的 {},导出后就会有那个空行了(你可以打开 fb.txt 来看是不是)。
显然法二更好,完成后在 latex 里再次编译即可,效果图就不贴了。
那如果碰到段数很多的,上面那样处理也挺麻烦,还是来试试 Plot 出来再导出数据吧。
这回画正切函数,画多几个周期。
先在 MMC 里画出来看看:- tg = Plot[Tan[x], {x, -2 Pi, 2 Pi}, PlotRange -> {-4, 4}, PlotPoints -> 3]
复制代码 (为了方便观察,这里我设了 PlotPoints -> 3 让数据少些)
同样地,用 InputForm 来看看数据如何:
我们发现,由于曲线有几段,所以这里有几个 Line,故此,如果还是像 1# 那样用 InputForm[tg][[1, 1, 1, 1, 3, 1, 2, 1]] 的话只能提取到其中一段,要各段都提取出来,得先知道有多少个 Line,所以:- ds = Length[InputForm[tg][[1, 1, 1, 1, 3, 1]]]
复制代码 得出结果是 6,这说明有 5 段(因为 Line 之前还有一项),与实际相符,然后:- Do[tgn[n] = Append[InputForm[tg][[1, 1, 1, 1, 3, 1, n, 1]], {}], {n, 2, ds}]
复制代码 上述命令将各段的数据储存在 tgn[n] 中,并且我还在每段最后追加了一个空的 {},导出时就会有空行了。
(同样需要注意,以上几步的代码与 MMC 的版本有关。)
最后把它们合起来并导出:- tgx = Flatten[Table[tgn[n], {n, 2, ds}], 1];
- Export["D:/tg.txt", tgx, "Table"]
复制代码 导出完成,在 latex 里:- \tikz[scale=0.5]{
- \draw[->](-7,0)--(7,0);\draw[->](0,-4)--(0,4);
- \draw plot file {D:/tg.txt};
- }
复制代码 效果:
别看我扯了那么多好像很麻烦的样子,其实整理起来,也就几行格式固定的代码。
比如,我现在想画 `\frac12\sec x` 在 `(0,2\pi)` 上的图,则在 MMC 里运行以下代码:- tu = Plot[Sec[x]/2, {x, 0, 2 Pi}, PlotRange -> {-2, 2}, PlotPoints -> 3]
- ds = Length[InputForm[tu][[1, 1, 1, 1, 3, 1]]];
- Do[tun[n] = Append[InputForm[tu][[1, 1, 1, 1, 3, 1, n, 1]], {}], {n, 2, ds}];
- tux = Flatten[Table[tun[n], {n, 2, ds}], 1];
- Export["D:/tu.txt", tux, "Table"]
复制代码 然后在 latex 里:- \tikz{
- \draw plot file {D:/tu.txt};
- \draw (0,-2) rectangle (2*pi,2);
- }
复制代码 效果:
当然,实际当中 Plot 的那段代码可能要调整几次,因为通常都要控制图形的范围,才能使得 tikz 画出来比较好看,但这至少比在 latex 里调试好多了,总之,在这已经算是很方便了! |
|