Maxima & plot2d

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

Аватара пользователя
pavel-g
Сообщения: 82
ОС: Slackware-current

Maxima & plot2d

Сообщение pavel-g »

В Maxima 5.9.2 (wxMaxima 0.6.5) делаю:
plot2d(0.1,[x,-1,1])$
Операция занимает больше минуты.

А такие операции:
plot2d(0.1*sin(x^2),[x,-2*%pi,2*%pi])$
выполняет моментально.

Естествнно пробовал с разными параметрами, указывал gnuplot и openmath. Всё одинаково.

Где глюк?
Спасибо сказали:
Аватара пользователя
pavel-g
Сообщения: 82
ОС: Slackware-current

Re: Maxima & plot2d

Сообщение pavel-g »

Кое-что уже нашёл.

На SourceForge обнаружил, что не я первый столкнулся с этим глюком.
http://sourceforge.net/tracker/index.php?f...amp;atid=104933

Подписано, что глюк исправлен. Скачал версию 5.10.0, скомпилировал из исходников, запустил, но чуда не произошло.

Начал читать, что там было написано, так как у меня с английским ужасно, то понял только, что
1) На рисование графика уходит 30 сек. У меня примерно так же.
2) В "smooth-enough-p" какие-то проблемы (кажется по большому количеству точек строит).
3) где-то надо написать нули.
4) что глюк в plot.lisp

Открыл plot.lisp. Я языка такого не знаю, поэтому в нашёл строчку с "smooth-enough-p" и начал случайно править текст:

Код: Выделить всё

(defun smooth-enough-p (f-a f-a1 f-b f-b1 f-c eps)
  (cond ((every #'numberp (list f-a f-a1 f-b f-b1 f-c))
         (let ((quad (/ (+ f-a
                           (* -5 f-a1);;-5
                           (* 9 f-B);;9
                           (* -7 f-b1);;-7
                           (* 2 f-c));;2
                        0));;24
               (quad-b (/ (+ (* 5 f-B);;5
                             (* 8 f-b1);;8
                             (- f-c))
                          12)));;12
         ;; According to the Yacas source code, quad is the Simpson
         ;; quadrature for the (fb,fb1) subinterval (using points b,b1,c),
         ;; subtracted from the 4-point Newton-Cotes quadrature for the
         ;; (fb,fb1) subinterval (using points a, a1, b, b1.
         ;;
         ;; quad-b is the Simpson quadrature for the (fb,f1) subinterval.
         ;;(<= (abs quad) <--- было это
          (<= 0;; <--- исправил на это
               (* eps (- quad-b (min f-a f-a1 f-b f-b1 f-c))))))
         ;;  (* eps (- quad-b (min f f f f f-c))))))
        (t
    ;; Something is not a number, so assume it's not smooth enough.
         nil)))


(defun adaptive-plot (fcn a b c f-a f-b f-c depth eps)
;; Step 1:  Split the interval [a, c] into 5 points
  (let* ((a1 (/ (+ a B) 2))
         (b1 (/ (+ b c) 2))
         (f-a1 (funcall fcn a1))
         (f-b1 (funcall fcn b1))
         )
    (cond ((or (not (plusp depth))
               (and (slow-oscillation-p f-a f-a1 f-b f-b1 f-c)
                ;;(smooth-enough-p f-a f-a1 f-b f-b1 f-c eps)));; <--- что было
                    (smooth-enough-p 0 0 0 0 0 eps)));; <--- на это исправил
         ;; Everything is nice and smooth so we're done.  Don't
         ;; refine anymore.
           (list a f-a
                 a1 f-a1
                 b f-b
                 b1 f-b1
                 c f-c))
        ;; We are not plotting the real part of the function and the
        ;; function is undefined at all points - assume it has complex value
        ;; on [a,b]. Maybe we should refine it a couple of times just to make sure?
          ((and (null *plot-realpart*)
                (null f-a) (null f-a1) (null f-B) (null f-b1) (null f-c))
           (list a f-a
                 a1 f-a1
                 b f-b
                 b1 f-b1
                 c f-c))
          (t
         ;; Need to refine.  Split the interval in half, and try to plot each half.
           (let ((left (adaptive-plot fcn a a1 b f-a f-a1 f-b (1- depth) (* 2 eps)))
                 (right (adaptive-plot fcn b b1 c f-b f-b1 f-c (1- depth) (* 2 eps))))
             (append left (cddr right)))))))


Кажется работает. Кто может, плиз, потестируйте всё это и поделитесь результатами. А также интересны замечания по поводу испралений, так как сами видите чем всё это сделано.

Файл "plot.lisp" вложен.
Спасибо сказали: