2008/08/03

Common Lisp から Maxima の関数を使う

(in-package :maxima)

#|
$plot2d に trace(C-c C-t) をかけておき、
plot2d(x^2, [x, -5, 5]); を実行すると
こんな引数で呼ばれるのが分かる。
0: ($PLOT2D ((MEXPT SIMP) $X 2) ((MLIST SIMP) $X -5 5))
0: $PLOT2D returned ""
|#


;; quit(); で Maxima からぬけて、
;; 2つの引数に ' を付けて実行すると、グラフが表示された。
($PLOT2D '((MEXPT SIMP) $X 2) '((MLIST SIMP) $X -5 5))


#|
http://cosmo.phys.hirosaki-u.ac.jp/wiki.cgi/maxima?page=Maxima+%A4%C7%A4%CE%A5%B0%A5%E9%A5%D5%C9%BD%BC%A8
を参考にして円をかく。

θ -> 0..2π
x -> cosθ
y -> sinθ
で円なのね。

(%i7) plot2d( [parametric, cos(t), sin(t), [t, 0, 2*%pi], [nticks, 50]],
[gnuplot_preamble, "set size square"] )$
0: ($PLOT2D
((MLIST SIMP) $PARAMETRIC ((%COS SIMP) $T) ((%SIN SIMP) $T)
((MLIST SIMP) $T 0 ((MTIMES SIMP) 2 $%PI)) ((MLIST SIMP) $NTICKS 50))
((MLIST SIMP) $GNUPLOT_PREAMBLE "set size square"))
|#


;; CL の repl から
($plot2d
'((mlist simp) $parametric
((%cos simp) $t)
((%sin simp) $t)
((mlist simp) $t 0 ((mtimes simp) 2 $%pi))
((mlist simp) $nticks 50))
'((mlist simp) $gnuplot_preamble "set size square"))



;;;; これを NLISP でやってみよう。
(require :nlisp)

(let* (($t (nlisp:.rseq 0 (* 2 pi) 50))
($x (nlisp:.cos $t))
($y (nlisp:.sin $t)))
(nlisp:plot $x $y))

#|
できた。
↓のよりよくなった?
(let* ((x (.rseq -1 1 1000))
(+y (.sqrt (.- 1 (.* x x))))
(-y (.* -1 (.sqrt (.- 1 (.* x x))))))
(plot (.concatenate +y -y)
(.concatenate x x)))
|#

0 件のコメント: