2007年12月7日星期五

矢量绘图语言Asymptote(一)

Asymptote是从MetaPost扩展而来的矢量数学绘图语言。它使用浮点数运算,支持三维图形,使用类似C++语法。Asymptote的很多语法和MetaPost类似,但是也有不同。下面简单介绍它的使用方法。假设Asymptote命令存在文件test.asy中,则执行下面的命令可以生成eps文件:
asy -V test
其中-V参数会自动打开一个PostScript浏览窗口,这样可以立即浏览生成的图形。
  1. 简单直线图形
    Asymptote代码生成的图像
    draw((0,0)--(100,0)--(100,100)
    --(0,100)--cycle);
    size(0,3cm);
    draw(unitsquare);
    unitsize(2cm,3cm);
    draw(unitsquare);
    label("$A$",(0,0),SW);
    label("$B$",(1,0),SE);
    label("$C$",(1,1),NE);
    label("$D$",(0,1),NW);
  2. 曲线图形
    Asymptote代码生成的图像
    draw((0,0){up}..(100,25){right}..(200,0){down});
    draw((0,0){up}::(100,25){right}::(200,0){down});
    size(0,100);
    path unitcircle=E..N..W..S..cycle;
    path g=scale(2)*unitcircle;
    filldraw(unitcircle^^reverse(g),yellow,black);
    size(200);
    
    real mexican(real x)
    {return (1-8x^2)*exp(-(4x^2));}
    
    int n=30;
    real a=1.5;
    real width=2a/n;
    
    guide hat;
    path solved;
    
    for (int i=0; i<n; ++i) {
      real t=-a+i*width;
      pair z=(t,mexican(t));
      hat=hat..z;
      solved=solved..z;
    }
    
    draw(hat);
    dot(hat,red);
    draw(solved,dashed);
  3. graph module
    Asymptote代码生成的图像
    import graph;
    size(150,0);
    
    real f(real x) {return exp(x);}
    pair F(real x) {return (x,f(x));}
    
    xaxis("$x$");
    yaxis("$y$",0);
    
    draw(graph(f,-4,2,operator ..),red);
    
    labely(1,E);
    label("$e^x$",F(1),SE);

2007年11月13日星期二

计算折射率和其他光学变换的网站

计算折射率和其他光学变换的网站

http://www.luxpop.com/

2007年9月3日星期一

在Fedora 7下安装LaTeX CJK

LaTeX CJK的安装一向都很麻烦,主要是字体安装和配置不容易。这里主要根据Edward Lee的Blog(http://blog.bs2.to/post/EdwardLee/7672)里的方法进行配置。
  1. 下载安装CJK包
  2. http://cjk.ffii.org/下载CJK扩展包,解压缩到“$HOME/texmf/tex/latex/CJK/”。这里不准备修改系统文件,所以只安装到用户目录。
  3. 生成Type1字体和配置文件
  4. 这里使用CJK自带的FontForge脚本文件subfonts.pe生成Type1字体。 首先建一个目录,例如$HOME/song/,我们就在这个目录里生成字体。把我们想要的TrueType字体拷贝到这个目录中,我这里使用的是Fedora自带的文鼎Unicode字体uming.ttf。再把CJK包utils里面的subfonts.pe拷贝到这个目录。最后到http://delloye.free.fr/Unicode.sfd下载Unicode.sfd文件到同一个目录。执行下面的命令:
    fontforge -script subfonts.pe uming.ttf song Unicode.sfd
    这个命令执行的时间比较长。执行完之后,还在该目录执行下面命令生成map文件:
    for i in *.tfm
    do
    cat >> song.map << EOF
    ${i%.tfm} ${i%.tfm} < ${i%.tfm}.pfb
    EOF
    done
    按照Edward Lee的方法,还需要生成fd文件。但是我们给字体起的名字song和CJK自带的c70song.fd文件冲突了,如果用Edward Lee的方法反倒会出问题。我们有个更简单的解决办法,直接把c70song.fd修改一下。CJK自带的c70song.fd文件在$HOME/texmf/tex/latex/CJK/texinput/UTF8/目录下,内容如下:
    % This is the file c70song.fd of the CJK package
    %   for using Asian logographs (Chinese/Japanese/Korean) with LaTeX2e
    %
    % created by Werner Lemberg 
    %
    % Version 4.7.0 (17-Oct-2006)
    
    \def\fileversion{4.7.0}
    \def\filedate{2006/10/17}
    \ProvidesFile{c70song.fd}[\filedate\space\fileversion]
    
    
    % character set: Unicode U+0080 - U+FFFD
    % font encoding: Unicode
    
    \DeclareFontFamily{C70}{song}{\hyphenchar \font\m@ne}
    
    \DeclareFontShape{C70}{song}{m}{n}{<-> CJK * cyberb}{}
    \DeclareFontShape{C70}{song}{bx}{n}{<-> CJKb * cyberb}{\CJKbold}
    
    \endinput
    
    我们只要把其中的cyberb改作song就可以了。
  5. 把生成文件拷贝到相应目录
  6. 把生成文件拷贝到下面的目录:
    $HOME/texmf/fonts/map/dvips/CJK/song.map
    $HOME/texmf/fonts/tfm/CJK/song/*.tfm
    $HOME/texmf/fonts/type1/CJK/song/*.pfb
    如果目录不存在,自己建立一下。
  7. 生成ls-R数据库
  8. 执行
    texhash
  9. 更新字体map
  10. updmap --enable Map song.map
  11. 测试
  12. 可以编辑下面的文件进行测试。
    \documentclass{article}
    \usepackage{CJKutf8}
    \begin{document}
    \begin{CJK}{UTF8}{song}
    \LaTeX CJK 测试。
    \end{CJK}
    \end{document}

2007年3月30日星期五

如何使用Maxima(三)

  1. 复数运算
  2. 代数运算:
    (%i1) a:2-3*%i$
    (%i2) b:5+4*%i$
    (%i3) a+b;
    (%o3)                               %i + 7
    (%i4) a*b;
    (%o4)                        (2 - 3 %i) (4 %i + 5)
    
    上面%i1%i2结尾用$而不是分号;表示不输出结果。 实部和虚部:
    (%i5) expand(%);
    (%o5)                              22 - 7 %i
    (%i6) realpart(%);
    (%o6)                                 22
    (%i7) imagpart(%o5);
    (%o7)                                 - 7
    
    绝对值和幅角:
    (%i8) abs(%o5);
    (%o8)                              sqrt(533)
    (%i9) carg(%o5);
                                            7
    (%o9)                             - atan(--)
                                            22
    
    复数形式和直角形式:
    (%i10) polarform(%o5);
                                         - %i atan(7/22)
    (%o10)                    sqrt(533) %e
    (%i11) rectform(%);
                                   7                            7
    (%o11)       sqrt(533) cos(atan(--)) - sqrt(533) %i sin(atan(--))
                                   22                           22
    (%i12) %,numer;
    (%o12)                           22.0 - 7.0 %i
    
  3. 方程数值解
  4. 找出方程f(x)=0[a, b]范围内的数值解:
    find_root(f(x), x, a, b);