Maxima

Z Wikibooks, biblioteki wolnych podręczników.

Przykładowe zadania z rozwiązaniami w programie Maxima (wxMaxima wersja 0.7.1, Maxima 5.13.0, GNU Common Lisp GCL 2.6.8)

Spis treści

[edytuj] Wprowadzanie danych

Każde wprowadzone polecenie kończymy średnikiem ; bądź symbolem dolara $

Zakończenie polecenia średnikiem powoduje, że Maxima oblicza wyrażenie i wyświetla wyniku jego działania:

(%i1) 2*2;
(%o1) 4

Zakończenie polecenia symbolem dolara $ powoduje, że Maxima oblicza wyrażenie, przechowuje jego wynik (w tym przykładzie zapisany w %o2) lecz nie wyświetla go:

(%i2) 2*2$
(%i3)

Wynik jest dostępny zmienną % (ostatni obliczony wynik)

(%i3)%;
(%o3) 4

bądź, w naszym przypadku, %o2

(%i4)%o2;
(%o4) 4

Wyjątki : Wewnątrz instrukcji block polecenia kończy się przecinkiem, oprócz ostatniego, które nie ma swojego końcowego znaku.

[edytuj] Przebieg programu

Program rysujący zbiór Julia

Interpreter Maximy przyjmuje:

  • pojedyncze proste polecenie (1 linia)
  • polecenie złożone (wiele linii)
  • programy, czyli pliki wsadowe zawierające poleceniami. Są to pliki tekstowe (ANSI) z rozszerzenie mac. Otwieramy np. przez Menu/File/Batch file.
/* zawartość pliku z rozszerzeniem mac */ 
i:1;
block
(
  loop,
  i:i+1,
  if i<100 then go(loop)
);
i;

[edytuj] Liczby

[edytuj] Liczby zespolone

Postać algebraiczna (kanoniczna) c:x+y*%i

(%i1) c:5+3*%i;
(%o1) 3*%i+5

część rzeczywista:

(%i2) x:realpart(c);
(%o2) 5

część urojona:

(%i3) y:imagpart(c);
(%o3) 3

Moduł :

(%i4) r:float(abs(c));
 (%o4) 5.830951894845301;

Argument :

(%i5) t:float(carg(c));
(%o5) 0.54041950027058;

Postać wykładnicza:

(%i10) c1:r*%e^(%i*t);
(%o10) sqrt(34)*%e^(%i*atan(3/5))

Powrót do formy algebraicznej :

(%i11) rectform(%);
(%o11) 3*%i+5

Postać trygonometryczna :

(%i32) c2:r*(cos(t)+%i*sin(t));
(%o32) 5.830951894845301*((3*%i)/sqrt(34)+5/sqrt(34))

Powrót do formy algebraicznej :

(%i33) rectform(%);
(%o33) (17.4928556845359*%i)/sqrt(34)+29.1547594742265/sqrt(34)
(%i34) float(%), numer;
(%o34) 3.0*%i+4.999999999999999

Porównywanie dwóch liczb zespolonych:

(%i12) IsEqual(c1,c2,eps):=
        if abs(realpart(c1)-realpart(c2))<=eps 
         and 
        abs(imagpart(c1)-imagpart(c2))<=eps
        then true
         else false;

Sprawdzamy działanie funkcji:

(%i13) IsEqual(1.1, 1.27, 0.1);
(%o13) false

Głowna wartość argumentu liczby zespolonej w obrotach :

carg_t(z):=
block(
 [t],
 t:carg(z)/(2*%pi),  /* teraz jest w obrotach ale w zakresie (-pi,pi] */
 if t<0 then t:t+1, /* zmiana zakresu z  (-pi,pi] do [0, 2*pi) */
 return(t)
)$

Pierwiastek kwadratowy

csqrt(z):=
block(
 [t,w,re,im],
 t:abs(z)+realpart(z),
 if t>0 
  then (re:sqrt(t/2), im:imagpart(z)/sqrt(2*t))
  else  (im:abs(z), re:0),
 w:re+im*%i,
 return(w)
)$

[edytuj] Funkcje

Definicja prostej funkcji:

(%i1) f(z,c):=z*z+c;
(%o1) f(z,c):=z*z+c

Jej pierwszej pochodnej względem zmiennej z:

(%i2) m(z,c):=diff(f(z,c),z,1);
(%o2) m(z,c):=diff(f(z,c),z,1)

Sprawdzamy wzór pochodnej :

(%i3) m(z,c);
(%o3) 2*z

Definicja funkcji rekurencyjnej:

(%i12) F(n, z, c) :=
       if n=1 then f(z,c)
        else f(F(n-1, z, c),c);
(%o12) F(n,z,c):=if n=1 then f(z,c) else f(F(n-1,c,z),c)

