В 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. Всё одинаково.
Где глюк?
Maxima & plot2d
Модератор: /dev/random
-
pavel-g
- Сообщения: 82
- ОС: Slackware-current
Re: Maxima & plot2d
Кое-что уже нашёл.
На 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" и начал случайно править текст:
Кажется работает. Кто может, плиз, потестируйте всё это и поделитесь результатами. А также интересны замечания по поводу испралений, так как сами видите чем всё это сделано.
Файл "plot.lisp" вложен.
На 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" вложен.