Sprawdzamy wzór:

(%i13) F(2,z,c);
(%o13) (z^2+c)^2+c

[edytuj] Rozwiązywanie równań

[edytuj] Pojedyncze równanie

Chcemy znaleźć punkty okresowe dla funkcji Fc(z)=z*z+c dla c=0+1*i (z i c są liczbami zespolonymi).

W tym celu najpierw określamy wartość c:

(%i1) c:1*%i;
(%o1) %i

[edytuj] Okres=1 (punkty stałe)

Rozwiązujemy:

(%i7) p:float(rectform(solve([z*z+c=z],[z])));
(%o7) [z=0.62481053384383*%i-0.30024259022012,z=1.30024259022012-0.62481053384383*%i]


Szukamy punktu odpychającego (źródło, repeller), czyli beta :

if (abs(2*rhs(p[1]))<1) 
then block(
            beta:rhs(p[1]),
            alfa:rhs(p[2])
           ) 
else block(
            alfa:rhs(p[1]),
            beta:rhs(p[2])
           );

Pokazujemy punkt stały typu alfa:

(%i20) alfa;
(%o20) 0.62481053384383*%i-0.30024259022012

Pokazujemy punkt stały typu beta:

(%i21) beta;
(%o21) 1.30024259022012-0.62481053384383*%i

Pokazujemy, że suma alfa i beta jest równa 1

(%i10) p:solve([z*z+c=z], [z]);
(%o10) [z=-(sqrt(1-4*%i)-1)/2,z=(sqrt(1-4*%i)+1)/2]
(%i14) s:radcan(rhs(p[1]+p[2]));
(%o14) 1

Rysujemy punkty:

(%i15) xx:makelist (realpart(rhs(p[i])), i, 1, length(p));
(%o15) [-0.30024259022012,1.30024259022012]
(%i16) yy:makelist (imagpart(rhs(p[i])), i, 1, length(p));
(%o16) [0.62481053384383,-0.62481053384383]
(%i18) plot2d([discrete,xx,yy], [style, points]);

Można dodać też punkt z=1/2 (alfa i beta są symetryczna względem 1/2):

(%i31) xx:cons(1/2,xx);
(%o31) [1/2,-0.30024259022012,1.30024259022012]
(%i34) yy:cons(0,yy);
(%o34) [0,0.62481053384383,-0.62481053384383]
(%i35) plot2d([discrete,xx,yy], [style, points]);

[edytuj] Punkty o okresie = 2

(%i2) solve([(z*z+c)^2+c=z], [z]);
(%o2) [z=-(sqrt(-4*c-3)+1)/2,z=(sqrt(-4*c-3)-1)/2,z=-(sqrt(1-4*c)-1)/2,z=(sqrt(1-4*c)+1)/2]

Pokazujemy że z1+z2 = -1

(%i4) s:radcan(rhs(p[1]+p[2]));
(%o4) -1

Pokazujemy że z2+z3=1

(%i6) s:radcan(rhs(p[3]+p[4]));
(%o6) 1


[edytuj] Punkty o dowolnym okresie

(%i41) giveRoots(period,c):=allroots(%i*F(period,z,c));
(%o41) giveRoots(period,c):=allroots(%i*F(period,z,c))

[edytuj] Układ równań

[edytuj] liniowych

[edytuj] nieliniowych

Układ równań nieliniowych rozwiązujemy za pomocą komendy algsys (przykłady Stavrosa Macrakisa). Wynik zależy co uznamy za parametr a co za zmienną.

(%i2) algsys([a*x+y=3,x+b*y=1],[x,y]);
(%o2) x=(3*b-1)/(a*b-1),y=(a-3)/(a*b-1)


(%i3) algsys([a*x+y=3,x+b*y=1],[a,b]);
(%o3) a=-(y-3)/x,b=-(x-1)/y 
(%i4) algsys([a*x+y=3,x+b*y=1],[x,b]);
(%o4) x=-(y-3)/a,b=(y+a-3)/(a*y)
(%i5) algsys([a*x+y=3,x+b*y=1],[y,a]);
(%o5) y=-(x-1)/b,a=(x+3*b-1)/(b*x)

Jeśli liczba równań jest mniejsza niż liczba zmiennych to wynikiem będzie równanie parametryczne

(%i1) algsys([a*x+y=3,x+b*y=1],[a,b,x,y]);
(%o1) a=(3*%r1-%r1*%r2)/(%r1*(1-%r1*%r2)),b=%r1,x=1-%r1*%r2,y=%r2


[edytuj] Przykład 1 :

Rozwiązywanie układu równań: Definujemy pierwsze równanie:

(%i1) z*z+c=z;
(%o1) z^2+c=z

Definiujemy drugie równanie ( t jest to kąt w obrotach ; 1 obrót = 360 stopni) :

(%i2) 2*z=%e^(2*t*%pi*%i);
(%o2) 2*z=%e^(2*%i*%pi*t)

Ponieważ 2 równanie ma tylko 1 zmienną eliminujemy zmienną z pierwszego równania :

(%i3) eliminate([%i1,%i2],[z]);
(%o3) [%e^(4*%i*%pi*t)-2*%e^(2*%i*%pi*t)+4*c]

Rozwiązujemy równanie  %o3 względem zmiennej c :

(%i4) solve([%e^(4*%i*%pi*t)-2*%e^(2*%i*%pi*t)+4*c], [c]);
(%o4) [c=-(%e^(4*%i*%pi*t)-2*%e^(2*%i*%pi*t))/4]

Definiujemy funkcję :

(%i34) define(c1(t),rhs(s[1]));
(%o34) c1(t):=-(%e^(4*%i*%pi*t)-2*%e^(2*%i*%pi*t))/4

Sprawdzamy działanie :

(%i35) c1(0);
(%o35) 1/4

Rysujemy wykres ( główny komponent zbioru Mandelbrota ) :

plot2d ([parametric, realpart(c1(t)), imagpart(c1(t)), [t,0,2*%pi],[nticks,2000]])$

[edytuj] Rysowanie

[edytuj] Rysowanie 1 funkcji

Definicja funkcji f1:

f1(x):=a*x*(1-x)$


Rysowanie funkcji y:=f1(x) w zakresie 0 <= x <=1:

plot2d(f1(x),[x,0,1]);


[edytuj] Rysowanie kilku funkcji na 1 wykresie

Definicja funkcji f1:

f1(x):=%pi/2;

Definicja funkcji f2:

f2(x):=-%pi/2;

Rysowanie:

plot2d([f1(x),f2(x),atan(x)],[x,-5,5],[plot_format, gnuplot]);
wykrs funkcji atan

Inny przykład:

plot2d([round(x),x,x*x,floor(x),ceiling(x),1/x,log(x)], [x,0,5],[y,0,5],[plot_format, gnuplot])$

[edytuj] plot2D

Dla niektórych funkcji f(x) typowa instrukcja:

plot2d (f(x), [x, 0, 1])

działa prawidłowo, dla innych daje błąd[1].

Rozwiązaniem jest wywołanie funkcji w postaci : '(f(x)) w liście argumentów plot2d. Przykłady:

f(x) := if x > 1 then 2/(x^2+1) else x^2$
plot2d ('(f(x)), [x, 0, 3])$
g(x) := quad_qag (t^2, t, 0, x, 2) [1]$
plot2d ('(g(x)), [x, -2, 2])$

W tych przykładach, jeśli użyjemy f(x) and g(x) bez znaku ' to pojawi się błąd.

Proszę zwrócić uwagę :

'(f(x)) 

nie

'f(x).

[edytuj] Rysowanie funkcji w różnych postaciach

Rysujemy koło o promieniu =1 i środku = 0

  • w postaci biegunowej:
load(draw);
draw2d(polar(1,theta,0,2*%pi));
  • w postaci parametrycznej:
plot2d ([parametric, cos(t), sin(t), [t,0,2*%pi],[nticks,80]])$
load(implicit_plot);
z:x+y*%i;
implicit_plot (abs(z) = 1, [x, -4, 4], [y, -4, 4]);

Rysujemy lemniscatę

  • w postaci uwikłanej :
load(implicit_plot);
z:x+y*%i;
f(n):=abs(z^n-1);
implicit_plot (f(4) = 1, [x, -2, 2], [y, -2, 2]);

[edytuj] Rysowanie zbioru punktów

Rysowanie punktów 2D. Grafika i kod żródłowy
  • tworzymy 2 listy :
    • xx z wartościami x
    • yy z wartościami yy
  • wyświetalmy listy używając procedury draw2d z pakietu draw
load(draw);
draw2d( points(xx,yy));

[edytuj] Rysowanie funkcji 2 zmiennych

plot3d(atan2(y,x), [x,-5,5], [y,-5,5], [plot_format,gnuplot])$
wykres funkcji atan2

[edytuj] Zapisywanie wykresu do pliku eps

W przypadku Windows plik będzie w katalogu c:\

plot2d([f1(x),f2(x)],[x,0,1],[gnuplot_term,ps], [gnuplot_out_file,"log.eps"]);


[edytuj] Biblioteki graficzne

[edytuj] Różnice między Maximą a innymi językami

[edytuj] Instrukcja for

W Maximie dozwolone jest użycie wartości niecałkowitych jako indeksów pętli for :

for x:0.5 step 0.001 thru 1.0 do


[edytuj] Źródła

  1. Maxima helpful hints. How do I plot a function which I defined?
W innych językach